fix(DevWeb): Resolve Login and Register functions

This commit is contained in:
Lucàs
2024-04-03 16:45:42 +02:00
parent ff7e2687c2
commit f45b477020
13 changed files with 154 additions and 167 deletions
@@ -48,7 +48,7 @@ public abstract class DAO<D> {
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see D * @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 * Met à jour le contenu correspondant à l'objet {@link D} sur le support persistant (l'objet
@@ -58,7 +58,7 @@ public abstract class DAO<D> {
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see D * @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} * Efface du support persistant le contenu équivalent à l'objet {@link D}
@@ -63,13 +63,13 @@ public class DAO_JPA_Game extends DAO<Game> {
} }
@Override @Override
public void create(Game data) throws DAOException { public Game create(Game data) throws DAOException {
update(data); return update(data);
} }
@Override @Override
public void update(Game data) throws DAOException { public Game update(Game data) throws DAOException {
entityManager.merge(data); return entityManager.merge(data);
} }
@Override @Override
@@ -57,13 +57,13 @@ public class DAO_JPA_Player extends DAO<Player> {
} }
@Override @Override
public void create(Player data) throws DAOException { public Player create(Player data) throws DAOException {
update(data); return update(data);
} }
@Override @Override
public void update(Player data) throws DAOException { public Player update(Player data) throws DAOException {
entityManager.merge(data); return entityManager.merge(data);
} }
@Override @Override
@@ -56,13 +56,13 @@ public class DAO_JPA_RecoveryPasswordToken extends DAO<RecoveryPasswordToken> {
} }
@Override @Override
public void create(RecoveryPasswordToken data) throws DAOException { public RecoveryPasswordToken create(RecoveryPasswordToken data) throws DAOException {
update(data); return update(data);
} }
@Override @Override
public void update(RecoveryPasswordToken data) throws DAOException { public RecoveryPasswordToken update(RecoveryPasswordToken data) throws DAOException {
entityManager.merge(data); return entityManager.merge(data);
} }
@Override @Override
@@ -56,13 +56,13 @@ public class DAO_JPA_User extends DAO<User> {
} }
@Override @Override
public void create(User data) throws DAOException { public User create(User data) throws DAOException {
update(data); return update(data);
} }
@Override @Override
public void update(User data) throws DAOException { public User update(User data) throws DAOException {
entityManager.merge(data); return entityManager.merge(data);
} }
@Override @Override
@@ -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;
}
}
@@ -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;
}
}
@@ -48,6 +48,7 @@ public class MainMenuServlet extends HttpServlet {
} }
for(HttpSession session : loginsSessions) { for(HttpSession session : loginsSessions) {
User connectedUser = (User) session.getAttribute("user"); User connectedUser = (User) session.getAttribute("user");
System.out.println(connectedUser.toString());
if(session.getServletContext().getContextPath().equals(request.getServletContext().getContextPath()) && connectedUser != null && !connectedUser.equals(sessionUser)) { if(session.getServletContext().getContextPath().equals(request.getServletContext().getContextPath()) && connectedUser != null && !connectedUser.equals(sessionUser)) {
connectedUsers.add(connectedUser); connectedUsers.add(connectedUser);
} }
@@ -7,9 +7,6 @@
package uppa.project.servlet.api.auth; package uppa.project.servlet.api.auth;
import com.google.gson.Gson; 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.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@@ -20,15 +17,17 @@ import java.io.PrintWriter;
import uppa.project.dao.DAO; import uppa.project.dao.DAO;
import uppa.project.dao.DAOException; import uppa.project.dao.DAOException;
import uppa.project.dao.jpa.Game_JPA_DAO_Factory; import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
import uppa.project.listener.SessionServletContextListener;
import uppa.project.pojo.User; 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") @WebServlet(name = "authLoginServlet", value = "/api/auth/login")
public class AuthLoginServlet extends HttpServlet { public class AuthLoginServlet extends HttpServlet {
private static class JsonRequest {
private String username;
private String password;
}
private final Gson gson = new Gson(); private final Gson gson = new Gson();
public void init() { public void init() {
@@ -47,41 +46,22 @@ public class AuthLoginServlet extends HttpServlet {
sb.append(line); sb.append(line);
} }
String requestBody = sb.toString(); 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 // Login User
if (loginRequest.getUsername() == null || loginRequest.getPassword() == null) { User user = loginUser(jsonRequest);
int STATUS = 400;
ErrorResponse error = new ErrorResponse(STATUS, "Bad Request", "Username and password are required");
response.setStatus(STATUS);
out.println(gson.toJson(error));
return;
}
// Get User from database matching the username and password // Set user in session
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
request.getSession().setAttribute("user", user); request.getSession().setAttribute("user", user);
SessionServletContextListener.addSession(request.getSession());
// Return the user as JSON out.println(gson.toJson(user));
LoginResponse loginResponse = new LoginResponse(200, user, request.getContextPath() + "/main-menu");
String json = gson.toJson(loginResponse);
out.println(json);
out.flush(); out.flush();
} }
private static User loginUser(LoginRequest loginRequest) { private static User loginUser(JsonRequest jsonRequest) {
String username = loginRequest.getUsername(); String username = jsonRequest.username;
String password = loginRequest.getPassword(); String password = jsonRequest.password;
Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory(); Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory();
try { try {
@@ -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<User> userDAO = jpaDaoFactory.getDAOUser();
User newUser = userDAO.create(user);
entityManager.getTransaction().commit();
return newUser;
} catch(DAOException e) {
entityManager.getTransaction().rollback();
return null;
}
}
public void destroy() {
}
}
@@ -7,20 +7,14 @@ loginForm.addEventListener("submit", (event) => {
const data = {}; const data = {};
formData.forEach((value, key) => data[key] = value); formData.forEach((value, key) => data[key] = value);
const action = loginForm.getAttribute("action") fetch(loginForm.getAttribute("action"), {
const method = loginForm.getAttribute("method")
fetch(action, {
headers: {"Content-Type": "application/json"}, headers: {"Content-Type": "application/json"},
body: JSON.stringify(data), body: JSON.stringify(data),
method, method: loginForm.getAttribute("method"),
}) })
.then(res => console.log(res)) .then(res => res.json())
//.then(data => { .then(d => window.location.href = "./main-menu")
// if (data.status === 200) window.location.href = data.redirect; .catch(error => console.error("Error:", error));
//})
.catch(error => console.error("Error:", error))
;
}); });
@@ -1,30 +1,21 @@
const registerForm = document.getElementById("register-form"); const registerForm = document.getElementById("register-form");
const confirmPassword = document.getElementById("confirmPassword"); const confirmPassword = document.getElementById("confirmPassword");
registerForm.addEventListener("submit", function (event) { registerForm.addEventListener("submit", (event) => {
event.preventDefault(); event.preventDefault();
const formData = new FormData(registerForm); const formData = new FormData(registerForm);
const data = {}; const data = {};
formData.forEach((value, key) => data[key] = value); formData.forEach((value, key) => data[key] = value);
const action = loginForm.getAttribute("action") fetch(registerForm.getAttribute("action"), {
const method = loginForm.getAttribute("method") method: registerForm.getAttribute("method"),
headers: {"Content-Type": "application/json"},
fetch("/reset-password", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data) body: JSON.stringify(data)
}).then(response => { })
if (response.ok) { .then(res => res.json())
window.location.href = "/login"; .then(_ => {
} else { window.location.href = "./login"
response.json().then(data => { })
alert(data.message); .catch(error => console.error("Error: " + error))
});
}
}).catch(error => console.error("Error:", error));
}); });
@@ -14,7 +14,7 @@
<div class="flex-column register-gap"> <div class="flex-column register-gap">
<div> <div>
<h1>Register</h1> <h1>Register</h1>
<form id="register-form" action="${pageContext.request.contextPath}/register" method="post"> <form id="register-form" action="${pageContext.request.contextPath}/api/auth/register" method="POST">
<label for="email">Email :</label> <label for="email">Email :</label>
<input type="email" id="email" name="email" required> <input type="email" id="email" name="email" required>