diff --git a/WEB-INF/src/controleur/MessageController.java b/WEB-INF/src/controleur/MessageController.java index 2527e1b3a8101f8a0f372d44b29e54c50742dab3..c9fac8bbb58b43e25b45cd64781c64c0511f91b8 100644 --- a/WEB-INF/src/controleur/MessageController.java +++ b/WEB-INF/src/controleur/MessageController.java @@ -5,7 +5,9 @@ import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import modele.dao.DaoLike; import modele.dao.DaoMessage; +import modele.dto.Like; import modele.dto.Message; import java.io.IOException; @@ -41,6 +43,26 @@ public class MessageController extends HttpServlet { vue = "/WEB-INF/error.jsp"; } break; + + case "like": + try { + int idMessage = Integer.parseInt(req.getParameter("message")); + int idThread = Integer.parseInt(req.getParameter("thread")); + DaoLike daoLike = new DaoLike(); + Like like = new Like(username, idMessage); + + // Vérifier si l'utilisateur a déjà liké ce message + if (daoLike.isAlreadyLike(idMessage, username)) { + daoLike.delete(like); // Supprime le like + } else { + daoLike.create(like); // Ajoute le like + } + vue = "thread?action=open&id=" + idThread; + } catch (NumberFormatException exception) { + req.setAttribute("error", "Ne changez pas l'URL vous-même !"); + vue = "/WEB-INF/error.jsp"; + } + break; default: vue = ""; } diff --git a/WEB-INF/src/modele/dao/DaoLike.java b/WEB-INF/src/modele/dao/DaoLike.java new file mode 100644 index 0000000000000000000000000000000000000000..5458d23523be457df60b5ecd87f5c1f5cdd5f028 --- /dev/null +++ b/WEB-INF/src/modele/dao/DaoLike.java @@ -0,0 +1,100 @@ +package modele.dao; + +import modele.dto.Like; +import utils.DS; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class DaoLike { + + public List<Like> findAll() { + DS bdd = DS.getInstance(); + List<Like> likes = new ArrayList<>(); + try (Connection con = bdd.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM likes"); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + likes.add(new Like(rs.getString("username"), rs.getInt("id_message"))); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return likes; + } + + public void create(Like like) { + DS bdd = DS.getInstance(); + try (Connection con = bdd.getConnection()) { + PreparedStatement ps = con.prepareStatement("INSERT INTO likes VALUES (?, ?)"); + ps.setString(1, like.getUsername()); + ps.setInt(2, like.getIdMessage()); + ps.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public void delete(Like like) { + DS bdd = DS.getInstance(); + try (Connection con = bdd.getConnection()) { + PreparedStatement ps = con.prepareStatement("DELETE FROM likes WHERE username=? AND id_message=?"); + ps.setString(1, like.getUsername()); + ps.setInt(2, like.getIdMessage()); + ps.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public int countLikesByMessage(int idMessage) { + DS bdd = DS.getInstance(); + int count = 0; + try (Connection con = bdd.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) AS like_count FROM likes WHERE id_message = ?"); + ps.setInt(1, idMessage); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + count = rs.getInt("like_count"); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return count; + } + + public List<Like> findByUser(String username) { + DS bdd = DS.getInstance(); + List<Like> likes = new ArrayList<>(); + try (Connection con = bdd.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM likes WHERE username = ?"); + ps.setString(1, username); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + likes.add(new Like(rs.getString("username"), rs.getInt("id_message"))); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return likes; + } + + public boolean isAlreadyLike(int idMessage, String username){ + DS bdd = DS.getInstance(); + boolean res = false; + try (Connection con = bdd.getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM likes WHERE id_message = ? AND username = ?"); + ps.setInt(1, idMessage); + ps.setString(2, username); + ResultSet rs = ps.executeQuery(); + res = rs.next(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return res; + } +} diff --git a/WEB-INF/src/modele/dto/Like.java b/WEB-INF/src/modele/dto/Like.java new file mode 100644 index 0000000000000000000000000000000000000000..e2779757b5687c046ed7259a60718c9b7cd11b88 --- /dev/null +++ b/WEB-INF/src/modele/dto/Like.java @@ -0,0 +1,27 @@ +package modele.dto; + +public class Like { + private String username; + private int idMessage; + + public Like(String username, int idMessage) { + this.username = username; + this.idMessage = idMessage; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public int getIdMessage() { + return idMessage; + } + + public void setIdMessage(int idMessage) { + this.idMessage = idMessage; + } +} diff --git a/WEB-INF/vue/chat.jsp b/WEB-INF/vue/chat.jsp index f9f2545c0c11d0e86812fd933e1922700ceb5618..30c35571f4cdafa51e8117769943b98b1c324517 100644 --- a/WEB-INF/vue/chat.jsp +++ b/WEB-INF/vue/chat.jsp @@ -6,6 +6,7 @@ <%@ page import="modele.dao.DaoMessage" %> <%@ page import="modele.dto.Message" %> <%@ page import="modele.dao.DaoFollower" %> +<%@ page import="modele.dao.DaoLike" %> <%@ page import="java.lang.Integer" %> <%@ page import="java.lang.NumberFormatException" %> <%@ page import="java.util.List" %> @@ -15,6 +16,7 @@ DaoUser daoUser = new DaoUser(); DaoMessage daoMessage = new DaoMessage(); DaoFollower daoFollower = new DaoFollower(); + DaoLike daoLike = new DaoLike(); %> <% @@ -82,35 +84,36 @@ <div id="messages" class="container-lg" style="margin-top: 60px; margin-bottom: 85px;"> - <% for (Message message : messages) { %> + <% for (Message message : messages) { + String sender; + String color; + boolean userIsSender = message.getSender().equals(user.getUsername()); + if (userIsSender) { + sender = "vous"; + color = "primary"; + } else { + sender = message.getSender(); + color = "secondary"; + } %> - <% if (message.getSender().equals(user.getUsername())) {%> - - <div id="me" class="row d-inline-block m-3"> - <label class="ms-3 fs-6 text-secondary">par vous, le <%=message.getTime()%> à XXhXX</label> - <div class="p-3 border border-3 border-primary rounded-pill bg-primary-subtle"> - <label><%=message.getMessage() %></label> + <div id="me" class="row d-inline-block m-3"> + <label class="ms-3 fs-6 text-secondary">par <%=sender %>, le <%=message.getTime()%> à XXhXX</label> + <div class="p-3 border border-3 border-<%=color %> rounded-pill bg-<%=color %>-subtle"> + <label><%=message.getMessage() %></label> + </div> + <a href="message?action=like&message=<%=message.getId_message()%>&thread=<%=id%>"> + like + </a> + nombre de like : <%=daoLike.countLikesByMessage(message.getId_message())%> </div> - </div> - <br> - - <% } else { %> - - <div class="row d-inline-block m-3"> - <label class="ms-3 fs-6 text-secondary">par <%=message.getSender() %>, le <%=message.getTime()%> à XXhXX</label> - <div class="p-3 border border-3 border-secondary rounded-pill bg-secondary-subtle"> - <label><%=message.getMessage() %></label> - </div> - </div> - <br> - - <% } } %> + <br> + <% } %> <div id="input" class="fixed-bottom p-2 bg-white border-top border-2 border-dark"> <form class="input-group mb-3 container-lg" method="post" action="message?action=send&thread=<%=id%>"> <a class="input-group-text link-primary" href="thread?action=open&id=<%=id %>"> <i class="bi-arrow-clockwise"></i> </a> - <input name="message" class="form-control" value="Entrez votre message ici."> + <input name="message" class="form-control" placeholder="Entrez votre message ici."> <input type="submit" class="input-group-text" value="Envoyer"> </form> </div> diff --git a/baseDeDonnee/init.sql b/baseDeDonnee/init.sql index 175faf8abe9926548bac805ac1545ab4d684dbe5..70afc21cf52e6576da8c13f855f970c78a1edcc7 100644 --- a/baseDeDonnee/init.sql +++ b/baseDeDonnee/init.sql @@ -1,3 +1,4 @@ +DROP TABLE IF EXISTS likes; DROP TABLE IF EXISTS followers; DROP TABLE IF EXISTS messages; DROP TABLE IF EXISTS threads; @@ -39,3 +40,11 @@ CREATE TABLE messages ( FOREIGN KEY (id_thread) REFERENCES threads(id_thread) ON DELETE CASCADE ); +CREATE TABLE likes ( + username VARCHAR(24), + id_message INT, + + PRIMARY KEY (username, id_message), + FOREIGN KEY (username) REFERENCES users(username) ON DELETE CASCADE, + FOREIGN KEY (id_message) REFERENCES messages(id_message) ON DELETE CASCADE +); \ No newline at end of file diff --git a/baseDeDonnee/setup.sql b/baseDeDonnee/setup.sql index 695320243faca54af27894e5582d2dc1c5148139..0cc1c037dd1cf83c63ceb1b3c575f29d4eec461b 100644 --- a/baseDeDonnee/setup.sql +++ b/baseDeDonnee/setup.sql @@ -66,3 +66,37 @@ INSERT INTO messages (sender, id_thread, message, time) VALUES ('julien', 6, 'Qui vient à la soirée vendredi soir ?', '2023-11-26 18:00:00 +1:00'), ('florine', 6, 'Moi ! Ça commence à quelle heure ?', '2023-11-26 18:10:00 +1:00'), ('baptiste', 6, 'Je ramène des pizzas 🍕', '2023-11-26 18:15:00 +1:00'); + +-- Ajout de likes aux messages +INSERT INTO likes VALUES + -- Likes sur "Kakou Kakou" + ('florine', 1), + ('baptiste', 1), + ('lea', 1), + ('julien', 2), + + -- Likes sur "Banane Fromage Chips" + ('nath', 4), + ('baptiste', 4), + ('maxime', 5), + + -- Likes sur "Polybius67" + ('julien', 6), + ('florine', 6), + ('maxime', 7), + + -- Likes sur "Développement Web" + ('nath', 8), + ('julien', 8), + ('florine', 9), + + -- Likes sur "Les Memes de l'IUT" + ('maxime', 10), + ('nath', 10), + ('baptiste', 11), + + -- Likes sur "Soirée Étudiante" + ('lea', 12), + ('baptiste', 12), + ('maxime', 13), + ('florine', 14);