mirror of
https://github.com/kmitresse/Cards-Rush.git
synced 2026-05-14 01:21:49 +00:00
fix(DevWeb): Add Javadoc
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+15
-2
@@ -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);
|
||||
|
||||
+21
-1
@@ -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();
|
||||
Reference in New Issue
Block a user