From 649f9431c65804c10856fe7c4347e07828fa795d Mon Sep 17 00:00:00 2001 From: visoulier Date: Sun, 31 Mar 2024 00:13:43 +0100 Subject: [PATCH] ajout service, controller, entity pour partiekahoot --- .../sae/assemblers/PartieModelAssembler.java | 4 +- ...oller.java => PartieKahootController.java} | 34 ++++------ .../controllers/request/PartieRequest.java | 2 - .../partieKahoot/partie/PartieKahootDTO.java | 41 ++++++++++++ .../iut/sciencequest/sae/entities/Partie.java | 5 +- .../sae/entities/PartieKahoot.java | 34 ++++++++++ .../PartieKahootNotFoundException.java | 17 +++++ .../repositories/PartieKahootRepository.java | 12 ++++ .../sae/services/PartieKahootService.java | 61 +++++++++++++++++ .../sae/services/PartieService.java | 67 ------------------- .../src/main/resources/schema.sql | 3 +- 11 files changed, 184 insertions(+), 96 deletions(-) rename SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/{PartieController.java => PartieKahootController.java} (67%) create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/partie/PartieKahootDTO.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/PartieKahoot.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/notFound/PartieKahootNotFoundException.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieKahootRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieKahootService.java delete mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieService.java diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/assemblers/PartieModelAssembler.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/assemblers/PartieModelAssembler.java index 5159856..8d10fe4 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/assemblers/PartieModelAssembler.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/assemblers/PartieModelAssembler.java @@ -1,6 +1,6 @@ package fr.iut.sciencequest.sae.assemblers; -import fr.iut.sciencequest.sae.controllers.PartieController; +import fr.iut.sciencequest.sae.controllers.PartieKahootController; import fr.iut.sciencequest.sae.entities.Partie; import fr.iut.sciencequest.sae.dto.partie.PartieDTO; import jakarta.annotation.Nullable; @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; @Component public class PartieModelAssembler extends RepresentationModelAssemblerSupport { public PartieModelAssembler() { - super(PartieController.class, PartieDTO.class); + super(PartieKahootController.class, PartieDTO.class); } @Override diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java similarity index 67% rename from SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java rename to SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java index 6f989f8..fc2a5c9 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieKahootController.java @@ -4,11 +4,11 @@ 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.partie.PartieDTO; +import fr.iut.sciencequest.sae.dto.partieKahoot.partie.PartieKahootDTO; import fr.iut.sciencequest.sae.entities.Joueur; import fr.iut.sciencequest.sae.entities.Partie; +import fr.iut.sciencequest.sae.entities.PartieKahoot; import fr.iut.sciencequest.sae.entities.Status; -import fr.iut.sciencequest.sae.entities.Thematique; -import fr.iut.sciencequest.sae.exceptions.notFound.PartieNotFoundException; import fr.iut.sciencequest.sae.exceptions.partie.PartyAlreadyStartedException; import fr.iut.sciencequest.sae.services.*; import jakarta.validation.Valid; @@ -19,18 +19,14 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; - -import static org.springframework.data.jpa.domain.AbstractPersistable_.id; @RestController @AllArgsConstructor -@RequestMapping("/api/v1/partie") -public class PartieController { +@RequestMapping("/api/v1/partie/kahoot") +public class PartieKahootController { private final PartieModelAssembler partieModelAssembler; - private final PartieService partieService; + private final PartieKahootService partieKahootService; private final JoueurService joueurService; private final JeuService jeuService; private final ThematiqueService thematiqueService; @@ -38,16 +34,14 @@ public class PartieController { private final ModelMapper modelMapper; @RequestMapping(value = "/{codeInvitation}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public PartieDTO getPartie(@PathVariable String codeInvitation) { - return partieModelAssembler.toModel(this.partieService.getPartieByIdOrCodeInvitation(codeInvitation)); + public PartieKahootDTO getPartie(@PathVariable String codeInvitation) { + return this.modelMapper.map(this.partieKahootService.getPartieKahootByIdOrCodeInvitation(codeInvitation), PartieKahootDTO.class); } @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public PartieDTO createPartie(@RequestBody @Valid PartieRequest request) { - Partie partie = new Partie(); - - partie.setJeu(this.jeuService.findById(request.getIdJeu())); + public PartieKahootDTO createPartie(@RequestBody @Valid PartieRequest request) { + PartieKahoot partie = new PartieKahoot(); partie.setJoueurs(List.of(this.joueurService.findById(request.getIdJoueur()))); @@ -58,20 +52,20 @@ public class PartieController { partie.setDifficulte(this.difficulteService.findById(request.getIdDifficulte())); - partie = this.partieService.create(partie); - return this.modelMapper.map(partie, PartieDTO.class); + partie = this.partieKahootService.create(partie); + return this.modelMapper.map(partie, PartieKahootDTO.class); } @PutMapping(value= "/{codeInvitation}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) - public PartieDTO addPlayerToPartie(@PathVariable String codeInvitation, @RequestBody @Valid PartieAddJoueurRequest request){ + public PartieKahootDTO addPlayerToPartie(@PathVariable String codeInvitation, @RequestBody @Valid PartieAddJoueurRequest request){ Joueur joueur = this.joueurService.findById(request.getIdJoueur()); - Partie partie = this.partieService.getPartieByIdOrCodeInvitation(codeInvitation); + PartieKahoot partie = this.partieKahootService.getPartieKahootByIdOrCodeInvitation(codeInvitation); if(!partie.getStatus().equals(Status.Pending)) throw new PartyAlreadyStartedException(); if(!partie.getJoueurs().contains(joueur)){ partie.getJoueurs().add(joueur); } - return this.modelMapper.map(this.partieService.update(partie), PartieDTO.class); + return this.modelMapper.map(this.partieKahootService.update(partie), PartieKahootDTO.class); } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieRequest.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieRequest.java index b38b6da..5306e23 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieRequest.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieRequest.java @@ -8,8 +8,6 @@ import java.util.List; @Data public class PartieRequest { - @NotNull - private Integer idJeu; @NotNull private int idJoueur; diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/partie/PartieKahootDTO.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/partie/PartieKahootDTO.java new file mode 100644 index 0000000..8b5960c --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/partieKahoot/partie/PartieKahootDTO.java @@ -0,0 +1,41 @@ +package fr.iut.sciencequest.sae.dto.partieKahoot.partie; + +import fr.iut.sciencequest.sae.dto.difficulte.DifficulteSimpleDTO; +import fr.iut.sciencequest.sae.dto.jeu.JeuDTO; +import fr.iut.sciencequest.sae.dto.joueur.JoueurSimpleDTO; +import fr.iut.sciencequest.sae.dto.thematique.ThematiqueSimpleDTO; +import fr.iut.sciencequest.sae.entities.Question; +import fr.iut.sciencequest.sae.entities.Status; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import org.springframework.hateoas.RepresentationModel; + +import java.util.List; + + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class PartieKahootDTO extends RepresentationModel { + @NotNull + private Integer id; + @NotEmpty + private String codeInvitation; + @NotEmpty + private List joueurs; + @NotNull + private JeuDTO jeu; + @NotEmpty + private List thematiques; + @NotNull + private DifficulteSimpleDTO difficulte; + @NotNull + private Status status; + + private Question questionActuel; + + private List questions; +} 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 10de5b2..af335e7 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 @@ -12,6 +12,7 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @Data +@Inheritance(strategy = InheritanceType.JOINED) @Entity @Table(name="partie") public class Partie { @@ -27,10 +28,6 @@ public class Partie { @JoinColumn(name = "idpartie") private List joueurs; - @ManyToOne - @JoinColumn(name="idjeu", nullable = false) - private Jeu jeu; - @Column(name = "datecreation") //default value : see Schema.sql private Date dateCreation; 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 new file mode 100644 index 0000000..d2eb3eb --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/PartieKahoot.java @@ -0,0 +1,34 @@ +package fr.iut.sciencequest.sae.entities; + +import com.fasterxml.jackson.annotation.JsonManagedReference; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +@Data +@Entity +@Table(name="partiekahoot") +@PrimaryKeyJoinColumn(name = "idpartie") +public class PartieKahoot extends Partie { + + @ManyToOne + @JoinColumn(name="idquestionactuel") + private Question questionActuel; + + @JsonManagedReference + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable( + name = "Questionpartiekahoot", + joinColumns = @JoinColumn(name = "idpartiekahoot"), + inverseJoinColumns = @JoinColumn(name="idquestion") + ) + private List questions; +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/notFound/PartieKahootNotFoundException.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/notFound/PartieKahootNotFoundException.java new file mode 100644 index 0000000..069023e --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/notFound/PartieKahootNotFoundException.java @@ -0,0 +1,17 @@ +package fr.iut.sciencequest.sae.exceptions.notFound; + + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) +public class PartieKahootNotFoundException extends EntityNotFoundException{ + private static String entityName = "partieKahoot"; + public PartieKahootNotFoundException(int id) { + super(PartieKahootNotFoundException.entityName, id); + } + + public PartieKahootNotFoundException(String field, Object value){ + super(PartieKahootNotFoundException.entityName, field, value); + } +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieKahootRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieKahootRepository.java new file mode 100644 index 0000000..8d239d5 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieKahootRepository.java @@ -0,0 +1,12 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.PartieKahoot; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface PartieKahootRepository extends CrudRepository { + Optional getPartieByCodeInvitation(String codeInvitation); +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieKahootService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieKahootService.java new file mode 100644 index 0000000..48ea501 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieKahootService.java @@ -0,0 +1,61 @@ +package fr.iut.sciencequest.sae.services; + +import fr.iut.sciencequest.sae.entities.Partie; +import fr.iut.sciencequest.sae.entities.PartieKahoot; +import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException; +import fr.iut.sciencequest.sae.exceptions.notFound.PartieKahootNotFoundException; +import fr.iut.sciencequest.sae.exceptions.notFound.PartieNotFoundException; +import fr.iut.sciencequest.sae.repositories.*; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +@AllArgsConstructor +@Service +public class PartieKahootService { + private final PartieKahootRepository partieKahootRepository; + private final PartieRepository partieRepository; + + public PartieKahoot findById(int id) { + return this.partieKahootRepository.findById(id).orElseThrow(() -> + new PartieKahootNotFoundException(id) + ); + } + + public PartieKahoot getPartieByCodeInvitation(String codeInvitation){ + return this.partieKahootRepository.getPartieByCodeInvitation(codeInvitation).orElseThrow(() -> new PartieKahootNotFoundException("codeInvitation", codeInvitation)); + } + + public PartieKahoot getPartieKahootByIdOrCodeInvitation(String codeInvitation){ + //try to get invitation from codeInvitation, if not : try with id + PartieKahoot partie; + try{ + partie = this.getPartieByCodeInvitation(codeInvitation); + }catch (PartieKahootNotFoundException exceptionNotFoundByCodeInvitation){ + try{ + partie = this.findById(Integer.parseInt(codeInvitation)); + }catch (PartieKahootNotFoundException | NumberFormatException e2){ + throw exceptionNotFoundByCodeInvitation; + } + } + return partie; + } + + public PartieKahoot update(PartieKahoot partie){ + if(!this.partieRepository.existsById(partie.getId())){ + throw new PartieKahootNotFoundException(partie.getId()); + } + PartieKahoot savedPartie = this.partieKahootRepository.save(partie); + return this.findById(savedPartie.getId()); + } + + public PartieKahoot create(PartieKahoot partie){ + if(partie.getId() != null && this.partieRepository.existsById(partie.getId())){ + throw new DuplicatedIdException(); + } + PartieKahoot savedPartie = this.partieKahootRepository.save(partie); + return this.findById(savedPartie.getId()); + } + +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieService.java deleted file mode 100644 index 49a186f..0000000 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieService.java +++ /dev/null @@ -1,67 +0,0 @@ -package fr.iut.sciencequest.sae.services; - -import fr.iut.sciencequest.sae.entities.*; -import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException; -import fr.iut.sciencequest.sae.exceptions.notFound.PartieNotFoundException; -import fr.iut.sciencequest.sae.repositories.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - -@AllArgsConstructor -@Service -public class PartieService { - private final PartieRepository partieRepository; - private final JeuRepository jeuRepository; - private final JoueurRepository joueurRepository; - private final UtilisateurRepository utilisateurRepository; - private final ThematiqueRepository thematiqueRepository; - private final DifficulteRepository difficulteRepository; - private final JoueurService joueurService; - - @PersistenceContext - private EntityManager entityManager; - - public Partie findById(int id) { - return this.partieRepository.findById(id).orElseThrow(() -> - new PartieNotFoundException(id) - ); - } - - public Partie getPartieByCodeInvitation(String codeInvitation){ - return this.partieRepository.getPartieByCodeInvitation(codeInvitation).orElseThrow(() -> new PartieNotFoundException("codeInvitation", codeInvitation)); - } - - public Partie getPartieByIdOrCodeInvitation(String codeInvitation){ - //try to get invitation from codeInvitation, if not : try with id - Partie partie; - try{ - partie = this.getPartieByCodeInvitation(codeInvitation); - }catch (PartieNotFoundException exceptionNotFoundByCodeInvitation){ - try{ - partie = this.findById(Integer.parseInt(codeInvitation)); - }catch (PartieNotFoundException | NumberFormatException e2){ - throw exceptionNotFoundByCodeInvitation; - } - } - return partie; - } - - public Partie update(Partie partie){ - if(!this.partieRepository.existsById(partie.getId())){ - throw new PartieNotFoundException(partie.getId()); - } - Partie savedPartie = this.partieRepository.save(partie); - return this.findById(savedPartie.getId()); - } - - public Partie create(Partie partie){ - if(partie.getId() != null && this.partieRepository.existsById(partie.getId())){ - throw new DuplicatedIdException(); - } - Partie savedPartie = this.partieRepository.save(partie); - return this.findById(savedPartie.getId()); - } - -} diff --git a/SpringBootProject/src/main/resources/schema.sql b/SpringBootProject/src/main/resources/schema.sql index 1de4105..92880e9 100644 --- a/SpringBootProject/src/main/resources/schema.sql +++ b/SpringBootProject/src/main/resources/schema.sql @@ -125,7 +125,8 @@ CREATE TABLE Partie( -- Partie Kahoot CREATE TABLE PartieKahoot( - idPartie integer PRIMARY KEY REFERENCES Partie(id) + idPartie integer PRIMARY KEY REFERENCES Partie(id), + idQuestionActuel integer REFERENCES Question(id) ); -- JOUEUR