Skip to content
Snippets Groups Projects
Commit d553306a authored by Maxime Gosselin's avatar Maxime Gosselin
Browse files

Implémentation totale des likes

parent 29c8f0fb
No related branches found
No related tags found
No related merge requests found
...@@ -5,7 +5,9 @@ import jakarta.servlet.annotation.WebServlet; ...@@ -5,7 +5,9 @@ import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import modele.dao.DaoLike;
import modele.dao.DaoMessage; import modele.dao.DaoMessage;
import modele.dto.Like;
import modele.dto.Message; import modele.dto.Message;
import java.io.IOException; import java.io.IOException;
...@@ -41,6 +43,26 @@ public class MessageController extends HttpServlet { ...@@ -41,6 +43,26 @@ public class MessageController extends HttpServlet {
vue = "/WEB-INF/error.jsp"; vue = "/WEB-INF/error.jsp";
} }
break; 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: default:
vue = ""; vue = "";
} }
......
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;
}
}
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;
}
}
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
<%@ page import="modele.dao.DaoMessage" %> <%@ page import="modele.dao.DaoMessage" %>
<%@ page import="modele.dto.Message" %> <%@ page import="modele.dto.Message" %>
<%@ page import="modele.dao.DaoFollower" %> <%@ page import="modele.dao.DaoFollower" %>
<%@ page import="modele.dao.DaoLike" %>
<%@ page import="java.lang.Integer" %> <%@ page import="java.lang.Integer" %>
<%@ page import="java.lang.NumberFormatException" %> <%@ page import="java.lang.NumberFormatException" %>
<%@ page import="java.util.List" %> <%@ page import="java.util.List" %>
...@@ -15,6 +16,7 @@ ...@@ -15,6 +16,7 @@
DaoUser daoUser = new DaoUser(); DaoUser daoUser = new DaoUser();
DaoMessage daoMessage = new DaoMessage(); DaoMessage daoMessage = new DaoMessage();
DaoFollower daoFollower = new DaoFollower(); DaoFollower daoFollower = new DaoFollower();
DaoLike daoLike = new DaoLike();
%> %>
<% <%
...@@ -82,35 +84,36 @@ ...@@ -82,35 +84,36 @@
<div id="messages" class="container-lg" style="margin-top: 60px; margin-bottom: 85px;"> <div id="messages" class="container-lg" style="margin-top: 60px; margin-bottom: 85px;">
<% for (Message message : messages) { %> <% for (Message message : messages) {
String sender;
<% if (message.getSender().equals(user.getUsername())) {%> String color;
boolean userIsSender = message.getSender().equals(user.getUsername());
if (userIsSender) {
sender = "vous";
color = "primary";
} else {
sender = message.getSender();
color = "secondary";
} %>
<div id="me" class="row d-inline-block m-3"> <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> <label class="ms-3 fs-6 text-secondary">par <%=sender %>, le <%=message.getTime()%> à XXhXX</label>
<div class="p-3 border border-3 border-primary rounded-pill bg-primary-subtle"> <div class="p-3 border border-3 border-<%=color %> rounded-pill bg-<%=color %>-subtle">
<label><%=message.getMessage() %></label>
</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> <label><%=message.getMessage() %></label>
</div> </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> <br>
<% } %>
<% } } %>
<div id="input" class="fixed-bottom p-2 bg-white border-top border-2 border-dark"> <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%>"> <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 %>"> <a class="input-group-text link-primary" href="thread?action=open&id=<%=id %>">
<i class="bi-arrow-clockwise"></i> <i class="bi-arrow-clockwise"></i>
</a> </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"> <input type="submit" class="input-group-text" value="Envoyer">
</form> </form>
</div> </div>
......
DROP TABLE IF EXISTS likes;
DROP TABLE IF EXISTS followers; DROP TABLE IF EXISTS followers;
DROP TABLE IF EXISTS messages; DROP TABLE IF EXISTS messages;
DROP TABLE IF EXISTS threads; DROP TABLE IF EXISTS threads;
...@@ -39,3 +40,11 @@ CREATE TABLE messages ( ...@@ -39,3 +40,11 @@ CREATE TABLE messages (
FOREIGN KEY (id_thread) REFERENCES threads(id_thread) ON DELETE CASCADE 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
...@@ -66,3 +66,37 @@ INSERT INTO messages (sender, id_thread, message, time) VALUES ...@@ -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'), ('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'), ('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'); ('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);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment