ajout service, controller, entity pour partiekahoot

Springboot
Victor SOULIER 1 year ago
parent 68e6228e4e
commit 649f9431c6

@ -1,6 +1,6 @@
package fr.iut.sciencequest.sae.assemblers; 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.entities.Partie;
import fr.iut.sciencequest.sae.dto.partie.PartieDTO; import fr.iut.sciencequest.sae.dto.partie.PartieDTO;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
@ -12,7 +12,7 @@ import org.springframework.stereotype.Component;
@Component @Component
public class PartieModelAssembler extends RepresentationModelAssemblerSupport<Partie, PartieDTO> { public class PartieModelAssembler extends RepresentationModelAssemblerSupport<Partie, PartieDTO> {
public PartieModelAssembler() { public PartieModelAssembler() {
super(PartieController.class, PartieDTO.class); super(PartieKahootController.class, PartieDTO.class);
} }
@Override @Override

@ -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.PartieAddJoueurRequest;
import fr.iut.sciencequest.sae.controllers.request.PartieRequest; import fr.iut.sciencequest.sae.controllers.request.PartieRequest;
import fr.iut.sciencequest.sae.dto.partie.PartieDTO; 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.Joueur;
import fr.iut.sciencequest.sae.entities.Partie; 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.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.exceptions.partie.PartyAlreadyStartedException;
import fr.iut.sciencequest.sae.services.*; import fr.iut.sciencequest.sae.services.*;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@ -19,18 +19,14 @@ import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import static org.springframework.data.jpa.domain.AbstractPersistable_.id;
@RestController @RestController
@AllArgsConstructor @AllArgsConstructor
@RequestMapping("/api/v1/partie") @RequestMapping("/api/v1/partie/kahoot")
public class PartieController { public class PartieKahootController {
private final PartieModelAssembler partieModelAssembler; private final PartieModelAssembler partieModelAssembler;
private final PartieService partieService; private final PartieKahootService partieKahootService;
private final JoueurService joueurService; private final JoueurService joueurService;
private final JeuService jeuService; private final JeuService jeuService;
private final ThematiqueService thematiqueService; private final ThematiqueService thematiqueService;
@ -38,16 +34,14 @@ public class PartieController {
private final ModelMapper modelMapper; private final ModelMapper modelMapper;
@RequestMapping(value = "/{codeInvitation}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/{codeInvitation}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public PartieDTO getPartie(@PathVariable String codeInvitation) { public PartieKahootDTO getPartie(@PathVariable String codeInvitation) {
return partieModelAssembler.toModel(this.partieService.getPartieByIdOrCodeInvitation(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) @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
public PartieDTO createPartie(@RequestBody @Valid PartieRequest request) { public PartieKahootDTO createPartie(@RequestBody @Valid PartieRequest request) {
Partie partie = new Partie(); PartieKahoot partie = new PartieKahoot();
partie.setJeu(this.jeuService.findById(request.getIdJeu()));
partie.setJoueurs(List.of(this.joueurService.findById(request.getIdJoueur()))); partie.setJoueurs(List.of(this.joueurService.findById(request.getIdJoueur())));
@ -58,20 +52,20 @@ public class PartieController {
partie.setDifficulte(this.difficulteService.findById(request.getIdDifficulte())); partie.setDifficulte(this.difficulteService.findById(request.getIdDifficulte()));
partie = this.partieService.create(partie); partie = this.partieKahootService.create(partie);
return this.modelMapper.map(partie, PartieDTO.class); return this.modelMapper.map(partie, PartieKahootDTO.class);
} }
@PutMapping(value= "/{codeInvitation}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PutMapping(value= "/{codeInvitation}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK) @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()); 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.getStatus().equals(Status.Pending)) throw new PartyAlreadyStartedException();
if(!partie.getJoueurs().contains(joueur)){ if(!partie.getJoueurs().contains(joueur)){
partie.getJoueurs().add(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);
} }
} }

@ -8,8 +8,6 @@ import java.util.List;
@Data @Data
public class PartieRequest { public class PartieRequest {
@NotNull
private Integer idJeu;
@NotNull @NotNull
private int idJoueur; private int idJoueur;

@ -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<PartieKahootDTO> {
@NotNull
private Integer id;
@NotEmpty
private String codeInvitation;
@NotEmpty
private List<JoueurSimpleDTO> joueurs;
@NotNull
private JeuDTO jeu;
@NotEmpty
private List<ThematiqueSimpleDTO> thematiques;
@NotNull
private DifficulteSimpleDTO difficulte;
@NotNull
private Status status;
private Question questionActuel;
private List<Question> questions;
}

@ -12,6 +12,7 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@Inheritance(strategy = InheritanceType.JOINED)
@Entity @Entity
@Table(name="partie") @Table(name="partie")
public class Partie { public class Partie {
@ -27,10 +28,6 @@ public class Partie {
@JoinColumn(name = "idpartie") @JoinColumn(name = "idpartie")
private List<Joueur> joueurs; private List<Joueur> joueurs;
@ManyToOne
@JoinColumn(name="idjeu", nullable = false)
private Jeu jeu;
@Column(name = "datecreation") //default value : see Schema.sql @Column(name = "datecreation") //default value : see Schema.sql
private Date dateCreation; private Date dateCreation;

@ -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<Question> questions;
}

@ -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);
}
}

@ -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<PartieKahoot, Integer> {
Optional<PartieKahoot> getPartieByCodeInvitation(String codeInvitation);
}

@ -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());
}
}

@ -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());
}
}

@ -125,7 +125,8 @@ CREATE TABLE Partie(
-- Partie Kahoot -- Partie Kahoot
CREATE TABLE PartieKahoot( CREATE TABLE PartieKahoot(
idPartie integer PRIMARY KEY REFERENCES Partie(id) idPartie integer PRIMARY KEY REFERENCES Partie(id),
idQuestionActuel integer REFERENCES Question(id)
); );
-- JOUEUR -- JOUEUR

Loading…
Cancel
Save