diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..2c88a5598a37d7afc8a58e30f921c8a101c708d6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,56 @@ +{ + "java.project.sourcePaths": [ + "WEB-INF/src" + ], + "java.project.referencedLibraries": [ + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/websocket-client-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/websocket-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-websocket.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-util-scan.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-util.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-jni.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-jdbc.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-zh-CN.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-ru.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-pt-BR.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-ko.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-ja.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-fr.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-es.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-de.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-i18n-cs.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-dbcp.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-coyote-ffm.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-coyote.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/tomcat-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/stax2-api-4.2.2.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/servlet-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/postgresql-42.7.5.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/postgresql-42.2.16.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jsp-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jjwt-jackson-0.12.5.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jjwt-impl-0.12.5.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jjwt-api-0.12.5.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jaspic-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jasper-el.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jasper.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jakartaee-migration-1.0.9-shaded.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jakartaee-migration-1.0.8-shaded.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jackson-datatype-jsr310-2.13.0.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jackson-dataformat-xml-2.15.3.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jackson-databind-2.15.3.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jackson-core-2.15.3.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/jackson-annotations-2.15.3.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/el-api.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/ecj-4.27.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/commons-text-1.13.0.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/commons-lang3-3.17.0.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/catalina-tribes.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/catalina-storeconfig.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/catalina-ssi.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/catalina-ha.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/catalina-ant.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/catalina.jar", + "/home/infoetu/othemane.khachnane.etu/tomcat/lib/annotations-api.jar" + ] +} diff --git a/sae/META-INF/context.xml b/META-INF/context.xml similarity index 100% rename from sae/META-INF/context.xml rename to META-INF/context.xml diff --git a/WEB-INF/classes/controleur/Accueil.class b/WEB-INF/classes/controleur/Accueil.class new file mode 100644 index 0000000000000000000000000000000000000000..1a28c778be963150fd134e64f332347b3b53d4ab Binary files /dev/null and b/WEB-INF/classes/controleur/Accueil.class differ diff --git a/WEB-INF/classes/controleur/CreerFil.class b/WEB-INF/classes/controleur/CreerFil.class new file mode 100644 index 0000000000000000000000000000000000000000..68182c701dd8a0f5026c6dd3e090b40856ded113 Binary files /dev/null and b/WEB-INF/classes/controleur/CreerFil.class differ diff --git a/WEB-INF/classes/controleur/EnvoyerMessage.class b/WEB-INF/classes/controleur/EnvoyerMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..a85ec4e38e5a09c52765c899b4c08ee18966cc1d Binary files /dev/null and b/WEB-INF/classes/controleur/EnvoyerMessage.class differ diff --git a/WEB-INF/classes/controleur/Fil.class b/WEB-INF/classes/controleur/Fil.class new file mode 100644 index 0000000000000000000000000000000000000000..3ed1a7e3d82fe9b323a3251fdcfa8663664d9470 Binary files /dev/null and b/WEB-INF/classes/controleur/Fil.class differ diff --git a/WEB-INF/classes/controleur/GetFils.class b/WEB-INF/classes/controleur/GetFils.class new file mode 100644 index 0000000000000000000000000000000000000000..bd0897871fc8577c174b302be6485dcd1d0a94b2 Binary files /dev/null and b/WEB-INF/classes/controleur/GetFils.class differ diff --git a/WEB-INF/classes/controleur/Like.class b/WEB-INF/classes/controleur/Like.class new file mode 100644 index 0000000000000000000000000000000000000000..7a4d000115a1f13997a308fa51e77f975a22ee65 Binary files /dev/null and b/WEB-INF/classes/controleur/Like.class differ diff --git a/WEB-INF/classes/controleur/ListerFil.class b/WEB-INF/classes/controleur/ListerFil.class new file mode 100644 index 0000000000000000000000000000000000000000..2b87ced72d52b7cd0b0429fc1e91fa962be23a88 Binary files /dev/null and b/WEB-INF/classes/controleur/ListerFil.class differ diff --git a/WEB-INF/classes/controleur/Login.class b/WEB-INF/classes/controleur/Login.class new file mode 100644 index 0000000000000000000000000000000000000000..d41d887165f8658b7f4d0bb7ec25ce9a839d7bfe Binary files /dev/null and b/WEB-INF/classes/controleur/Login.class differ diff --git a/WEB-INF/classes/controleur/Logout.class b/WEB-INF/classes/controleur/Logout.class new file mode 100644 index 0000000000000000000000000000000000000000..47db334fd4f25652266583b20ac7307fa5ad19d7 Binary files /dev/null and b/WEB-INF/classes/controleur/Logout.class differ diff --git a/WEB-INF/classes/controleur/Register.class b/WEB-INF/classes/controleur/Register.class new file mode 100644 index 0000000000000000000000000000000000000000..3ad8ee7a3668bb5e3ee876f44783e5867731b463 Binary files /dev/null and b/WEB-INF/classes/controleur/Register.class differ diff --git a/WEB-INF/classes/controleur/SuivreFil.class b/WEB-INF/classes/controleur/SuivreFil.class new file mode 100644 index 0000000000000000000000000000000000000000..a300bccc79e70957f3d3a2d461ecbe356c26c148 Binary files /dev/null and b/WEB-INF/classes/controleur/SuivreFil.class differ diff --git a/WEB-INF/classes/modele/Abonnement.class b/WEB-INF/classes/modele/Abonnement.class new file mode 100644 index 0000000000000000000000000000000000000000..ee41e5d8f300de99d400c65350de040019988fdf Binary files /dev/null and b/WEB-INF/classes/modele/Abonnement.class differ diff --git a/WEB-INF/classes/modele/AbonnementDao.class b/WEB-INF/classes/modele/AbonnementDao.class new file mode 100644 index 0000000000000000000000000000000000000000..81902b953d1071f9235d21aa8cc166c1e97b8116 Binary files /dev/null and b/WEB-INF/classes/modele/AbonnementDao.class differ diff --git a/WEB-INF/classes/modele/DS.class b/WEB-INF/classes/modele/DS.class new file mode 100644 index 0000000000000000000000000000000000000000..0c876cb2214110b5d54f530a86c7693661d5ef41 Binary files /dev/null and b/WEB-INF/classes/modele/DS.class differ diff --git a/WEB-INF/classes/modele/FilDeDiscussion.class b/WEB-INF/classes/modele/FilDeDiscussion.class new file mode 100644 index 0000000000000000000000000000000000000000..af362b08855ab40f70ebaea35cdc9fc11329cb1a Binary files /dev/null and b/WEB-INF/classes/modele/FilDeDiscussion.class differ diff --git a/WEB-INF/classes/modele/FilDeDiscussionDAO.class b/WEB-INF/classes/modele/FilDeDiscussionDAO.class new file mode 100644 index 0000000000000000000000000000000000000000..e9ac7a035fe79dcdda1a830dc60a468eaae94523 Binary files /dev/null and b/WEB-INF/classes/modele/FilDeDiscussionDAO.class differ diff --git a/WEB-INF/classes/modele/Message.class b/WEB-INF/classes/modele/Message.class new file mode 100644 index 0000000000000000000000000000000000000000..cddf74058b4abd623ed0f2ef7127bfe249fc9f86 Binary files /dev/null and b/WEB-INF/classes/modele/Message.class differ diff --git a/WEB-INF/classes/modele/MessageDao.class b/WEB-INF/classes/modele/MessageDao.class new file mode 100644 index 0000000000000000000000000000000000000000..e6d70a20e4d89db61f707e4bd4d9e9ed44eb3272 Binary files /dev/null and b/WEB-INF/classes/modele/MessageDao.class differ diff --git a/WEB-INF/classes/modele/Utilisateur.class b/WEB-INF/classes/modele/Utilisateur.class new file mode 100644 index 0000000000000000000000000000000000000000..0f9e1d29260afe61797c09c56070ffccb66a82ed Binary files /dev/null and b/WEB-INF/classes/modele/Utilisateur.class differ diff --git a/WEB-INF/classes/modele/UtilisateurDao.class b/WEB-INF/classes/modele/UtilisateurDao.class new file mode 100644 index 0000000000000000000000000000000000000000..ec400bcf77f08c69a12bdf1fd4bdb55c1d6e6361 Binary files /dev/null and b/WEB-INF/classes/modele/UtilisateurDao.class differ diff --git a/WEB-INF/src/controleur/Accueil.java b/WEB-INF/src/controleur/Accueil.java new file mode 100644 index 0000000000000000000000000000000000000000..1524c2f3bcfe5c353fe7e94f3feff9e6bfe17497 --- /dev/null +++ b/WEB-INF/src/controleur/Accueil.java @@ -0,0 +1,25 @@ +package controleur; + +import java.io.IOException; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import org.apache.commons.text.StringEscapeUtils; + +@WebServlet("/accueil") +public class Accueil extends HttpServlet { + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession(false) == null || request.getSession().getAttribute("email") == null) { + response.sendRedirect(request.getContextPath() + "/login"); + return; + } + HttpSession session = request.getSession(); + String email = StringEscapeUtils.escapeHtml4((String) session.getAttribute("email")); + request.setAttribute("email", email); + request.getRequestDispatcher("/WEB-INF/vue/accueil.jsp").forward(request, response); + } +} diff --git a/sae/WEB-INF/src/controleur/CreerFil.java b/WEB-INF/src/controleur/CreerFil.java similarity index 100% rename from sae/WEB-INF/src/controleur/CreerFil.java rename to WEB-INF/src/controleur/CreerFil.java diff --git a/WEB-INF/src/controleur/EnvoyerMessage.java b/WEB-INF/src/controleur/EnvoyerMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..b9c7916827a0e0b5564b8c594d31960d493447db --- /dev/null +++ b/WEB-INF/src/controleur/EnvoyerMessage.java @@ -0,0 +1,72 @@ +package controleur; + +import jakarta.servlet.annotation.MultipartConfig; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.Part; +import modele.Message; +import modele.MessageDao; +import jakarta.servlet.ServletException; +import java.io.File; +import java.io.IOException; +import java.time.LocalDateTime; + +@WebServlet("/envoyerMessage") +@MultipartConfig( + maxFileSize = 1024 * 1024 * 5, + maxRequestSize = 1024 * 1024 * 10, + fileSizeThreshold = 0 // comme ça tous les fichiers qui sont normalement des images sont enregistrés sur le serveur +) +public class EnvoyerMessage extends HttpServlet { + private static final String UPLOAD_DIR = "uploads"; + + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) { + res.sendRedirect(req.getContextPath() + "/login"); + return; + } + req.getRequestDispatcher("/WEB-INF/vue/listeFil.jsp").forward(req, res); + } + + public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) { + res.sendRedirect(req.getContextPath() + "/login"); + return; + } + String email = (String) req.getSession().getAttribute("email"); + String message = req.getParameter("contenu"); + int filId = (int) req.getSession().getAttribute("filId"); + if (message == null || message.isEmpty()) { + return; + } + + Part filePart = req.getPart("file"); + String fileName = null; + if (filePart != null && filePart.getSize() > 0) { + fileName = getFileName(filePart); + String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIR; + File uploadDir = new File(uploadPath); + if (!uploadDir.exists()) { + uploadDir.mkdir(); + } + filePart.write(uploadPath + File.separator + fileName); + } + + Message m = new Message(-1, message, LocalDateTime.now(), filId, email, fileName); + MessageDao messageDao = new MessageDao(); + messageDao.create(m); + res.sendRedirect(req.getContextPath() + "/fil?id=" + filId); + } + + private String getFileName(Part part) { + String contentDisposition = part.getHeader("content-disposition"); + for (String cd : contentDisposition.split(";")) { + if (cd.trim().startsWith("filename")) { + return cd.substring(cd.indexOf('=') + 1).trim().replace("\"", ""); + } + } + return null; + } +} \ No newline at end of file diff --git a/sae/WEB-INF/src/controleur/Fil.java b/WEB-INF/src/controleur/Fil.java similarity index 100% rename from sae/WEB-INF/src/controleur/Fil.java rename to WEB-INF/src/controleur/Fil.java diff --git a/WEB-INF/src/controleur/GetFils.java b/WEB-INF/src/controleur/GetFils.java new file mode 100644 index 0000000000000000000000000000000000000000..f9fe82c5bb0991cf3814fc1b24b884d6df7668fc --- /dev/null +++ b/WEB-INF/src/controleur/GetFils.java @@ -0,0 +1,68 @@ +package controleur; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import modele.Abonnement; +import modele.AbonnementDao; +import modele.FilDeDiscussion; +import modele.FilDeDiscussionDAO; +import modele.Message; +import modele.MessageDao; + +//http GET http://localhost:8080/sae/getFils Cookie:"JSESSIONID=ton_session_id" --> F12>Storage>JSESSIONID + +@WebServlet("/getFils") +public class GetFils extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) { + res.sendRedirect(req.getContextPath() + "/login"); + return; + } + + String email = (String) req.getSession().getAttribute("email"); + AbonnementDao abonnementDao = new AbonnementDao(); + FilDeDiscussionDAO filDao = new FilDeDiscussionDAO(); + MessageDao messageDao = new MessageDao(); + + try { + List<Abonnement> abonnements = abonnementDao.findAbonnements(email); + List<FilDeDiscussion> fils = new ArrayList<>(); + Map<Integer, List<Message>> messagesMap = new HashMap<>(); + + for (Abonnement abonnement : abonnements) { + FilDeDiscussion fil = filDao.findById(abonnement.getIdFil()); + fils.add(fil); + List<Message> messages = messageDao.findByFil(fil.getId()); + messagesMap.put(fil.getId(), messages); + } + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + + Map<String, Object> jsonResponse = new HashMap<>(); + jsonResponse.put("fils", fils); + jsonResponse.put("messages", messagesMap); + + res.setContentType("application/json"); + res.getWriter().write(objectMapper.writeValueAsString(jsonResponse)); + } catch (Exception e) { + res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + res.getWriter().write("{\"error\":\"Une erreur est survenue lors de la récupération des données.\"}"); + } + } +} \ No newline at end of file diff --git a/WEB-INF/src/controleur/Like.java b/WEB-INF/src/controleur/Like.java new file mode 100644 index 0000000000000000000000000000000000000000..d268a999b87bb384070d5352756dfd269a472247 --- /dev/null +++ b/WEB-INF/src/controleur/Like.java @@ -0,0 +1,34 @@ +package controleur; + + +import java.io.IOException; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import modele.MessageDao; + +@WebServlet("/Like") +public class Like extends HttpServlet { + + @Override + protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + String userEmail = (String) req.getSession().getAttribute("email"); + if (userEmail == null) { + res.sendRedirect(req.getContextPath() + "/login"); + return; + } + + int messageId = Integer.parseInt(req.getParameter("messageId")); + MessageDao messageDao = new MessageDao(); + + if (messageDao.updateLike(messageId)) { + res.sendRedirect(req.getHeader("Referer")); + } else { + res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Erreur lors de la mise à jour du like."); + } + } + +} diff --git a/sae/WEB-INF/src/controleur/ListerFil.java b/WEB-INF/src/controleur/ListerFil.java similarity index 100% rename from sae/WEB-INF/src/controleur/ListerFil.java rename to WEB-INF/src/controleur/ListerFil.java diff --git a/WEB-INF/src/controleur/Login.java b/WEB-INF/src/controleur/Login.java new file mode 100644 index 0000000000000000000000000000000000000000..655e8dbb40cb8152949600a0c312e3086e607715 --- /dev/null +++ b/WEB-INF/src/controleur/Login.java @@ -0,0 +1,31 @@ +package controleur; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import modele.UtilisateurDao; +import jakarta.servlet.ServletException; +import java.io.IOException; +import org.apache.commons.text.StringEscapeUtils; + +@WebServlet("/login") +public class Login extends HttpServlet { + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + req.getRequestDispatcher("/WEB-INF/vue/login.jsp").forward(req, res); + } + + public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + String email = StringEscapeUtils.escapeHtml4(req.getParameter("email")); + String motdepasse = StringEscapeUtils.escapeHtml4(req.getParameter("motdepasse")); + UtilisateurDao udao = new UtilisateurDao(); + if (udao.check(email, motdepasse)) { + System.out.println("Connexion réussie"); + req.getSession().setAttribute("email", email); + res.sendRedirect(req.getContextPath() + "/accueil"); + } else { + System.out.println("Connexion échouée"); + res.sendRedirect(req.getContextPath() + "/login"); + } + } +} \ No newline at end of file diff --git a/sae/WEB-INF/src/controleur/Logout.java b/WEB-INF/src/controleur/Logout.java similarity index 100% rename from sae/WEB-INF/src/controleur/Logout.java rename to WEB-INF/src/controleur/Logout.java diff --git a/sae/WEB-INF/src/controleur/Register.java b/WEB-INF/src/controleur/Register.java similarity index 100% rename from sae/WEB-INF/src/controleur/Register.java rename to WEB-INF/src/controleur/Register.java diff --git a/sae/WEB-INF/src/controleur/SuivreFil.java b/WEB-INF/src/controleur/SuivreFil.java similarity index 100% rename from sae/WEB-INF/src/controleur/SuivreFil.java rename to WEB-INF/src/controleur/SuivreFil.java diff --git a/sae/WEB-INF/src/modele/Abonnement.java b/WEB-INF/src/modele/Abonnement.java similarity index 100% rename from sae/WEB-INF/src/modele/Abonnement.java rename to WEB-INF/src/modele/Abonnement.java diff --git a/sae/WEB-INF/src/modele/AbonnementDao.java b/WEB-INF/src/modele/AbonnementDao.java similarity index 100% rename from sae/WEB-INF/src/modele/AbonnementDao.java rename to WEB-INF/src/modele/AbonnementDao.java diff --git a/WEB-INF/src/modele/DS.java b/WEB-INF/src/modele/DS.java new file mode 100644 index 0000000000000000000000000000000000000000..f34509cee1b54bec3d01ee14d49f973f613189ac --- /dev/null +++ b/WEB-INF/src/modele/DS.java @@ -0,0 +1,29 @@ +package modele; + +import java.sql.Connection; +import java.sql.DriverManager; + +public class DS { + public static DS instance = new DS(); + + private DS() { + try { + Class.forName("org.postgresql.Driver"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + public Connection getConnection() { + String url = "jdbc:postgresql://psqlserv/but2"; + String login = "othemanekhachnaneetu"; + String pwd = "moi"; + Connection con = null; + try { + con = DriverManager.getConnection(url, login, pwd); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return con; + } +} \ No newline at end of file diff --git a/sae/WEB-INF/src/modele/FilDeDiscussion.java b/WEB-INF/src/modele/FilDeDiscussion.java similarity index 100% rename from sae/WEB-INF/src/modele/FilDeDiscussion.java rename to WEB-INF/src/modele/FilDeDiscussion.java diff --git a/sae/WEB-INF/src/modele/FilDeDiscussionDAO.java b/WEB-INF/src/modele/FilDeDiscussionDAO.java similarity index 100% rename from sae/WEB-INF/src/modele/FilDeDiscussionDAO.java rename to WEB-INF/src/modele/FilDeDiscussionDAO.java diff --git a/WEB-INF/src/modele/Message.java b/WEB-INF/src/modele/Message.java new file mode 100644 index 0000000000000000000000000000000000000000..4b743b48f9404f27207a14a5b1782e5bd2d6e4a3 --- /dev/null +++ b/WEB-INF/src/modele/Message.java @@ -0,0 +1,99 @@ +package modele; + +import java.time.LocalDateTime; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class Message { + private int id; + private String contenu; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime datePublication; + private int filId; + private String auteurEmail; + private String fileName; + private boolean likeCount; + + public Message() { + } + + public Message(int id, String contenu, LocalDateTime datePublication, int filId, String auteurEmail, + String fileName) { + this.id = id; + this.contenu = contenu; + this.datePublication = datePublication; + this.filId = filId; + this.auteurEmail = auteurEmail; + this.fileName = fileName; + this.likeCount = false; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getContenu() { + return contenu; + } + + public void setContenu(String contenu) { + this.contenu = contenu; + } + + public LocalDateTime getDatePublication() { + return datePublication; + } + + public void setDatePublication(LocalDateTime datePublication) { + this.datePublication = datePublication; + } + + public int getfilId() { + return filId; + } + + public void setFilId(int filId) { + this.filId = filId; + } + + public String getAuteurEmail() { + return auteurEmail; + } + + public void setAuteurEmail(String auteurEmail) { + this.auteurEmail = auteurEmail; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public boolean getLikeCount() { + return likeCount; + } + + public void setLikeCount(boolean likeCount) { + this.likeCount = likeCount; + } + + public String afficherLike() { + if (likeCount == true) { + return "Vous avez aimé ce message"; + } + return "Vous n'avez pas aimé ce message"; + } + + @Override + public String toString() { + return "Message{" + "id=" + id + ", contenu=" + contenu + ", datePublication=" + datePublication + ", filId=" + + filId + ", auteurEmail=" + auteurEmail + "like" + afficherLike() +'}'; + } +} diff --git a/WEB-INF/src/modele/MessageDao.java b/WEB-INF/src/modele/MessageDao.java new file mode 100644 index 0000000000000000000000000000000000000000..729a4df7f78feec2b99211756bda26f16790e17c --- /dev/null +++ b/WEB-INF/src/modele/MessageDao.java @@ -0,0 +1,143 @@ +package modele; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.List; +import java.util.ArrayList; + +public class MessageDao { + + public Message findMessage(int id) { + Message message = new Message(); + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM message WHERE id = ?"); + ps.setInt(1, id); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + message.setId(rs.getInt("id")); + message.setContenu(rs.getString("contenu")); + message.setDatePublication(rs.getTimestamp("datePublication").toLocalDateTime()); + message.setFilId(rs.getInt("filId")); + message.setAuteurEmail(rs.getString("auteurEmail")); + message.setFileName(rs.getString("fileName")); + message.setLikeCount(rs.getBoolean("likeCount")); + } else { + System.out.println("Message inexistant"); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return message; + } + + public List<Message> findAll() { + List<Message> messages = new ArrayList<>(); + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM message"); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Message message = new Message(); + message.setId(rs.getInt("id")); + message.setContenu(rs.getString("contenu")); + message.setDatePublication(rs.getTimestamp("datePublication").toLocalDateTime()); + message.setFilId(rs.getInt("filId")); + message.setAuteurEmail(rs.getString("auteurEmail")); + message.setFileName(rs.getString("fileName")); + message.setLikeCount(rs.getBoolean("likeCount")); + messages.add(message); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return messages; + } + + public List<Message> findByFil(int idFil) { + List<Message> messages = new ArrayList<>(); + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM message WHERE filId = ?"); + ps.setInt(1, idFil); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Message message = new Message(); + message.setId(rs.getInt("id")); + message.setContenu(rs.getString("contenu")); + message.setDatePublication(rs.getTimestamp("datePublication").toLocalDateTime()); + message.setFilId(rs.getInt("filId")); + message.setAuteurEmail(rs.getString("auteurEmail")); + message.setFileName(rs.getString("fileName")); + message.setLikeCount(rs.getBoolean("likeCount")); + messages.add(message); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return messages; + } + + public String findUserName(String email) { + String userName = ""; + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT nom FROM utilisateur WHERE email = ?"); + ps.setString(1, email); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + userName = rs.getString("nom"); + } else { + System.out.println("Utilisateur inexistant"); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return userName; + } + + public void delete(int id) { + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("DELETE FROM message WHERE id = ?"); + ps.setInt(1, id); + ps.executeUpdate(); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + public void create(Message message) { + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("INSERT INTO message (contenu, filid, auteuremail, fileName) VALUES (?, ?, ?, ?)"); + ps.setString(1, message.getContenu()); + ps.setInt(2, message.getfilId()); + ps.setString(3, message.getAuteurEmail()); + ps.setString(4, message.getFileName()); + ps.executeUpdate(); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + //cette methode permet de mettre a jour le nombre de like d'un message en fonction de l'action de l'utilisateur (like ou unlike) + public boolean updateLike(int id) { + try(Connection con = DS.instance.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT likeCount FROM message WHERE id = ?"); + ps.setInt(1, id); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + boolean currentLikeStatus = rs.getBoolean("likeCount"); + boolean newLikeStatus = !currentLikeStatus; + ps = con.prepareStatement("UPDATE message SET likeCount = ? WHERE id = ?"); + ps.setBoolean(1, newLikeStatus); + ps.setInt(2, id); + ps.executeUpdate(); + return true; + } else { + System.out.println("Message inexistant"); + return false; + } + } catch (Exception e) { + System.out.println(e.getMessage()); + return false; + } + } + +} diff --git a/sae/WEB-INF/src/modele/Utilisateur.java b/WEB-INF/src/modele/Utilisateur.java similarity index 100% rename from sae/WEB-INF/src/modele/Utilisateur.java rename to WEB-INF/src/modele/Utilisateur.java diff --git a/sae/WEB-INF/src/modele/UtilisateurDao.java b/WEB-INF/src/modele/UtilisateurDao.java similarity index 100% rename from sae/WEB-INF/src/modele/UtilisateurDao.java rename to WEB-INF/src/modele/UtilisateurDao.java diff --git a/WEB-INF/vue/accueil.jsp b/WEB-INF/vue/accueil.jsp new file mode 100644 index 0000000000000000000000000000000000000000..a8739e7b1ed332496c217eaa129b97b62dc0ad1b --- /dev/null +++ b/WEB-INF/vue/accueil.jsp @@ -0,0 +1,70 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="modele.UtilisateurDao" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Accueil</title> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> + <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> +</head> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> + <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> + <span class="sr-only">Open main menu</span> + <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /> + </svg> + <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> + </svg> + </button> + </div> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + <div class="hidden sm:block sm:ml-auto"> + <div class="flex space-x-4"> + <a href="<%= request.getContextPath() %>/logout" class="text-red-600 hover:bg-red-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Se déconnecter</a> + </div> + </div> + </div> + </div> + </div> + </nav> + <% UtilisateurDao udao=new UtilisateurDao(); String email=(String) session.getAttribute("email"); String + username=udao.findUtilisateur(email).getNom(); AbonnementDao adao=new AbonnementDao(); List<Abonnement> abonnements + = adao.findAbonnements(email); + FilDeDiscussionDAO fdao = new FilDeDiscussionDAO(); + %> + <div class="max-w-2xl mx-auto mt-12 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4">Bienvenue sur CampusTalk</h2> + <p class="mb-4">Bonjour, <%= username %> !</p> + <p class="mb-4">Vous êtes connecté en tant que <%= email %></p> + <a href="<%= request.getContextPath() %>/listerFil" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Voir les autres fils de discussion</a> + </div> + <div class="max-w-2xl mx-auto mt-8 p-6 bg-white rounded-lg shadow-md"> + <h3 class="text-xl font-bold mb-4">Vos abonnements</h3> + <ul class="list-disc pl-5"> + <% for (Abonnement abo : abonnements) { %> + <li class="mb-2"> + <a href="<%= request.getContextPath() %>/fil?id=<%= abo.getIdFil() %>" class="text-blue-500 hover:underline"> + <%= fdao.findById(abo.getIdFil()).getNom() %> + </a> + </li> + <% } %> + </ul> + </div> +</body> +</html> diff --git a/WEB-INF/vue/creerFil.jsp b/WEB-INF/vue/creerFil.jsp new file mode 100644 index 0000000000000000000000000000000000000000..6b141bef85a02b15e6c4fb052674ebb4042c97e8 --- /dev/null +++ b/WEB-INF/vue/creerFil.jsp @@ -0,0 +1,69 @@ +<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Créer un Fil de Discussion</title> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> + <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> +</head> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> + <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> + <span class="sr-only">Open main menu</span> + <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /> + </svg> + <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> + </svg> + </button> + </div> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + <div class="hidden sm:block sm:ml-auto"> + <div class="flex space-x-4"> + <a href="<%= request.getContextPath() %>/logout" class="text-red-600 hover:bg-red-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Se déconnecter</a> + </div> + </div> + </div> + </div> + </div> + </nav> + <div class="container mx-auto px-4 mt-4 text-center"> + <a href="<%= request.getContextPath() %>/listerFil" class="bg-blue-500 text-white px-4 py-2 rounded">Retour aux fils de discussion</a> + </div> + + <% if (request.getAttribute("error") != null) { %> + <div class="max-w-2xl mx-auto mt-4 p-4 bg-red-100 text-red-700 rounded-lg"> + <%= request.getAttribute("error") %> + </div> + <% } %> + + <div class="max-w-2xl mx-auto mt-8 p-6 bg-white rounded-lg shadow-md"> + <h1 class="text-2xl font-bold mb-4 text-center">Créer un nouveau fil de discussion</h1> + <form action="creerFil" method="post" class="mt-4"> + <div class="mb-4"> + <label for="nom" class="block text-gray-700 font-semibold">Nom du fil:</label> + <input type="text" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="nom" name="nom" required> + </div> + <div class="mb-4"> + <label for="createuremail" class="block text-gray-700 font-semibold">Email du créateur:</label> + <input type="email" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="createuremail" name="createuremail" required> + </div> + <div class="mb-4"> + <label for="description" class="block text-gray-700 font-semibold">Description:</label> + <textarea class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="description" name="description" rows="3" required></textarea> + </div> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">Créer</button> + </form> + </div> +</body> +</html> \ No newline at end of file diff --git a/WEB-INF/vue/fil.jsp b/WEB-INF/vue/fil.jsp new file mode 100644 index 0000000000000000000000000000000000000000..f2a447f42a92bedb450719dedade6f5dc3fccffa --- /dev/null +++ b/WEB-INF/vue/fil.jsp @@ -0,0 +1,126 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.Message" %> +<%@ page import="modele.MessageDao" %> +<%@ page import="java.util.List" %> +<%@ page import="java.time.LocalDateTime" %> +<%@ page import="java.time.format.DateTimeFormatter" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Fil de Discussion</title> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> + <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> + <style> + .message-container { + transition: background-color 0.3s ease; + } + .message-container:hover { + background-color: #f3f4f6; + } + .message-image { + max-width: 200px; + max-height: 200px; + object-fit: cover; + border-radius: 8px; + } + </style> +</head> +<body class="bg-gray-100 text-gray-900 font-sans"> + <nav class="bg-white shadow-md"> + <div class="container mx-auto px-4 py-2 flex justify-between items-center"> + <a class="text-xl font-bold" href="#">CampusTalk</a> + <div> + <a class="bg-red-500 text-white px-4 py-2 rounded" href="<%= request.getContextPath() %>/logout">Se déconnecter</a> + </div> + </div> + </nav> + + <div class="container mx-auto px-4 mt-4 text-center"> + <a href="<%= request.getContextPath() %>/accueil" class="bg-blue-500 text-white px-4 py-2 rounded">Retour</a> + </div> + + <% + int id = Integer.parseInt(request.getParameter("id")); + session.setAttribute("filId", id); + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + FilDeDiscussion fil = fddao.findById(id); + MessageDao mdao = new MessageDao(); + List<Message> messages = mdao.findByFil(id); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy 'à' HH:mm"); + %> + + <div class="container mx-auto px-4 mt-8"> + <div class="bg-white p-6 rounded-lg shadow-lg"> + <h2 class="text-2xl font-bold mb-4 text-center"><%= fil.getNom() %></h2> + <div class="overflow-y-auto max-h-96" id="messages-box"> + <% for (Message m : messages) { + LocalDateTime datePublication = m.getDatePublication(); + String formattedDate = (datePublication != null) ? datePublication.format(formatter) : "Date non disponible"; + %> + <div class="flex items-start mb-4 message-container"> + <div class="w-10 h-10 rounded-full overflow-hidden"> + <img src="https://www.gravatar.com/avatar/<%= m.getAuteurEmail().hashCode() %>?d=identicon&s=40" alt="Avatar"> + </div> + <div class="ml-4 bg-gray-200 p-4 rounded-lg"> + <h4 class="font-bold"><%= mdao.findUserName(m.getAuteurEmail()) %></h4> + <p class="text-sm text-gray-600"><%= formattedDate %></p> + <p class="mt-2"><%= m.getContenu() %></p> + <% if (m.getFileName() != null) { %> + <img src="<%= request.getContextPath() %>/uploads/<%= m.getFileName() %>" alt="Image" class="mt-2 message-image"> + <% } %> + <div class="mt-2 flex items-center"> + <form action="<%= request.getContextPath() %>/Like" method="post" class="mr-2"> + <input type="hidden" name="messageId" value="<%= m.getId() %>"> + <button type="submit" class="text-blue-500 hover:text-blue-700"> + <% if (m.getLikeCount()) { %> + ❤️ Enlever le like + <% } else { %> + 🤍 Like + <% } %> + </button> + </form> + </div> + </div> + </div> + <% } %> + </div> + + <div class="mt-6 bg-white p-6 rounded-lg shadow-lg"> + <form action="envoyerMessage" method="post" enctype="multipart/form-data"> + <div class="mb-4"> + <label for="contenu" class="block text-gray-700 font-semibold">Votre message :</label> + <textarea class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" id="contenu" name="contenu" rows="3" required></textarea> + </div> + <div class="mb-4"> + <label for="file" class="block text-gray-700 font-semibold">Ajouter une image :</label> + <div class="flex items-center"> + <input type="file" class="hidden" id="file" name="file"> + <label for="file" class="cursor-pointer bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors flex items-center"> + <svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path> + </svg> + Télécharger + </label> + </div> + </div> + <input type="hidden" name="filId" value="<%= id %>"> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors">Envoyer</button> + </form> + </div> + + </div> + </div> + + <script> + window.onload = function () { + let messagesBox = document.getElementById('messages-box'); + messagesBox.scrollTop = messagesBox.scrollHeight; + }; + </script> +</body> +</html> \ No newline at end of file diff --git a/WEB-INF/vue/listerFil.jsp b/WEB-INF/vue/listerFil.jsp new file mode 100644 index 0000000000000000000000000000000000000000..4754c082c73651c7015d820fd49e09bbb896d885 --- /dev/null +++ b/WEB-INF/vue/listerFil.jsp @@ -0,0 +1,82 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="modele.FilDeDiscussion" %> +<%@ page import="modele.FilDeDiscussionDAO" %> +<%@ page import="modele.AbonnementDao" %> +<%@ page import="modele.Abonnement" %> +<%@ page import="java.util.List" %> +<%@ page import="java.util.Set" %> +<%@ page import="java.util.HashSet" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Fils de Discussion</title> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> + <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> +</head> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> + <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> + <span class="sr-only">Open main menu</span> + <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" /> + </svg> + <svg class="hidden h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> + </svg> + </button> + </div> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + <div class="hidden sm:block sm:ml-auto"> + <div class="flex space-x-4"> + <a href="<%= request.getContextPath() %>/logout" class="text-red-600 hover:bg-red-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Se déconnecter</a> + </div> + </div> + </div> + </div> + </div> + </nav> + + <div class="container mx-auto px-4 mt-4 text-center"> + <a href="<%= request.getContextPath() %>/accueil" class="bg-blue-500 text-white px-4 py-2 rounded">Retour à l'accueil</a> + <a href="<%= request.getContextPath() %>/creerFil" class="bg-blue-500 text-white px-4 py-2 rounded">Créer un fil de discussion</a> + </div> + + <div class="max-w-2xl mx-auto mt-8 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4 text-center">Fils de Discussion</h2> + <p class="text-gray-700 mb-4 text-center">(auxquels vous n'êtes pas abonné)</p> + <% + String email = (String) session.getAttribute("email"); + AbonnementDao adao = new AbonnementDao(); + List<Abonnement> abonnements = adao.findAbonnements(email); + Set<Integer> abonnementsIds = new HashSet<>(); + for (Abonnement abonnement : abonnements) { + abonnementsIds.add(abonnement.getIdFil()); + } + + FilDeDiscussionDAO fddao = new FilDeDiscussionDAO(); + for (FilDeDiscussion f : fddao.findAll()) { + if (!abonnementsIds.contains(f.getId())) { + %> + <div class="mb-4 p-4 bg-gray-100 rounded-lg shadow-md"> + <h4 class="font-bold text-lg"><%= f.getNom() %></h4> + <% if (f.getDescription() != null) { %> + <p class="text-gray-700"><%= f.getDescription() %></p> + <% } %> + <a href="<%= request.getContextPath() %>/suivreFil?id=<%= f.getId() %>" class="bg-blue-500 text-white px-4 py-2 rounded mt-2 inline-block">Suivre</a> + </div> + <% + } + } + %> + </div> +</body> +</html> \ No newline at end of file diff --git a/WEB-INF/vue/login.jsp b/WEB-INF/vue/login.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c1328ac95f367d4fbed97fd541c4ac9ba02c5931 --- /dev/null +++ b/WEB-INF/vue/login.jsp @@ -0,0 +1,47 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Connexion</title> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> + <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> + <style> + body { + background-color: #f8f9fa; + } + </style> +</head> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + </div> + </div> + </div> + </nav> + <div class="max-w-md mx-auto mt-12 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4 text-center">Bienvenue sur CampusTalk</h2> + <form action="login" method="post"> + <div class="mb-4"> + <label for="email" class="block text-gray-700 font-semibold">Adresse e-mail</label> + <input type="email" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="email" id="email" placeholder="Entrez votre e-mail" required> + </div> + <div class="mb-4"> + <label for="motdepasse" class="block text-gray-700 font-semibold">Mot de passe</label> + <input type="password" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="motdepasse" id="motdepasse" placeholder="Entrez votre mot de passe" required> + </div> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">Se connecter</button> + </form> + <div class="text-center mt-3"> + <p>Vous n'avez pas de compte ? <a href="<%= request.getContextPath() %>/register" class="text-blue-500 hover:underline">S'inscrire</a></p> + </div> + </div> +</body> +</html> \ No newline at end of file diff --git a/WEB-INF/vue/register.jsp b/WEB-INF/vue/register.jsp new file mode 100644 index 0000000000000000000000000000000000000000..321f260d65f4815f0f3143457e47888a66de4139 --- /dev/null +++ b/WEB-INF/vue/register.jsp @@ -0,0 +1,51 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>CampusTalk - Inscription</title> + <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> + <link rel="shortcut icon" href="https://www.shareicon.net/data/2016/07/10/119195_chat_512x512.png"> +</head> +<body class="bg-gray-100"> + <nav class="bg-white shadow-md"> + <div class="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8"> + <div class="relative flex items-center justify-between h-16"> + <div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"> + <div class="flex-shrink-0"> + <a class="text-xl font-bold text-gray-800" href="#">CampusTalk</a> + </div> + </div> + </div> + </div> + </nav> + <div class="max-w-md mx-auto mt-12 p-6 bg-white rounded-lg shadow-md"> + <h2 class="text-2xl font-bold mb-4 text-center">Inscription</h2> + <% if (request.getAttribute("error") != null) { %> + <div class="bg-red-100 text-red-700 p-4 rounded-lg mb-4"> + <%= request.getAttribute("error") %> + </div> + <% request.removeAttribute("error"); } %> + <form action="register" method="post"> + <div class="mb-4"> + <label for="nom" class="block text-gray-700 font-semibold">Nom</label> + <input type="text" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="nom" id="nom" placeholder="Entrez votre nom" required> + </div> + <div class="mb-4"> + <label for="email" class="block text-gray-700 font-semibold">Adresse e-mail</label> + <input type="email" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="email" id="email" placeholder="Entrez votre e-mail" required> + </div> + <div class="mb-4"> + <label for="motdepasse" class="block text-gray-700 font-semibold">Mot de passe</label> + <input type="password" class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400" name="motdepasse" id="motdepasse" placeholder="Choisissez un mot de passe" required> + </div> + <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">S'inscrire</button> + </form> + <div class="text-center mt-3"> + <p>Vous avez déjà un compte ? <a href="<%= request.getContextPath() %>/login" class="text-blue-500 hover:underline">Se connecter</a></p> + </div> + </div> +</body> +</html> \ No newline at end of file diff --git a/lib/annotations-api.jar b/lib/annotations-api.jar deleted file mode 100644 index e303329a574d38d763cecc462489ca01abfa1ad6..0000000000000000000000000000000000000000 Binary files a/lib/annotations-api.jar and /dev/null differ diff --git a/lib/catalina-ant.jar b/lib/catalina-ant.jar deleted file mode 100644 index 76d7756c2db2c6099b9f662a0582fa5a71700f46..0000000000000000000000000000000000000000 Binary files a/lib/catalina-ant.jar and /dev/null differ diff --git a/lib/catalina-ha.jar b/lib/catalina-ha.jar deleted file mode 100644 index 20b638a5c1599b24e2ec1274ab3e2b21a439ab2d..0000000000000000000000000000000000000000 Binary files a/lib/catalina-ha.jar and /dev/null differ diff --git a/lib/catalina-ssi.jar b/lib/catalina-ssi.jar deleted file mode 100644 index 083ba8154b4b08958820e914ad7e76d201b33a2c..0000000000000000000000000000000000000000 Binary files a/lib/catalina-ssi.jar and /dev/null differ diff --git a/lib/catalina-storeconfig.jar b/lib/catalina-storeconfig.jar deleted file mode 100644 index 36551095a40f2996a2ed03dd1a18d38f5ea03f82..0000000000000000000000000000000000000000 Binary files a/lib/catalina-storeconfig.jar and /dev/null differ diff --git a/lib/catalina-tribes.jar b/lib/catalina-tribes.jar deleted file mode 100644 index 6a3c5011ccf906b6c72db584a6827022292d2cee..0000000000000000000000000000000000000000 Binary files a/lib/catalina-tribes.jar and /dev/null differ diff --git a/lib/catalina.jar b/lib/catalina.jar deleted file mode 100644 index d3dfc66537b1c2d1b6560871097ff38a6e834514..0000000000000000000000000000000000000000 Binary files a/lib/catalina.jar and /dev/null differ diff --git a/lib/commons-lang3-3.17.0.jar b/lib/commons-lang3-3.17.0.jar deleted file mode 100644 index f6486b4d7039f22ccf160c8d24ebac26f05bf0de..0000000000000000000000000000000000000000 Binary files a/lib/commons-lang3-3.17.0.jar and /dev/null differ diff --git a/lib/commons-text-1.13.0.jar b/lib/commons-text-1.13.0.jar deleted file mode 100644 index a8231464949d5e7fb71a14e044767ad1bfa4c27d..0000000000000000000000000000000000000000 Binary files a/lib/commons-text-1.13.0.jar and /dev/null differ diff --git a/lib/ecj-4.27.jar b/lib/ecj-4.27.jar deleted file mode 100644 index a8f827f350d0e9a47af6ef8e262af3dcc7e0c5f6..0000000000000000000000000000000000000000 Binary files a/lib/ecj-4.27.jar and /dev/null differ diff --git a/lib/el-api.jar b/lib/el-api.jar deleted file mode 100644 index 915158f3e459724c4c0f63e409e98d17fb4252dd..0000000000000000000000000000000000000000 Binary files a/lib/el-api.jar and /dev/null differ diff --git a/lib/jackson-annotations-2.15.3.jar b/lib/jackson-annotations-2.15.3.jar deleted file mode 100644 index 83a6e4ddaacd47fa06e8e464d9c7af645b53ff23..0000000000000000000000000000000000000000 Binary files a/lib/jackson-annotations-2.15.3.jar and /dev/null differ diff --git a/lib/jackson-core-2.15.3.jar b/lib/jackson-core-2.15.3.jar deleted file mode 100644 index f0c53d16aa074ab1bc97346eb7d3502ac0ecc03f..0000000000000000000000000000000000000000 Binary files a/lib/jackson-core-2.15.3.jar and /dev/null differ diff --git a/lib/jackson-databind-2.15.3.jar b/lib/jackson-databind-2.15.3.jar deleted file mode 100644 index b1a891a3a152ad0323b5fcbcbfa046aa8bd36d9a..0000000000000000000000000000000000000000 Binary files a/lib/jackson-databind-2.15.3.jar and /dev/null differ diff --git a/lib/jackson-dataformat-xml-2.15.3.jar b/lib/jackson-dataformat-xml-2.15.3.jar deleted file mode 100644 index 3335c21c73474ddb82564518b25c06120046985a..0000000000000000000000000000000000000000 Binary files a/lib/jackson-dataformat-xml-2.15.3.jar and /dev/null differ diff --git a/lib/jackson-datatype-jsr310-2.13.0.jar b/lib/jackson-datatype-jsr310-2.13.0.jar deleted file mode 100644 index aabe23dc082d45f8f47890e6a07001690f806437..0000000000000000000000000000000000000000 Binary files a/lib/jackson-datatype-jsr310-2.13.0.jar and /dev/null differ diff --git a/lib/jakartaee-migration-1.0.9-shaded.jar b/lib/jakartaee-migration-1.0.9-shaded.jar deleted file mode 100644 index 83d8075c971bf35a73ae2aea9ebc07bddf97e9de..0000000000000000000000000000000000000000 Binary files a/lib/jakartaee-migration-1.0.9-shaded.jar and /dev/null differ diff --git a/lib/jasper-el.jar b/lib/jasper-el.jar deleted file mode 100644 index 1f7d2759f92dc0867207385948859422ecc0876f..0000000000000000000000000000000000000000 Binary files a/lib/jasper-el.jar and /dev/null differ diff --git a/lib/jasper.jar b/lib/jasper.jar deleted file mode 100644 index 16eb31f8fa5f700800288f8e77be01758667a177..0000000000000000000000000000000000000000 Binary files a/lib/jasper.jar and /dev/null differ diff --git a/lib/jaspic-api.jar b/lib/jaspic-api.jar deleted file mode 100644 index 3c8d7ea22624fba0fd12a3f703f6c1a0467faac1..0000000000000000000000000000000000000000 Binary files a/lib/jaspic-api.jar and /dev/null differ diff --git a/lib/jsp-api.jar b/lib/jsp-api.jar deleted file mode 100644 index b2e108d3f650b5adede5001fd07fce1cf0bd7c7f..0000000000000000000000000000000000000000 Binary files a/lib/jsp-api.jar and /dev/null differ diff --git a/lib/postgresql-42.7.5.jar b/lib/postgresql-42.7.5.jar deleted file mode 100644 index 279942c19c49e7c3f28b07a0c11f99eef7041818..0000000000000000000000000000000000000000 Binary files a/lib/postgresql-42.7.5.jar and /dev/null differ diff --git a/lib/servlet-api.jar b/lib/servlet-api.jar deleted file mode 100644 index 90bb1bccbde89683d431df1c62e4be54e7b49277..0000000000000000000000000000000000000000 Binary files a/lib/servlet-api.jar and /dev/null differ diff --git a/lib/tomcat-api.jar b/lib/tomcat-api.jar deleted file mode 100644 index 900a9db0a869ec77a18787568ccc0aa4ac314dc6..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-api.jar and /dev/null differ diff --git a/lib/tomcat-coyote-ffm.jar b/lib/tomcat-coyote-ffm.jar deleted file mode 100644 index f28dc1bf8972488600c39374b061ccecf661c7d4..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-coyote-ffm.jar and /dev/null differ diff --git a/lib/tomcat-coyote.jar b/lib/tomcat-coyote.jar deleted file mode 100644 index 94094952696e7ab5a36e56011d5cf6f40eaaae07..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-coyote.jar and /dev/null differ diff --git a/lib/tomcat-dbcp.jar b/lib/tomcat-dbcp.jar deleted file mode 100644 index dc4dbb5aa6616e2a25797c1c4793b148c2fdea4f..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-dbcp.jar and /dev/null differ diff --git a/lib/tomcat-i18n-cs.jar b/lib/tomcat-i18n-cs.jar deleted file mode 100644 index a0d7a181588e58307a4810626052e3b0ff26bc56..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-cs.jar and /dev/null differ diff --git a/lib/tomcat-i18n-de.jar b/lib/tomcat-i18n-de.jar deleted file mode 100644 index 3ef9a694e86272dfe92b9a89014e989849305bb0..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-de.jar and /dev/null differ diff --git a/lib/tomcat-i18n-es.jar b/lib/tomcat-i18n-es.jar deleted file mode 100644 index 55306da32a46ce1a7724b96b5f17ae4d81cb0f24..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-es.jar and /dev/null differ diff --git a/lib/tomcat-i18n-fr.jar b/lib/tomcat-i18n-fr.jar deleted file mode 100644 index e7993ec98632fe97410a98377fca6a75a5c2e24a..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-fr.jar and /dev/null differ diff --git a/lib/tomcat-i18n-ja.jar b/lib/tomcat-i18n-ja.jar deleted file mode 100644 index 94f5d1cc1b3f2903320081dee7aa5d23760bf5a2..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-ja.jar and /dev/null differ diff --git a/lib/tomcat-i18n-ko.jar b/lib/tomcat-i18n-ko.jar deleted file mode 100644 index 75eb86e5fa88e9c785b502500bf34d0aa2cc6aac..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-ko.jar and /dev/null differ diff --git a/lib/tomcat-i18n-pt-BR.jar b/lib/tomcat-i18n-pt-BR.jar deleted file mode 100644 index 43dea11ba943851f494c11ad147676882031d046..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-pt-BR.jar and /dev/null differ diff --git a/lib/tomcat-i18n-ru.jar b/lib/tomcat-i18n-ru.jar deleted file mode 100644 index f9fe5c3625baec5556574bca31cfe2fcf62f9239..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-ru.jar and /dev/null differ diff --git a/lib/tomcat-i18n-zh-CN.jar b/lib/tomcat-i18n-zh-CN.jar deleted file mode 100644 index f20b2c50d9a55ef5dddfc5445f9d2fd864a6f715..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-i18n-zh-CN.jar and /dev/null differ diff --git a/lib/tomcat-jdbc.jar b/lib/tomcat-jdbc.jar deleted file mode 100644 index e22934191bd86c4b82c44205d962cea0d1d66c21..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-jdbc.jar and /dev/null differ diff --git a/lib/tomcat-jni.jar b/lib/tomcat-jni.jar deleted file mode 100644 index a2a35318a27c182250bfb51207b9aabe7a4fa2af..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-jni.jar and /dev/null differ diff --git a/lib/tomcat-util-scan.jar b/lib/tomcat-util-scan.jar deleted file mode 100644 index f28d0c310a3b314d55b16db62cbd004e8af6a825..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-util-scan.jar and /dev/null differ diff --git a/lib/tomcat-util.jar b/lib/tomcat-util.jar deleted file mode 100644 index ffcdea230cf5053cb0e90e1f4f22342d1d66f3e9..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-util.jar and /dev/null differ diff --git a/lib/tomcat-websocket.jar b/lib/tomcat-websocket.jar deleted file mode 100644 index 1371b33afdc2650919350b6a0bdf3f3154690522..0000000000000000000000000000000000000000 Binary files a/lib/tomcat-websocket.jar and /dev/null differ diff --git a/lib/websocket-api.jar b/lib/websocket-api.jar deleted file mode 100644 index 449147bee9a737aefce1aae6b67f1b672ff8ddef..0000000000000000000000000000000000000000 Binary files a/lib/websocket-api.jar and /dev/null differ diff --git a/lib/websocket-client-api.jar b/lib/websocket-client-api.jar deleted file mode 100644 index 22f38e825b487736759bfeb8a09667bb21995c64..0000000000000000000000000000000000000000 Binary files a/lib/websocket-client-api.jar and /dev/null differ diff --git a/script.sql b/script.sql deleted file mode 100644 index cad3f5425bf61419a9aeaef229ebfa9a1a17342f..0000000000000000000000000000000000000000 --- a/script.sql +++ /dev/null @@ -1,150 +0,0 @@ -DROP TABLE IF EXISTS Abonnement; -DROP TABLE IF EXISTS Message; -DROP TABLE IF EXISTS FilDeDiscussion; -DROP TABLE IF EXISTS Utilisateur; - -CREATE TABLE Utilisateur ( - email VARCHAR(100) UNIQUE NOT NULL, - nom VARCHAR(100) NOT NULL, - motDePasse VARCHAR(255) NOT NULL, - dateInscription TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT pk_utilisateur PRIMARY KEY (email) -); - -CREATE TABLE FilDeDiscussion ( - id SERIAL, - nom VARCHAR(100) NOT NULL, - dateCreation TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - createurEmail VARCHAR(100), - description TEXT, - CONSTRAINT pk_fil PRIMARY KEY (id), - CONSTRAINT fk_createur FOREIGN KEY (createurEmail) REFERENCES Utilisateur(email) - ON DELETE SET NULL -); - -CREATE TABLE Message ( - id SERIAL, - contenu TEXT NOT NULL, - datePublication TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - filId INTEGER, - auteurEmail VARCHAR(100), - fileName VARCHAR(255), - CONSTRAINT pk_message PRIMARY KEY (id), - CONSTRAINT fk_fil FOREIGN KEY (filId) REFERENCES FilDeDiscussion(id) - ON DELETE CASCADE, - CONSTRAINT fk_auteur FOREIGN KEY (auteurEmail) REFERENCES Utilisateur(email) - ON DELETE SET NULL -); - -CREATE TABLE Abonnement ( - utilisateurEmail VARCHAR(100), - filId INTEGER, - dateAbonnement TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT pk_abonnement PRIMARY KEY (utilisateurEmail, filId), - CONSTRAINT fk_utilisateur FOREIGN KEY (utilisateurEmail) REFERENCES Utilisateur(email) - ON DELETE CASCADE, - CONSTRAINT fk_fil FOREIGN KEY (filId) REFERENCES FilDeDiscussion(id) - ON DELETE CASCADE -); - --- Insertion des utilisateurs -INSERT INTO Utilisateur (email, nom, motDePasse) -VALUES -('utilisateur1@exemple.com', 'Utilisateur 1', MD5('motdepasse123')), -('utilisateur2@exemple.com', 'Utilisateur 2', MD5('motdepasse123')), -('utilisateur3@exemple.com', 'Utilisateur 3', MD5('motdepasse123')); - --- Insertion des fils de discussion -INSERT INTO FilDeDiscussion (nom, createurEmail, description) -VALUES -('Discussion Générale', 'utilisateur1@exemple.com', 'Un fil pour discuter de tout et de rien.'), -('Tech Talk', 'utilisateur2@exemple.com', 'Discussions sur les dernières technologies.'), -('Sports', 'utilisateur3@exemple.com', 'Discussions sur les sports et les événements sportifs.'); - --- Insertion des messages -INSERT INTO Message (contenu, filId, auteurEmail, fileName) VALUES -('Bonjour, ceci est mon premier message !', 1, 'utilisateur1@exemple.com', NULL), -('Quelquun a des nouvelles sur la dernière mise à jour de Java ?', 2, 'utilisateur2@exemple.com', NULL), -('Qui a regardé le match hier soir ?', 3, 'utilisateur3@exemple.com', NULL), -('Bienvenue à tous dans ce fil de discussion !', 1, 'utilisateur2@exemple.com', NULL), -('Je pense que la nouvelle version de Python est géniale.', 2, 'utilisateur3@exemple.com', NULL), -('Le match était incroyable, quelle performance !', 3, 'utilisateur1@exemple.com', NULL); - --- Insertion des abonnements -INSERT INTO Abonnement (utilisateurEmail, filId) -VALUES -('utilisateur1@exemple.com', 1), -('utilisateur1@exemple.com', 2), -('utilisateur2@exemple.com', 1), -('utilisateur2@exemple.com', 3), -('utilisateur3@exemple.com', 2), -('utilisateur3@exemple.com', 3); - --- Lister tous les utilisateurs : - --- SELECT * FROM Utilisateur; - --- Lister tous les fils de discussion avec le nom du créateur : - --- SELECT f.id, f.nom, u.nom AS nomCreateur --- FROM FilDeDiscussion f --- JOIN Utilisateur u ON f.createurEmail = u.email; - --- Lister tous les messages d'un fil de discussion spécifique avec le nom de l'auteur : - --- SELECT m.contenu, u.nom AS nomAuteur, m.datePublication --- FROM Message m --- JOIN Utilisateur u ON m.auteurEmail = u.email --- WHERE m.filId = 1 --- ORDER BY m.datePublication; - --- Lister tous les abonnements d'un utilisateur spécifique : - --- SELECT f.nom AS nomFil, a.dateAbonnement --- FROM Abonnement a --- JOIN FilDeDiscussion f ON a.filId = f.id --- WHERE a.utilisateurEmail = 'utilisateur1@exemple.com'; - --- Lister les fils de discussion auxquels un utilisateur n'est pas abonné : - --- SELECT f.id, f.nom --- FROM FilDeDiscussion f --- LEFT JOIN Abonnement a ON f.id = a.filId AND a.utilisateurEmail = 'utilisateur1@exemple.com' --- WHERE a.utilisateurEmail IS NULL; - --- Compter le nombre de messages par fil de discussion : - --- SELECT f.nom AS nomFil, COUNT(m.id) AS nombreMessages --- FROM FilDeDiscussion f --- LEFT JOIN Message m ON f.id = m.filId --- GROUP BY f.nom; - --- Trouver les utilisateurs qui ont publié des messages dans un fil spécifique : - --- SELECT DISTINCT u.nom, u.email --- FROM Utilisateur u --- JOIN Message m ON u.email = m.auteurEmail --- WHERE m.filId = 1; - --- Lister les 5 derniers messages publiés dans un fil de discussion : - --- SELECT m.contenu, u.nom AS nomAuteur, m.datePublication --- FROM Message m --- JOIN Utilisateur u ON m.auteurEmail = u.email --- WHERE m.filId = 1 --- ORDER BY m.datePublication DESC --- LIMIT 5; - --- Compter le nombre d'abonnés par fil de discussion : - --- SELECT f.nom AS nomFil, COUNT(a.utilisateurEmail) AS nombreAbonnes --- FROM FilDeDiscussion f --- LEFT JOIN Abonnement a ON f.id = a.filId --- GROUP BY f.nom; - --- Lister les utilisateurs qui ne sont abonnés à aucun fil de discussion : - --- SELECT u.email, u.nom --- FROM Utilisateur u --- LEFT JOIN Abonnement a ON u.email = a.utilisateurEmail --- WHERE a.utilisateurEmail IS NULL; \ No newline at end of file diff --git a/uploads/Abr.png b/uploads/Abr.png new file mode 100644 index 0000000000000000000000000000000000000000..104b2328ee7164628311b8ee28dc54376ec0b75d Binary files /dev/null and b/uploads/Abr.png differ