From d3490d5400e537fddd27d28e95d1583c58c77a12 Mon Sep 17 00:00:00 2001
From: Adrien <adrien.fryson@outlook.com>
Date: Sat, 15 Feb 2025 16:00:16 +0100
Subject: [PATCH] accueil, vue lister les fils de discussion et affichage d'un
 fil de discussion

---
 sae/WEB-INF/src/controleur/Accueil.java   | 23 ++++++
 sae/WEB-INF/src/controleur/Fil.java       | 19 +++++
 sae/WEB-INF/src/controleur/ListerFil.java | 19 +++++
 sae/WEB-INF/src/controleur/Login.java     |  1 +
 sae/WEB-INF/src/controleur/Logout.java    | 20 +++++
 sae/WEB-INF/src/modele/MessageDao.java    | 19 ++++-
 sae/WEB-INF/vue/accueil.jsp               | 45 +++++++++++
 sae/WEB-INF/vue/fil.jsp                   | 97 +++++++++++++++++++++++
 sae/WEB-INF/vue/listerFil.jsp             | 55 +++++++++++++
 9 files changed, 297 insertions(+), 1 deletion(-)
 create mode 100644 sae/WEB-INF/src/controleur/Accueil.java
 create mode 100644 sae/WEB-INF/src/controleur/Fil.java
 create mode 100644 sae/WEB-INF/src/controleur/ListerFil.java
 create mode 100644 sae/WEB-INF/src/controleur/Logout.java
 create mode 100644 sae/WEB-INF/vue/accueil.jsp
 create mode 100644 sae/WEB-INF/vue/fil.jsp
 create mode 100644 sae/WEB-INF/vue/listerFil.jsp

diff --git a/sae/WEB-INF/src/controleur/Accueil.java b/sae/WEB-INF/src/controleur/Accueil.java
new file mode 100644
index 0000000..532f6c3
--- /dev/null
+++ b/sae/WEB-INF/src/controleur/Accueil.java
@@ -0,0 +1,23 @@
+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;
+
+@WebServlet("/accueil")
+public class Accueil extends HttpServlet {
+
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        HttpSession session = request.getSession(false);
+        if (session != null && session.getAttribute("email") != null) {
+            request.getRequestDispatcher("/WEB-INF/vue/accueil.jsp").forward(request, response);
+        } else {
+            System.out.println("Accès refusé");
+            response.sendRedirect(request.getContextPath() + "/login");
+        }
+    }
+}
\ No newline at end of file
diff --git a/sae/WEB-INF/src/controleur/Fil.java b/sae/WEB-INF/src/controleur/Fil.java
new file mode 100644
index 0000000..7ae208e
--- /dev/null
+++ b/sae/WEB-INF/src/controleur/Fil.java
@@ -0,0 +1,19 @@
+package controleur;
+
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import java.io.IOException;
+
+@WebServlet("/fil")
+public class Fil extends HttpServlet {
+    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
+        // si la personne n'est pas abonnée à ce fil, on la redirige vers la page de liste des fils
+        // TODO
+        int id = Integer.parseInt(req.getParameter("id"));
+        req.setAttribute("id", id);
+        req.getRequestDispatcher("/WEB-INF/vue/fil.jsp").forward(req, res);
+    }
+}
diff --git a/sae/WEB-INF/src/controleur/ListerFil.java b/sae/WEB-INF/src/controleur/ListerFil.java
new file mode 100644
index 0000000..e4564ba
--- /dev/null
+++ b/sae/WEB-INF/src/controleur/ListerFil.java
@@ -0,0 +1,19 @@
+package controleur;
+
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import java.io.IOException;
+
+@WebServlet("/listerFil")
+public class ListerFil extends HttpServlet {
+    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/listerFil.jsp").forward(req, res);
+    }
+}
diff --git a/sae/WEB-INF/src/controleur/Login.java b/sae/WEB-INF/src/controleur/Login.java
index 9a62059..e79e718 100644
--- a/sae/WEB-INF/src/controleur/Login.java
+++ b/sae/WEB-INF/src/controleur/Login.java
@@ -4,6 +4,7 @@ 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 modele.UtilisateurDao;
 import jakarta.servlet.ServletException;
 import java.io.IOException;
diff --git a/sae/WEB-INF/src/controleur/Logout.java b/sae/WEB-INF/src/controleur/Logout.java
new file mode 100644
index 0000000..ad2c43f
--- /dev/null
+++ b/sae/WEB-INF/src/controleur/Logout.java
@@ -0,0 +1,20 @@
+package controleur;
+
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpSession;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import java.io.IOException;
+
+@WebServlet("/logout")
+public class Logout extends HttpServlet {
+    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
+        HttpSession session = req.getSession(false);
+        if (session != null) {
+            session.invalidate();
+        }
+        res.sendRedirect(req.getContextPath() + "/login");
+    }
+}
diff --git a/sae/WEB-INF/src/modele/MessageDao.java b/sae/WEB-INF/src/modele/MessageDao.java
index 8bc2f9e..97006a6 100644
--- a/sae/WEB-INF/src/modele/MessageDao.java
+++ b/sae/WEB-INF/src/modele/MessageDao.java
@@ -49,7 +49,7 @@ public class MessageDao {
         return messages;
     }
 
-    public List<Message> findMessages(int idFil) {
+    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 = ?");
@@ -69,4 +69,21 @@ public class MessageDao {
         }
         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;
+    }
 }
