fix(DevWeb): Add Javadoc

This commit is contained in:
Lucàs
2024-03-20 17:18:44 +01:00
parent 6229718c4f
commit 07b5bdd926
18 changed files with 656 additions and 130 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
version: '2'
services:
db:
mysql-db:
image: mysql:latest
volumes:
- ./mysql:/docker-entrypoint-initdb.d
@@ -10,9 +10,19 @@ import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
/**
* Factory renvoyant une factory de DAO en fonction du support de persistance choisi
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public class AbstractDAOFactory {
/**
* Renvoie une factory de DAO en fonction du support de persistance choisi
*
* @param type le support de persistance
* @return la factory de DAO
* @see PersistenceKind
*/
public static GameDAOFactory getDAOFactory(PersistenceKind type) {
if (type.equals(PersistenceKind.JPA)) return new Game_JPA_DAO_Factory();
return null;
@@ -6,56 +6,86 @@
package uppa.project.dao;
import jakarta.persistence.TypedQuery;
import java.util.List;
import uppa.project.pojo.User;
import jakarta.persistence.EntityManager;
/**
* DAO abstrait et générique pour tout type de données
*
* @param <D> la classe paramétrant le DAO
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public abstract class DAO<D> {
public void DAO() throws DAOException {
/**
* Gestionnaire d'entités
*/
protected EntityManager entityManager;
/**
* Constructeur par défaut
*
* @throws DAOException si une erreur survient lors de la création du DAO
*/
public DAO() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance();
}
/**
* Retourne à partir du support de persistance un objet en fonction de son identifiant
* Retourne l'objet {@link D} en fonction de son identifiant
*
* @param id identifiant de l'objet
* @return l'instance de l'objet
* @return l'instance de l'objet {@link D}
* @throws DAOException en cas de problème
* @see D
*/
public abstract D findById(int id) throws DAOException;
/**
* Retourne tous les objets {@link D} paramétrant le DAO
*
* @return un tableau d'objets {@link D}
* @throws DAOException en cas de problème
* @see D
*/
public abstract D[] findAll() throws DAOException;
/**
* Rend persistant un objet qui n'avait pas encore de réprésentation sur le support de persistance
* Rend persistant un objet {@link D} qui n'avait pas encore de réprésentation sur le support de persistance
*
* @param data l'objet à rendre persistant
* @param data l'objet {@link D} à rendre persistant
* @throws DAOException en cas de problème
* @see D
*/
public abstract void create(D data) throws DAOException;
/**
* Met à jour le contenu correspondant à l'objet sur le support persistant (l'objet
* Met à jour le contenu correspondant à l'objet {@link D} sur le support persistant (l'objet
* avait déjà une représentation sur le support persistant)
*
* @param data l'objet modifié dont le contenu est à mettre à jour
* @param data l'objet {@link D} modifié dont le contenu est à mettre à jour
* @throws DAOException en cas de problème
* @see D
*/
public abstract void update(D data) throws DAOException;
/**
* Efface du support persistant le contenu équivalent à l'objet
* Efface du support persistant le contenu équivalent à l'objet {@link D}
*
* @param data l'objet à supprimer
* @param data l'objet {@link D} à supprimer
* @throws DAOException en cas de problème
* @see D
*/
public abstract void delete(D data) throws DAOException;
/**
* Retourne les objets {@link D} paramétrant le DAO en fonction d'un champ et d'une valeur
*
* @param field le champ à rechercher
* @param value la valeur à rechercher
* @return un tableau d'objets {@link D}
* @throws DAOException en cas de problème
* @see D
*/
public abstract D[] findByField(String field, String value) throws DAOException;
}
@@ -8,13 +8,25 @@ package uppa.project.dao;
/**
* Exception spécifique aux problèmes d'accès aux données via un DAO
*
* @author Kevin Mitressé
* @author Lucàs Vabre
* @see DAO
*/
public class DAOException extends Exception {
/**
* Constructeur par défaut
*/
public DAOException() {
super();
}
/**
* Constructeur avec message
*
* @param message le message de l'exception
*/
public DAOException(String message) {
super(message);
}
@@ -1,14 +1,27 @@
package uppa.project;
/*
* EntityManagerProvider.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
/**
* Fournisseur d'EntityManager
* Permet de récupérer une instance d'EntityManager
* pour les DAO
*
* @see jakarta.persistence.EntityManager
*/
public final class EntityManagerProvider {
private final static String PERSISTANCE_UNIT_NAME = "db";
private static EntityManager instance;
private static EntityManagerFactory factory;
private final static String PERSISTANCE_UNIT_NAME = "db";
public static EntityManager getInstance() {
if (factory == null) {
@@ -1,33 +1,41 @@
/*
* SportsDAOFactory.java, 09/02/2024
* GameDAOFactory.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao;
import uppa.project.pojo.*;
import uppa.project.pojo.Game;
import uppa.project.pojo.Player;
import uppa.project.pojo.User;
/**
* Fabrique abstraite de DAO pour le schéma sports
* Fabrique abstraite de DAO pour le schéma du jeu
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public abstract class GameDAOFactory {
/**
* @return le DAO pour la classe/table User
* @throws DAOException en cas de problème
* @see User
*/
public abstract DAO<User> getDAOUser() throws DAOException;
/**
* @return le DAO pour la classe/table Game
* @throws DAOException en cas de problème
* @see Game
*/
public abstract DAO<Game> getDAOGame() throws DAOException;
/**
* @return le DAO pour la classe/table Player
* @throws DAOException en cas de problème
* @see Player
*/
public abstract DAO<Player> getDAOPlayer() throws DAOException;
@@ -1,5 +1,5 @@
/*
* PersistenceKind.java, 09/02/2024
* PersistenceKind.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
@@ -8,7 +8,12 @@ package uppa.project.dao;
/**
* Type de support de persistance pour les données
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*
* @see AbstractDAOFactory
*/
public enum PersistenceKind {
JDBC, JPA, XML
JPA
}
@@ -1,30 +1,45 @@
/**
* DAO_JPA_Game.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao.jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.math.BigDecimal;
import java.util.List;
import uppa.project.EntityManagerProvider;
import uppa.project.dao.DAO;
import uppa.project.dao.DAOException;
import uppa.project.pojo.Game;
import uppa.project.pojo.User;
/**
* DAO pour les parties de jeu
*
* @author Kevin Mitressé
* @author Lucàs Vabre
* @see Game
* @see DAO
*/
public class DAO_JPA_Game extends DAO<Game> {
private final EntityManager entityManager;
/**
* Constructeur par défaut
*
* @throws DAOException si une erreur survient lors de la création du DAO
*/
public DAO_JPA_Game() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance();
super();
}
@Override
public Game findById(int id) throws DAOException {
Game result = entityManager.find(Game.class, new BigDecimal(id));
Game result = entityManager.find(Game.class, new BigDecimal(id));
entityManager.flush();
return result;
}
@Override
public Game[] findByField(String field, String value) throws DAOException {
TypedQuery<Game> query = entityManager.createQuery("SELECT u FROM Game u WHERE ?1=?2", Game.class);
query.setParameter(1, field);
@@ -1,21 +1,30 @@
/*
* DAO_JPA_Player.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao.jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.math.BigDecimal;
import java.util.List;
import uppa.project.EntityManagerProvider;
import uppa.project.dao.DAO;
import uppa.project.dao.DAOException;
import uppa.project.pojo.Player;
import uppa.project.pojo.User;
/**
* DAO pour les joueurs
*
* @author Kévin Mitresse
* @author Lucàs Vabre
* @see Player
* @see DAO
*/
public class DAO_JPA_Player extends DAO<Player> {
private final EntityManager entityManager;
public DAO_JPA_Player() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance();
super();
}
@Override
@@ -25,6 +34,7 @@ public class DAO_JPA_Player extends DAO<Player> {
return result;
}
@Override
public Player[] findByField(String field, String value) throws DAOException {
TypedQuery<Player> query = entityManager.createQuery("SELECT p FROM Player p WHERE ?1=?2", Player.class);
query.setParameter(1, field);
@@ -1,20 +1,30 @@
/*
* DAO_JPA_User.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao.jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.math.BigDecimal;
import java.util.List;
import uppa.project.dao.DAO;
import uppa.project.dao.DAOException;
import uppa.project.EntityManagerProvider;
import uppa.project.pojo.User;
/**
* DAO pour les utilisateurs
*
* @author Kévin Mitresse
* @author Lucàs Vabre
* @see User
* @see DAO
*/
public class DAO_JPA_User extends DAO<User> {
private final EntityManager entityManager;
public DAO_JPA_User() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance();
super();
}
@Override
@@ -13,13 +13,26 @@ import uppa.project.dao.GameDAOFactory;
/**
* Fabrique concrète de DAO pour le schéma relationnel sports avec une implémentation en JDBC.
*
* @author Kevin Mitressé
* @author Lucàs Vabre
* @see GameDAOFactory
*/
public class Game_JPA_DAO_Factory extends GameDAOFactory {
/**
* DAO pour les utilisateurs
*/
private DAO_JPA_User daoUser = null;
/**
* DAO pour les parties
*/
private DAO_JPA_Game daoGame = null;
/**
* DAO pour les joueurs
*/
private DAO_JPA_Player daoPlayer = null;
@Override
@@ -1,29 +1,63 @@
/*
* Card.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo;
/**
* Représentation d'une carte
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public class Card {
/**
* The color of the card:
* Heart -> Coeur
* Clubs -> Trèfle
* Spades -> Pique
* Diamonds -> Carreau
* Couleurs disponibles pour les cartes
*/
public enum Color{HEART, CLUBS, SPADES, DIAMONDS}
/**
* Valeurs disponibles pour les cartes
*/
public enum Value{ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING}
/**
* Couleur de la carte
*/
private final Color color;
/**
* Valeur de la carte
*/
private final Value value;
/**
* Constructeur par défaut
*
* @param color couleur de la carte
* @param value valeur de la carte
*
* @see Color
* @see Value
*/
public Card(Color color, Value value) {
this.color = color;
this.value = value;
}
/**
* @return la couleur de la carte
*/
public Color getColor() {
return color;
}
/**
* @return la valeur de la carte
*/
public Value getValue() {
return value;
}
@@ -1,3 +1,9 @@
/*
* Deck.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo;
import java.util.ArrayList;
@@ -6,26 +12,81 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Représentation d'un paquet de cartes
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public class Deck {
/**
* Ensemble de cartes du paquet
* @see Card
*/
private Set<Card> cards;
public Deck(int nbColors, int nbValues){
cards = new HashSet<>();
initializeDeck(nbColors, nbValues);
shuffleDeck();
/**
* Constructeur par défaut
*
* @param nbColors nombre de couleurs (doit être compris entre 1 et le nombre de couleurs de {@link Card.Color})
* @param nbValues nombre de valeurs (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @see Card.Color
* @see Card.Value
*/
public Deck(int nbColors, int nbValues) {
cards = initializeDeck(nbColors, nbValues);
}
private void initializeDeck(int nbColors, int nbValues){
/**
* Créé un paquet de cartes mélangé avec un nombre de couleurs et de valeurs donné
*
* @param nbColors nombre de couleurs (doit être compris entre 1 et le nombre de couleurs de {@link Card.Color})
* @param nbValues nombre de valeurs (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @return un ensemble de cartes mélangées
*/
private static Set<Card> initializeDeck(int nbColors, int nbValues) {
Set<Card> cards = createSetOfCard(nbColors, nbValues);
return shuffleSetOfCard(cards);
}
/**
* Créé un ensemble de cartes avec un nombre de couleurs et de valeurs donné
*
* @param nbColors nombre de couleurs à utiliser pour créer les cartes (doit être compris entre 1 et le nombre de couleurs de {@link Card.Color})
* @param nbValues nombre de valeurs à utiliser pour créer les cartes (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @see Card.Color
* @see Card.Value
* @throws IllegalArgumentException si le nombre de couleurs ou de valeurs est incorrect
* @return un ensemble de cartes
*/
private static Set<Card> createSetOfCard(int nbColors, int nbValues) throws IllegalArgumentException {
Set<Card> cards = new HashSet<>();
if (nbColors < 1 || nbColors > Card.Color.values().length) {
throw new IllegalArgumentException("Le nombre de couleurs doit être compris entre 1 et " + Card.Color.values().length);
}
if (nbValues < 1 || nbValues > Card.Value.values().length) {
throw new IllegalArgumentException("Le nombre de valeurs doit être compris entre 1 et " + Card.Value.values().length);
}
for (int i = 0; i < nbColors; i++) {
for (int j = 0; j < nbValues; j++) {
cards.add(new Card(Card.Color.values()[i], Card.Value.values()[j]));
}
}
return cards;
}
private void shuffleDeck() {
/**
* Mélange les cartes d'un paquet
*
* @param cards ensemble de cartes à mélanger
* @return un ensemble de cartes mélangées
*/
private static HashSet<Card> shuffleSetOfCard(Set<Card> cards) {
List<Card> cardList = new ArrayList<>(cards);
Collections.shuffle(cardList);
cards = new HashSet<>(cardList);
return new HashSet<>(cardList);
}
}
@@ -1,3 +1,9 @@
/*
* Game.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo;
import jakarta.persistence.CascadeType;
@@ -15,11 +21,16 @@ import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Objects;
import java.util.Set;
/**
* Représentation d'une partie de jeu
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
@Entity
@Table(name = "game")
public class Game implements Serializable {
@@ -30,25 +41,42 @@ public class Game implements Serializable {
private BigDecimal id;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="created_at")
@Column(name = "created_at")
private Date createdAt;
@Column(name = "difficulty")
@Enumerated(EnumType.STRING)
private User.Gender difficulty;
private Difficulty difficulty;
@OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> players;
/**
* Constructeur par défaut
*/
public Game() {
}
public Game(User.Gender difficulty) {
/**
* Constructeur avec la difficulté
*
* @param difficulty la difficulté de la partie
* @see Difficulty
*/
public Game(Difficulty difficulty) {
this.difficulty = difficulty;
}
public Game(BigDecimal id, Date createdAt, User.Gender difficulty, Set<Player> players) {
/**
* Constructeur d'une partie de jeu
*
* @param id l'identifiant de la partie
* @param createdAt la date de création de la partie
* @param difficulty la difficulté de la partie
* @param players les joueurs de la partie
*/
public Game(BigDecimal id, Date createdAt, Difficulty difficulty, Set<Player> players) {
this.id = id;
this.createdAt = createdAt;
this.difficulty = difficulty;
@@ -59,41 +87,68 @@ public class Game implements Serializable {
public int hashCode() {
return Objects.hash(id, createdAt, players);
}
/**
* @return l'identifiant de la partie
*/
public BigDecimal getId() {
return id;
}
/**
* @return la date de création de la partie
*/
public Date getCreatedAt() {
return createdAt;
}
public User.Gender getDifficulty() {
/**
* @return la difficulté de la partie
*/
public Difficulty getDifficulty() {
return difficulty;
}
public void setDifficulty(User.Gender difficulty) {
/**
* @param difficulty la nouvelle difficulté de la partie
* @see Difficulty
*/
public void setDifficulty(Difficulty difficulty) {
this.difficulty = difficulty;
}
/**
* @return les joueurs de la partie
*/
public Set<Player> getPlayers() {
return players;
}
/**
* Modifie les joueurs de la partie
*
* @param players les nouveaux joueurs
*/
public void setPlayers(Set<Player> players) {
this.players = players;
}
public void addPlayers(Player player) {
/**
* Ajoute un joueur à la partie
*
* @param player le joueur à ajouter
*/
public void addPlayer(Player player) {
this.players.add(player);
}
@Override
public String toString() {
return String.format("Game{id=%s, createdAt=%s, players=%s}", id.toString(), createdAt, players);
}
public static enum difficulty {EASY, HARD}
/**
* Difficulté possible d'une partie
*/
public enum Difficulty {EASY, HARD}
}
@@ -1,3 +1,9 @@
/*
* Player.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo;
import jakarta.persistence.Column;
@@ -12,6 +18,12 @@ import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Objects;
/**
* Représentation d'un joueur
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
@Entity
@Table(name = "player")
public class Player implements Serializable {
@@ -44,10 +56,16 @@ public class Player implements Serializable {
@Column(name = "rapid_click_count")
private int rapidClickCount;
public Player() {
}
/**
* Constructeur par défaut
*/
public Player() {}
/**
* Constructeur d'un joueur
* @param game la partie de jeu
* @param user l'utilisateur
*/
public Player(Game game, User user) {
this.game = game;
this.user = user;
@@ -58,6 +76,16 @@ public class Player implements Serializable {
this.rapidClickCount = 0;
}
/**
* Constructeur d'un joueur
* @param game la partie de jeu
* @param user l'utilisateur
* @param score le score
* @param winner si le joueur est gagnant
* @param clickCount le nombre de clics
* @param rightClickCount le nombre de clics corrects
* @param rapidClickCount le nombre de clics rapides
*/
public Player(Game game, User user, int score, boolean winner, int clickCount, int rightClickCount, int rapidClickCount) {
this.game = game;
this.user = user;
@@ -73,71 +101,140 @@ public class Player implements Serializable {
return Objects.hash(game, user, score, winner, clickCount, rightClickCount, rapidClickCount);
}
/**
* @return La partie de jeu du joueur
*/
public Game getGame() {
return game;
}
/**
* Modifie la partie de jeu du joueur
*
* @param game le nouveau jeu
*/
public void setGame(Game game) {
this.game = game;
}
/**
* @return l'utilisateur
*/
public User getUser() {
return user;
}
/**
* Modifie l'utilisateur
*
* @param user le nouvel utilisateur
*/
public void setUser(User user) {
this.user = user;
}
/**
* @return l'identifiant
*/
public int getScore() {
return score;
}
/**
* Modifie le score
*
* @param score le nouveau score
*/
public void setScore(int score) {
this.score = score;
}
/**
* Ajoute des points au score
*
* @param points les points à ajouter
*/
public void updateScore(int points) { this.score += points; }
/**
* @return si le joueur est gagnant
*/
public boolean isWinner() {
return winner;
}
/**
* Déclare le joueur comme gagnant
*/
public void setWinner() {
this.winner = true;
}
/**
* @return le nombre de clics
*/
public int getClickCount() {
return clickCount;
}
/**
* Modifie le nombre de clics
*
* @param clickCount le nouveau nombre de clics
*/
public void setClickCount(int clickCount) {
this.clickCount = clickCount;
}
/**
* Incrémente de 1 le nombre de clics
*/
public void incrementClickCount() {
clickCount++;
}
/**
* @return le nombre de clics corrects
*/
public int getRightClickCount() {
return rightClickCount;
}
/**
* Modifie le nombre de clics corrects
*
* @param rightClickCount le nouveau nombre de clics corrects
*/
public void setRightClickCount(int rightClickCount) {
this.rightClickCount = rightClickCount;
}
/**
* Incrémente de 1 le nombre de clics corrects
*/
public void incrementRightClickCount() {
rightClickCount++;
}
/**
* @return le nombre de clics rapides
*/
public int getRapidClickCount() {
return rapidClickCount;
}
/**
* Modifie le nombre de clics rapides
*
* @param rapidClickCount le nouveau nombre de clics rapides
*/
public void setRapidClickCount(int rapidClickCount) {
this.rapidClickCount = rapidClickCount;
}
/**
* Incrémente de 1 le nombre de clics rapides
*/
public void incrementRapidClickCount() {
rapidClickCount++;
}
@@ -1,3 +1,9 @@
/*
* User.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo;
import jakarta.persistence.CascadeType;
@@ -21,6 +27,12 @@ import java.util.Date;
import java.util.Objects;
import java.util.Set;
/**
* Représentation d'un utilisateur
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
@Entity
@Table(name = "user")
public class User implements Serializable {
@@ -29,29 +41,36 @@ public class User implements Serializable {
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private BigDecimal id;
@Column(name = "username")
private String username;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Temporal(TemporalType.DATE)
@Column(name = "birth")
private Date birth;
@Column(name = "gender")
@Enumerated(EnumType.STRING)
private Gender gender;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> playedGame;
/**
* Constructeur par défaut
*/
public User() {
}
/**
* Constructeur d'un utilisateur
*
* @param username le pseudonyme
* @param email l'adresse email
* @param password le mot de passe
* @param birth la date de naissance
* @param gender le genre
*/
public User(String username, String email, String password, Date birth, Gender gender) {
this.username = username;
this.email = email;
@@ -60,6 +79,16 @@ public class User implements Serializable {
this.gender = gender;
}
/**
* Constructeur d'un utilisateur
*
* @param id l'identifiant
* @param username le pseudonyme
* @param email l'adresse email
* @param password le mot de passe
* @param birth la date de naissance
* @param gender le genre
*/
public User(BigDecimal id, String username, String email, String password, Date birth, Gender gender) {
this.id = id;
this.username = username;
@@ -69,63 +98,13 @@ public class User implements Serializable {
this.gender = gender;
}
@Override
public int hashCode() {
return Objects.hash(id, username, email, password, birth, gender);
}
public BigDecimal getId() {
return id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = hashPassword(password);
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public int getAge() {
Date currentDate = new Date();
long diff = currentDate.getTime() - birth.getTime();
long diffDays = diff / (24 * 60 * 60 * 1000);
return (int) (diffDays / 365);
}
public static String hashPassword(String password) {
/**
* Hash le mot de passe en SHA-256
*
* @param password le mot de passe à hasher
* @return le mot de passe hashé
*/
private static String hashPassword(String password) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
@@ -144,6 +123,114 @@ public class User implements Serializable {
}
}
@Override
public int hashCode() {
return Objects.hash(id, username, email, password, birth, gender);
}
/**
* @return l'identifiant de l'utilisateur
*/
public BigDecimal getId() {
return id;
}
/**
* @return le pseudonyme de l'utilisateur
*/
public String getUsername() {
return username;
}
/**
* Modifie le pseudonyme de l'utilisateur
*
* @param username le nouveau pseudonyme
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return l'adresse email de l'utilisateur
*/
public String getEmail() {
return email;
}
/**
* Modifie l'adresse email de l'utilisateur
*
* @param email la nouvelle adresse email
*/
public void setEmail(String email) {
this.email = email;
}
/**
* @return le mot de passe hashé de l'utilisateur
*/
public String getPassword() {
return password;
}
/**
* Modifie le mot de passe de l'utilisateur
*
* @param password le nouveau mot de passe
*/
public void setPassword(String password) {
this.password = hashPassword(password);
}
/**
* @return la date de naissance de l'utilisateur
*/
public Date getBirth() {
return birth;
}
/**
* Modifie la date de naissance de l'utilisateur
*
* @param birth la nouvelle date de naissance
*/
public void setBirth(Date birth) {
this.birth = birth;
}
/**
* @return le genre de l'utilisateur
*/
public Gender getGender() {
return gender;
}
/**
* Modifie le genre de l'utilisateur
*/
public void setGender(Gender gender) {
this.gender = gender;
}
/**
* Calcule l'âge de l'utilisateur
*
* @return l'âge de l'utilisateur en années
*/
public int getAge() {
Date currentDate = new Date();
long diff = currentDate.getTime() - birth.getTime();
long diffDays = diff / (24 * 60 * 60 * 1000);
return (int) (diffDays / 365);
}
/**
* Prédicat qui vérifie si le mot de passe fourni est correct
*
* @param password le mot de passe à vérifier
* @return true si le prédicat est vérifié, false sinon
*/
public boolean verifyPassword(String password) {
String hashedPassword = hashPassword(password);
return hashedPassword != null && hashedPassword.equals(this.password);
@@ -154,5 +241,8 @@ public class User implements Serializable {
return String.format("User{id=%s, username='%s', birth=%s, gender=%s}", id.toString(), username, birth.toString(), gender.toString());
}
public static enum Gender {MALE, FEMALE, OTHER}
/**
* Enumération des genres possibles
*/
public enum Gender {MALE, FEMALE, OTHER}
}
@@ -1,30 +1,73 @@
/*
* ErrorApi.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.servlet.json;
import com.google.gson.Gson;
/**
* Classe représentant une erreur pour l'API
*
* @author Kevin Mitresse
* @author Lucàs Vabre
*/
public class ErrorApi {
/**
* Code HTTP de l'erreur
*/
private final int status;
/**
* Type de l'erreur
*/
private final String error;
/**
* Message d'erreur
*/
private final String message;
/**
* Constructeur
*
* @param status code HTTP de l'erreur
* @param error type de l'erreur
* @param message message d'erreur
*/
public ErrorApi(int status, String error, String message) {
this.status = status;
this.error = error;
this.message = message;
}
/**
* @return le code HTTP de l'erreur
*/
public int getStatus() {
return status;
}
/**
* @return le type de l'erreur
*/
public String getError() {
return error;
}
/**
* @return le message d'erreur
*/
public String getMessage() {
return message;
}
/**
* @return la représentation JSON de l'erreur
*/
public String toJson() {
Gson gson = new Gson();
return gson.toJson(this);
@@ -1,10 +1,30 @@
/*
* RequestUtils.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.servlet.utils;
import jakarta.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
public class RequestUtils {
/**
* Classe utilitaire pour les requêtes HTTP
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public class HttpRequestUtils {
/**
* Récupère le corps de la requête HTTP
*
* @param request la requête HTTP
* @return le corps de la requête
* @throws IOException en cas de problème
*/
public static String getRequestBody(HttpServletRequest request) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader reader = request.getReader();