diff --git a/S2/DevWeb/Projet/docker-compose.yaml b/S2/DevWeb/Projet/docker-compose.yaml index 3082431..70a1fdc 100644 --- a/S2/DevWeb/Projet/docker-compose.yaml +++ b/S2/DevWeb/Projet/docker-compose.yaml @@ -1,6 +1,6 @@ version: '2' services: - db: + mysql-db: image: mysql:latest volumes: - ./mysql:/docker-entrypoint-initdb.d diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java index b58c0df..1ba7356 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java @@ -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; 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 591b282..c02aa8b 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 @@ -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 la classe paramétrant le DAO + * @author Kevin Mitressé + * @author Lucàs Vabre */ public abstract class DAO { - 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; } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java index a665b06..00508fb 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java @@ -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); } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/EntityManagerProvider.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/EntityManagerProvider.java similarity index 71% rename from S2/DevWeb/Projet/src/main/java/uppa/project/EntityManagerProvider.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/dao/EntityManagerProvider.java index 828b5b2..4e8e0e2 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/EntityManagerProvider.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/EntityManagerProvider.java @@ -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) { diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java index c6bcde4..d091305 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java @@ -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 getDAOUser() throws DAOException; /** * @return le DAO pour la classe/table Game * @throws DAOException en cas de problème + * @see Game */ public abstract DAO getDAOGame() throws DAOException; /** * @return le DAO pour la classe/table Player * @throws DAOException en cas de problème + * @see Player */ public abstract DAO getDAOPlayer() throws DAOException; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java index 9369df6..4efcb28 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java @@ -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 } 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 4a03b5d..08ddb7f 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 @@ -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 { - 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 query = entityManager.createQuery("SELECT u FROM Game u WHERE ?1=?2", Game.class); query.setParameter(1, field); 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 6e3143a..5ca4e22 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 @@ -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 { - 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 { return result; } + @Override public Player[] findByField(String field, String value) throws DAOException { TypedQuery query = entityManager.createQuery("SELECT p FROM Player p WHERE ?1=?2", Player.class); query.setParameter(1, field); 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 ff4333b..7562fa5 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 @@ -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 { - private final EntityManager entityManager; - public DAO_JPA_User() throws DAOException { - this.entityManager = EntityManagerProvider.getInstance(); + super(); } @Override diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java index d25dc75..fe419bc 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java @@ -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 diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java index 30742eb..a38cc4d 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java @@ -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; } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java index e725014..1bcef5f 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java @@ -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 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 initializeDeck(int nbColors, int nbValues) { + Set 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 createSetOfCard(int nbColors, int nbValues) throws IllegalArgumentException { + Set 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 shuffleSetOfCard(Set cards) { List cardList = new ArrayList<>(cards); Collections.shuffle(cardList); - cards = new HashSet<>(cardList); + return new HashSet<>(cardList); } } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java index ef1c880..faf84a9 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java @@ -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 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 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 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 getPlayers() { return players; } + /** + * Modifie les joueurs de la partie + * + * @param players les nouveaux joueurs + */ public void setPlayers(Set 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} } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java index 8f95259..5b862dc 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java @@ -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++; } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java index 978c45f..f1691c7 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java @@ -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 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} } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/json/ErrorApi.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/json/ErrorApi.java index 982fddd..984ab14 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/json/ErrorApi.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/json/ErrorApi.java @@ -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); diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/utils/RequestUtils.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/utils/HttpRequestUtils.java similarity index 51% rename from S2/DevWeb/Projet/src/main/java/uppa/project/servlet/utils/RequestUtils.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/servlet/utils/HttpRequestUtils.java index 58df136..1266d55 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/utils/RequestUtils.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/utils/HttpRequestUtils.java @@ -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();