From 161ae36542c711c559c6b566aef2b3133ddae5fc Mon Sep 17 00:00:00 2001 From: visoulier Date: Sun, 31 Mar 2024 04:29:51 +0200 Subject: [PATCH] ajout gestion initiation score --- .../controllers/PartieKahootController.java | 20 ++++++++---- .../sae/dto/joueur/JoueurDTO.java | 2 +- .../partieKahoot/PartieKahootStatusDTO.java | 5 +++ .../ScorePartieKahootJoueurDTO.java | 18 +++++++++++ .../iut/sciencequest/sae/entities/Joueur.java | 9 ++++-- .../iut/sciencequest/sae/entities/Partie.java | 2 +- .../sae/entities/PartieKahoot.java | 4 ++- .../sae/entities/ScorePartieKahootJoueur.java | 31 +++++++++++++++++++ .../entities/ScorePartieKahootJoueurKey.java | 22 +++++++++++++ .../ScorePartieKahootJoueurRepository.java | 9 ++++++ .../src/main/resources/schema.sql | 14 +++++++-- 11 files changed, 123 insertions(+), 13 deletions(-) create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/scorePartieJoueur/ScorePartieKahootJoueurDTO.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueur.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueurKey.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScorePartieKahootJoueurRepository.java diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java index 2954a8a..704d8c1 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java @@ -1,12 +1,12 @@ package fr.iut.sciencequest.sae.controllers; -import fr.iut.sciencequest.sae.assemblers.PartieModelAssembler; import fr.iut.sciencequest.sae.controllers.request.PartieAddJoueurRequest; import fr.iut.sciencequest.sae.controllers.request.PartieRequest; import fr.iut.sciencequest.sae.dto.partieKahoot.PartieKahootDTO; import fr.iut.sciencequest.sae.dto.partieKahoot.PartieKahootStatusDTO; import fr.iut.sciencequest.sae.entities.*; import fr.iut.sciencequest.sae.exceptions.partie.PartyAlreadyStartedException; +import fr.iut.sciencequest.sae.repositories.ScorePartieKahootJoueurRepository; import fr.iut.sciencequest.sae.services.*; import jakarta.validation.Valid; import lombok.AllArgsConstructor; @@ -22,7 +22,7 @@ import java.util.List; @AllArgsConstructor @RequestMapping("/api/v1/partie/kahoot") public class PartieKahootController { - private final PartieModelAssembler partieModelAssembler; + private final ScorePartieKahootJoueurRepository scorePartieKahootJoueurRepository; private final PartieKahootService partieKahootService; private final JoueurService joueurService; private final QuestionService questionService; @@ -39,9 +39,8 @@ public class PartieKahootController { @ResponseStatus(HttpStatus.CREATED) public PartieKahootDTO createPartie(@RequestBody @Valid PartieRequest request) { PartieKahoot partie = new PartieKahoot(); - - partie.setJoueurs(List.of(this.joueurService.findById(request.getIdJoueur()))); - + Joueur joueur = this.joueurService.findById(request.getIdJoueur()); + partie.setJoueurs(List.of(joueur)); partie.setThematiques(new ArrayList<>()); for(int idThematique: request.getThematiques()){ partie.getThematiques().add(this.thematiqueService.findById(idThematique)); @@ -52,6 +51,11 @@ public class PartieKahootController { partie.setQuestions(this.questionService.getRandomQuestions(1, partie.getThematiques(), partie.getDifficulte())); partie = this.partieKahootService.create(partie); + ScorePartieKahootJoueur score = new ScorePartieKahootJoueur(); + score.setId(new ScorePartieKahootJoueurKey(joueur.getId(), partie.getId())); + score.setJoueur(joueur); + score.setPartie(partie); + this.scorePartieKahootJoueurRepository.save(score); return this.modelMapper.map(partie, PartieKahootDTO.class); } @@ -62,6 +66,10 @@ public class PartieKahootController { PartieKahoot partie = this.partieKahootService.getPartieKahootByIdOrCodeInvitation(codeInvitation); if(!partie.getStatus().equals(Status.Pending)) throw new PartyAlreadyStartedException(); if(!partie.getJoueurs().contains(joueur)){ + ScorePartieKahootJoueur score = new ScorePartieKahootJoueur(); + score.setPartie(partie); + score.setJoueur(joueur); + partie.getScores().add(score); partie.getJoueurs().add(joueur); } return this.modelMapper.map(this.partieKahootService.update(partie), PartieKahootDTO.class); @@ -75,7 +83,7 @@ public class PartieKahootController { throw new PartyAlreadyStartedException(); } partieKahoot.setStatus(Status.Started); - this.partieKahootService.update(partieKahoot); + partieKahoot = this.partieKahootService.update(partieKahoot); return this.modelMapper.map(partieKahoot, PartieKahootStatusDTO.class); } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/joueur/JoueurDTO.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/joueur/JoueurDTO.java index c9bd493..f3cc6df 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/joueur/JoueurDTO.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/joueur/JoueurDTO.java @@ -22,5 +22,5 @@ public class JoueurDTO extends RepresentationModel { @NotBlank private String pseudo; - private PartieDTO partie; + private PartieDTO partieEnCours; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/PartieKahootStatusDTO.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/PartieKahootStatusDTO.java index 3f74324..403da25 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/PartieKahootStatusDTO.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/PartieKahootStatusDTO.java @@ -1,10 +1,13 @@ package fr.iut.sciencequest.sae.dto.partieKahoot; +import fr.iut.sciencequest.sae.dto.scorePartieJoueur.ScorePartieKahootJoueurDTO; import fr.iut.sciencequest.sae.entities.Status; import jakarta.validation.constraints.NotNull; import lombok.*; import org.springframework.hateoas.RepresentationModel; +import java.util.List; + @Data @Builder @@ -14,4 +17,6 @@ import org.springframework.hateoas.RepresentationModel; public class PartieKahootStatusDTO extends RepresentationModel { @NotNull private Status status; + + private List scores; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/scorePartieJoueur/ScorePartieKahootJoueurDTO.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/scorePartieJoueur/ScorePartieKahootJoueurDTO.java new file mode 100644 index 0000000..cbc4ca6 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/scorePartieJoueur/ScorePartieKahootJoueurDTO.java @@ -0,0 +1,18 @@ +package fr.iut.sciencequest.sae.dto.scorePartieJoueur; + +import fr.iut.sciencequest.sae.dto.joueur.JoueurSimpleDTO; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import org.springframework.hateoas.RepresentationModel; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class ScorePartieKahootJoueurDTO extends RepresentationModel { + @NotNull + private JoueurSimpleDTO joueur; + + private Integer score; +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Joueur.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Joueur.java index 8ef0d21..b2aac46 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Joueur.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Joueur.java @@ -10,6 +10,8 @@ import lombok.NoArgsConstructor; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; +import java.util.List; + @AllArgsConstructor @NoArgsConstructor @Data @@ -26,8 +28,11 @@ public class Joueur { @JsonBackReference @ManyToOne - @JoinColumn(name = "idpartie") + @JoinColumn(name = "idpartieencours") @Fetch(FetchMode.JOIN) @EqualsAndHashCode.Exclude - private Partie partie; + private Partie partieEnCours; + + @OneToMany(mappedBy = "joueur") + private List scores; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Partie.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Partie.java index af335e7..d8a14b0 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Partie.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Partie.java @@ -25,7 +25,7 @@ public class Partie { @JsonManagedReference @OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) - @JoinColumn(name = "idpartie") + @JoinColumn(name = "idpartieencours") private List joueurs; @Column(name = "datecreation") //default value : see Schema.sql diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/PartieKahoot.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/PartieKahoot.java index d2eb3eb..f96f455 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/PartieKahoot.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/PartieKahoot.java @@ -7,7 +7,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.Date; import java.util.List; @EqualsAndHashCode(callSuper = true) @@ -31,4 +30,7 @@ public class PartieKahoot extends Partie { inverseJoinColumns = @JoinColumn(name="idquestion") ) private List questions; + + @OneToMany(mappedBy = "partie", fetch = FetchType.EAGER) + private List scores; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueur.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueur.java new file mode 100644 index 0000000..2f48f5f --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueur.java @@ -0,0 +1,31 @@ +package fr.iut.sciencequest.sae.entities; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Entity +@Table(name="scorepartiekahootjoueur") +public class ScorePartieKahootJoueur { + @EmbeddedId + private ScorePartieKahootJoueurKey id = new ScorePartieKahootJoueurKey(); + + @ManyToOne + @MapsId("idJoueur") + @JoinColumn(name = "idjoueur") + private Joueur joueur; + + @ManyToOne + @MapsId("idPartie") + @JoinColumn(name="idpartie") + private Partie partie; + + private Integer score = 0; +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueurKey.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueurKey.java new file mode 100644 index 0000000..bb76f23 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/ScorePartieKahootJoueurKey.java @@ -0,0 +1,22 @@ +package fr.iut.sciencequest.sae.entities; + + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Embeddable +public class ScorePartieKahootJoueurKey implements Serializable { + @Column(name="idjoueur") + private Integer idJoueur; + + @Column(name="idpartie") + private Integer idPartie; +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScorePartieKahootJoueurRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScorePartieKahootJoueurRepository.java new file mode 100644 index 0000000..ee05ae0 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScorePartieKahootJoueurRepository.java @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.ScorePartieKahootJoueur; +import fr.iut.sciencequest.sae.entities.ScorePartieKahootJoueurKey; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ScorePartieKahootJoueurRepository extends CrudRepository {} diff --git a/SpringBootProject/src/main/resources/schema.sql b/SpringBootProject/src/main/resources/schema.sql index 7ba7671..e3a279c 100644 --- a/SpringBootProject/src/main/resources/schema.sql +++ b/SpringBootProject/src/main/resources/schema.sql @@ -15,6 +15,7 @@ DROP TABLE IF EXISTS Thematique CASCADE; DROP TABLE IF EXISTS ThematiqueSelectionnee CASCADE; DROP TABLE IF EXISTS PartieKahoot CASCADE; DROP TABLE IF EXISTS QuestionPartieKahoot CASCADE; +DROP TABLE IF EXISTS ScorePartieKahootjoueur CASCADE; DROP TABLE IF EXISTS Difficulte; @@ -133,7 +134,7 @@ CREATE TABLE PartieKahoot( CREATE TABLE Joueur( id SERIAL PRIMARY KEY, - idPartie integer REFERENCES Partie(id), + idPartieEnCours integer REFERENCES Partie(id), pseudo varchar(255) NOT NULL UNIQUE ); @@ -178,6 +179,15 @@ CREATE TABLE QuestionPartieKahoot( PRIMARY KEY (idPartieKahoot, idQuestion) ); +-- ScorePartieKahootjoueur + +CREATE TABLE ScorePartieKahootjoueur( + idJoueur integer REFERENCES Joueur(id), + idPartie integer REFERENCES PartieKahoot(idPartie), + score integer, + PRIMARY KEY (idJoueur, idPartie) +); + -- TRIGGERS @@ -249,7 +259,7 @@ INSERT INTO Partie(codeInvitation, idJeu, idDifficulte, status) VALUES ('abcde', INSERT INTO PartieKahoot(idPartie) VALUES (1); -- Utilisateurs -INSERT INTO Joueur(pseudo, idPartie) VALUES ('moi, le meilleur joueur du monde', 1); --id = 1 +INSERT INTO Joueur(pseudo, idPartieEnCours) VALUES ('moi, le meilleur joueur du monde', 1); --id = 1 INSERT INTO Utilisateur(idJoueur,email,password) VALUES (1, 'joueur','$2y$10$juGnlWC9cS19popEKLZsYeir0Jl39k6hDl0dpaCix00FDcdiEbtmS'); -- mdp = test