From f45b477020f8983f2e17a165bb905a83ba840042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= Date: Wed, 3 Apr 2024 16:45:42 +0200 Subject: [PATCH] fix(DevWeb): Resolve Login and Register functions --- .../src/main/java/uppa/project/dao/DAO.java | 4 +- .../uppa/project/dao/jpa/DAO_JPA_Game.java | 8 +- .../uppa/project/dao/jpa/DAO_JPA_Player.java | 8 +- .../jpa/DAO_JPA_RecoveryPasswordToken.java | 8 +- .../uppa/project/dao/jpa/DAO_JPA_User.java | 8 +- .../uppa/project/pojo/json/LoginRequest.java | 29 ----- .../uppa/project/pojo/json/LoginResponse.java | 54 --------- .../uppa/project/servlet/MainMenuServlet.java | 1 + .../servlet/api/auth/AuthLoginServlet.java | 50 +++------ .../servlet/api/auth/AuthRegisterServlet.java | 104 ++++++++++++++++++ .../main/webapp/WEB-INF/static/js/login.js | 16 +-- .../main/webapp/WEB-INF/static/js/register.js | 29 ++--- .../main/webapp/WEB-INF/views/register.jsp | 2 +- 13 files changed, 154 insertions(+), 167 deletions(-) delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginRequest.java delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginResponse.java create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java index 24b3392..5033597 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java @@ -48,7 +48,7 @@ public abstract class DAO { * @throws DAOException en cas de problème * @see D */ - public abstract void create(D data) throws DAOException; + public abstract D create(D data) throws DAOException; /** * Met à jour le contenu correspondant à l'objet {@link D} sur le support persistant (l'objet @@ -58,7 +58,7 @@ public abstract class DAO { * @throws DAOException en cas de problème * @see D */ - public abstract void update(D data) throws DAOException; + public abstract D update(D data) throws DAOException; /** * Efface du support persistant le contenu équivalent à l'objet {@link D} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java index f4717b0..4ef7fd3 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java @@ -63,13 +63,13 @@ public class DAO_JPA_Game extends DAO { } @Override - public void create(Game data) throws DAOException { - update(data); + public Game create(Game data) throws DAOException { + return update(data); } @Override - public void update(Game data) throws DAOException { - entityManager.merge(data); + public Game update(Game data) throws DAOException { + return entityManager.merge(data); } @Override diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java index 63f7406..e1cce19 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java @@ -57,13 +57,13 @@ public class DAO_JPA_Player extends DAO { } @Override - public void create(Player data) throws DAOException { - update(data); + public Player create(Player data) throws DAOException { + return update(data); } @Override - public void update(Player data) throws DAOException { - entityManager.merge(data); + public Player update(Player data) throws DAOException { + return entityManager.merge(data); } @Override diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java index 9e74e23..2ee6e7b 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java @@ -56,13 +56,13 @@ public class DAO_JPA_RecoveryPasswordToken extends DAO { } @Override - public void create(RecoveryPasswordToken data) throws DAOException { - update(data); + public RecoveryPasswordToken create(RecoveryPasswordToken data) throws DAOException { + return update(data); } @Override - public void update(RecoveryPasswordToken data) throws DAOException { - entityManager.merge(data); + public RecoveryPasswordToken update(RecoveryPasswordToken data) throws DAOException { + return entityManager.merge(data); } @Override diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java index 24e79fb..34289f2 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java @@ -56,13 +56,13 @@ public class DAO_JPA_User extends DAO { } @Override - public void create(User data) throws DAOException { - update(data); + public User create(User data) throws DAOException { + return update(data); } @Override - public void update(User data) throws DAOException { - entityManager.merge(data); + public User update(User data) throws DAOException { + return entityManager.merge(data); } @Override diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginRequest.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginRequest.java deleted file mode 100644 index 3ab2aca..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package uppa.project.pojo.json; - -public class LoginRequest { - - private String username; - private String password; - - public LoginRequest() {} - public LoginRequest(String username, String password) { - this.username = username; - this.password = password; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginResponse.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginResponse.java deleted file mode 100644 index f698b75..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/LoginResponse.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * LoginResponse.java, 20/03/2024 - * UPPA M1 TI 2023-2024 - * Pas de copyright, aucun droits - */ - -package uppa.project.pojo.json; - -import uppa.project.pojo.User; - -/** - * Classe représentant une réponse de connexion - * - * @author Kevin Mitresse - * @author Lucàs Vabre - */ -public class LoginResponse extends HttpResponse { - - /** - * Utilisateur connecté - */ - private final User user; - - /** - * L'url de redirection - */ - private final String redirect; - - /** - * Constructeur - * @param status code HTTP de la réponse - * @param user utilisateur connecté - * @param redirect url de redirection - */ - public LoginResponse(int status, User user, String redirect) { - super(status); - this.user = user; - this.redirect = redirect; - } - - /** - * @return l'utilisateur connecté - */ - public User getUser() { - return user; - } - - /** - * @return l'url de redirection - */ - public String getRedirect() { - return redirect; - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java index b2d5f09..64479a6 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java @@ -48,6 +48,7 @@ public class MainMenuServlet extends HttpServlet { } for(HttpSession session : loginsSessions) { User connectedUser = (User) session.getAttribute("user"); + System.out.println(connectedUser.toString()); if(session.getServletContext().getContextPath().equals(request.getServletContext().getContextPath()) && connectedUser != null && !connectedUser.equals(sessionUser)) { connectedUsers.add(connectedUser); } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java index d771d49..636c469 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java @@ -7,9 +7,6 @@ package uppa.project.servlet.api.auth; import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; @@ -20,15 +17,17 @@ import java.io.PrintWriter; import uppa.project.dao.DAO; import uppa.project.dao.DAOException; import uppa.project.dao.jpa.Game_JPA_DAO_Factory; +import uppa.project.listener.SessionServletContextListener; import uppa.project.pojo.User; -import uppa.project.pojo.json.ErrorResponse; -import uppa.project.pojo.json.LoginRequest; -import uppa.project.pojo.json.LoginResponse; -import uppa.project.utils.HttpRequestUtils; @WebServlet(name = "authLoginServlet", value = "/api/auth/login") public class AuthLoginServlet extends HttpServlet { + private static class JsonRequest { + private String username; + private String password; + } + private final Gson gson = new Gson(); public void init() { @@ -47,41 +46,22 @@ public class AuthLoginServlet extends HttpServlet { sb.append(line); } String requestBody = sb.toString(); - LoginRequest loginRequest = gson.fromJson(requestBody, LoginRequest.class); + JsonRequest jsonRequest = gson.fromJson(requestBody, JsonRequest.class); - // Check if the username and password are present - if (loginRequest.getUsername() == null || loginRequest.getPassword() == null) { - int STATUS = 400; - ErrorResponse error = new ErrorResponse(STATUS, "Bad Request", "Username and password are required"); - response.setStatus(STATUS); - out.println(gson.toJson(error)); - return; - } + // Login User + User user = loginUser(jsonRequest); - // Get User from database matching the username and password - User user = AuthLoginServlet.loginUser(loginRequest); - if (user == null) { - int STATUS = 401; - ErrorResponse error = new ErrorResponse(STATUS, "Unauthorized", "Invalid username or password"); - - response.setStatus(STATUS); - out.println(gson.toJson(error)); - return; - } - - // Set the user in the session + // Set user in session request.getSession().setAttribute("user", user); + SessionServletContextListener.addSession(request.getSession()); - // Return the user as JSON - LoginResponse loginResponse = new LoginResponse(200, user, request.getContextPath() + "/main-menu"); - String json = gson.toJson(loginResponse); - out.println(json); + out.println(gson.toJson(user)); out.flush(); } - private static User loginUser(LoginRequest loginRequest) { - String username = loginRequest.getUsername(); - String password = loginRequest.getPassword(); + private static User loginUser(JsonRequest jsonRequest) { + String username = jsonRequest.username; + String password = jsonRequest.password; Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory(); try { diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java new file mode 100644 index 0000000..03d6d3c --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java @@ -0,0 +1,104 @@ +/* + * RegisterApiServlet.java, 03/04/2024 + * UPPA M1 TI 2023-2024 + * Pas de copyright, aucun droits + */ + +package uppa.project.servlet.api.auth; + +import com.google.gson.Gson; +import jakarta.persistence.EntityManager; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; +import java.util.Locale; +import uppa.project.dao.DAO; +import uppa.project.dao.DAOException; +import uppa.project.pojo.User; +import uppa.project.dao.jpa.Game_JPA_DAO_Factory; +import uppa.project.provider.EntityManagerProvider; + +@WebServlet(name = "authRegisterServlet", value = "/api/auth/register") +public class AuthRegisterServlet extends HttpServlet { + + private class JsonRequest { + private String username; + private String password; + private String email; + private String birthdate; + + private String gender; + } + + private final Gson gson = new Gson(); + + public void init() {} + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + + // Get the json in the request body + StringBuilder sb = new StringBuilder(); + BufferedReader reader = request.getReader(); + String line; + while((line = reader.readLine()) != null) { + sb.append(line); + } + String requestBody = sb.toString(); + JsonRequest jsonRequest = gson.fromJson(requestBody, JsonRequest.class); + + // Create the user + User user = this.createUser(jsonRequest); + if (user == null) { + // TODO send error + return; + } + + out.println(gson.toJson(user)); + out.flush(); + } + + private User createUser(JsonRequest jsonRequest) { + + // Create a new User + User user = new User(); + user.setUsername(jsonRequest.username); + user.setPassword(jsonRequest.password); + user.setEmail(jsonRequest.email); + user.setGender(User.Gender.valueOf(jsonRequest.gender)); + + // convert the birthdate from String as YYYY-MM-DD to Date object) + LocalDate localDate = LocalDate.parse(jsonRequest.birthdate); + ZoneId defaultZoneId = ZoneId.systemDefault(); + Date date = Date.from(localDate.atStartOfDay(defaultZoneId).toInstant()); + user.setBirth(date); + + // Send the user to the database + EntityManager entityManager = EntityManagerProvider.getInstance(); + + entityManager.getTransaction().begin(); + try { + Game_JPA_DAO_Factory jpaDaoFactory = new Game_JPA_DAO_Factory(); + DAO userDAO = jpaDaoFactory.getDAOUser(); + + User newUser = userDAO.create(user); + entityManager.getTransaction().commit(); + return newUser; + } catch(DAOException e) { + entityManager.getTransaction().rollback(); + return null; + } + } + + public void destroy() { + } +} diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/login.js b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/login.js index c0e6465..c6d6bd6 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/login.js +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/login.js @@ -7,20 +7,14 @@ loginForm.addEventListener("submit", (event) => { const data = {}; formData.forEach((value, key) => data[key] = value); - const action = loginForm.getAttribute("action") - const method = loginForm.getAttribute("method") - - fetch(action, { + fetch(loginForm.getAttribute("action"), { headers: {"Content-Type": "application/json"}, body: JSON.stringify(data), - method, + method: loginForm.getAttribute("method"), }) - .then(res => console.log(res)) - //.then(data => { - // if (data.status === 200) window.location.href = data.redirect; - //}) - .catch(error => console.error("Error:", error)) - ; + .then(res => res.json()) + .then(d => window.location.href = "./main-menu") + .catch(error => console.error("Error:", error)); }); diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/register.js b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/register.js index 447b93a..6b14500 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/register.js +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/static/js/register.js @@ -1,30 +1,21 @@ const registerForm = document.getElementById("register-form"); const confirmPassword = document.getElementById("confirmPassword"); -registerForm.addEventListener("submit", function (event) { +registerForm.addEventListener("submit", (event) => { event.preventDefault(); const formData = new FormData(registerForm); const data = {}; formData.forEach((value, key) => data[key] = value); - const action = loginForm.getAttribute("action") - const method = loginForm.getAttribute("method") - - - fetch("/reset-password", { - method: "POST", - headers: { - "Content-Type": "application/json" - }, + fetch(registerForm.getAttribute("action"), { + method: registerForm.getAttribute("method"), + headers: {"Content-Type": "application/json"}, body: JSON.stringify(data) - }).then(response => { - if (response.ok) { - window.location.href = "/login"; - } else { - response.json().then(data => { - alert(data.message); - }); - } - }).catch(error => console.error("Error:", error)); + }) + .then(res => res.json()) + .then(_ => { + window.location.href = "./login" + }) + .catch(error => console.error("Error: " + error)) }); diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/register.jsp b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/register.jsp index 50e542e..bc39eed 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/register.jsp +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/register.jsp @@ -14,7 +14,7 @@

Register

-
+