diff --git a/sae/WEB-INF/vue/accueil.jsp b/sae/WEB-INF/vue/accueil.jsp
new file mode 100644
index 0000000..e9df037
--- /dev/null
+++ b/sae/WEB-INF/vue/accueil.jsp
@@ -0,0 +1,45 @@
+<%@ 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 - Accueil</title>
+    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        body {
+            background-color: #f8f9fa;
+        }
+        .welcome-container {
+            max-width: 800px;
+            margin: 50px auto;
+            padding: 20px;
+            background-color: #ffffff;
+            border-radius: 10px;
+            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+        }
+        .welcome-container h2 {
+            margin-bottom: 20px;
+            font-weight: bold;
+        }
+    </style>
+</head>
+<body>
+    <div class="welcome-container">
+        <h2 class="text-center">Bienvenue sur CampusTalk</h2>
+        <p class="text-center">Bonjour, <%= session.getAttribute("email") %> !</p>
+        <p class="text-center">Vous êtes connecté en tant que <%= session.getAttribute("email") %></p>
+        <div class="text-center mt-4">
+            <a href="<%= request.getContextPath() %>/logout" class="btn btn-danger">Se déconnecter</a>
+        </div>
+    </div>
+    <button type="button" class="btn btn-primary mt-4 mx-auto d-block">
+        <a href="<%= request.getContextPath() %>/listerFil" style="color: white; text-decoration: none;">Voir les fils de discussion</a>
+    </button>
+
+    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
+    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/sae/WEB-INF/vue/fil.jsp b/sae/WEB-INF/vue/fil.jsp
new file mode 100644
index 0000000..e708b76
--- /dev/null
+++ b/sae/WEB-INF/vue/fil.jsp
@@ -0,0 +1,97 @@
+<%@ 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" %>
+
+<!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://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        body {
+            background-color: #f8f9fa;
+        }
+        .thread-container {
+            max-width: 800px;
+            margin: 50px auto;
+            padding: 20px;
+            background-color: #ffffff;
+            border-radius: 10px;
+            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+        }
+        .thread-container h2 {
+            margin-bottom: 20px;
+            font-weight: bold;
+        }
+        .message-item {
+            display: flex;
+            align-items: flex-start;
+            padding: 10px;
+            border-bottom: 1px solid #ddd;
+        }
+        .message-item:last-child {
+            border-bottom: none;
+        }
+        .avatar {
+            width: 50px;
+            height: 50px;
+            border-radius: 50%;
+            margin-right: 15px;
+        }
+        .message-content {
+            background-color: #e9ecef;
+            padding: 10px;
+            border-radius: 10px;
+            max-width: 600px;
+        }
+        .message-content h4 {
+            margin: 0;
+            font-size: 1.1em;
+            font-weight: bold;
+        }
+        .message-content p {
+            margin: 5px 0;
+        }
+        .message-date {
+            font-size: 0.8em;
+            color: #6c757d;
+        }
+    </style>
+</head>
+<body>
+    <div class="text-center mt-4">
+        <a href="<%= request.getContextPath() %>/listerFil" class="btn btn-primary">Retour</a>
+    </div>
+
+    <% 
+        int id = Integer.parseInt(request.getParameter("id"));
+        FilDeDiscussionDAO fddao = new FilDeDiscussionDAO();
+        FilDeDiscussion fil = fddao.findById(id);
+        MessageDao mdao = new MessageDao();
+        List<Message> messages = mdao.findByFil(id);
+    %>
+    
+    <div class="thread-container">
+        <h2 class="text-center"><%= fil.getNom() %></h2>
+        <% for (Message m : messages) { %>
+            <div class="message-item">
+                <!-- potentiellement une pdp -->
+                <div class="message-content">
+                    <h4><%= mdao.findUserName(m.getAuteurEmail()) %></h4>
+                    <p class="message-date"><%= m.getDatePublication() %></p>
+                    <p><%= m.getContenu() %></p>
+                </div>
+            </div>
+        <% } %>
+    </div>
+
+    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
+    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/sae/WEB-INF/vue/listerFil.jsp b/sae/WEB-INF/vue/listerFil.jsp
new file mode 100644
index 0000000..79f64af
--- /dev/null
+++ b/sae/WEB-INF/vue/listerFil.jsp
@@ -0,0 +1,55 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ page import="modele.FilDeDiscussion" %>
+<%@ page import="modele.FilDeDiscussionDAO" %>
+
+<!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://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        body {
+            background-color: #f8f9fa;
+        }
+        .thread-container {
+            max-width: 800px;
+            margin: 50px auto;
+            padding: 20px;
+            background-color: #ffffff;
+            border-radius: 10px;
+            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+        }
+        .thread-container h2 {
+            margin-bottom: 20px;
+            font-weight: bold;
+        }
+        .thread-item {
+            padding: 10px;
+            border-bottom: 1px solid #ddd;
+        }
+        .thread-item:last-child {
+            border-bottom: none;
+        }
+    </style>
+</head>
+<body>
+    <div class="thread-container">
+        <h2 class="text-center">Fils de Discussion</h2>
+        <%  
+            FilDeDiscussionDAO fddao = new FilDeDiscussionDAO();
+            for (FilDeDiscussion f : fddao.findAll()) {
+        %>
+            <div class="thread-item">
+                <h4><a href="<%= request.getContextPath() %>/fil?id=<%= f.getId() %>"><%= f.getNom() %></a></h4>
+                <!-- potentiellement mettre une description -->
+            </div>
+        <% } %>
+    </div>
+
+    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
+    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
+</body>
+</html>
\ No newline at end of file
-- 
GitLab