diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/InviteController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/InviteController.java index 89a7c89..9d0d81d 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/InviteController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/InviteController.java @@ -1,7 +1,8 @@ package fr.iut.sciencequest.sae.controllers; -import fr.iut.sciencequest.sae.controllers.request.InviteRequest; +import fr.iut.sciencequest.sae.dto.invite.InviteWithPseudoOnlyDTO; import fr.iut.sciencequest.sae.services.InviteService; +import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -13,9 +14,4 @@ import java.util.HashMap; @RequestMapping("/api/v1/invite") public class InviteController { private final InviteService inviteService; - - @GetMapping(value = "/{invite}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public HashMap getParty(@PathVariable String invite, @RequestBody InviteRequest inviteRequest) { - return this.inviteService.findByInvite(invite, inviteRequest.getPseudo()); - } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java index ddeadaa..ba3b67d 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java @@ -1,11 +1,13 @@ 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.partie.PartieDTO; import fr.iut.sciencequest.sae.entities.Joueur; import fr.iut.sciencequest.sae.entities.Partie; import fr.iut.sciencequest.sae.exceptions.notFound.PartieNotFoundException; +import fr.iut.sciencequest.sae.exceptions.partie.PartyAlreadyStartedException; import fr.iut.sciencequest.sae.services.JeuService; import fr.iut.sciencequest.sae.services.JoueurService; import fr.iut.sciencequest.sae.services.PartieService; @@ -34,18 +36,7 @@ public class PartieController { @RequestMapping(value = "/{codeInvitation}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public PartieDTO getPartie(@PathVariable String codeInvitation) { - //try to get invitation from codeInvitation, if not : try with id - Partie partie; - try{ - partie = this.partieService.getPartieByCodeInvitation(codeInvitation); - }catch (PartieNotFoundException exceptionNotFoundByCodeInvitation){ - try{ - partie = this.partieService.findById(Integer.parseInt(codeInvitation)); - }catch (PartieNotFoundException | NumberFormatException e2){ - throw exceptionNotFoundByCodeInvitation; - } - } - return partieModelAssembler.toModel(partie); + return partieModelAssembler.toModel(this.partieService.getPartieByIdOrCodeInvitation(codeInvitation)); } @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @@ -58,4 +49,16 @@ public class PartieController { return this.modelMapper.map(partie, PartieDTO.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){ + Joueur joueur = this.joueurService.findById(request.getIdJoueur()); + Partie partie = this.partieService.getPartieByIdOrCodeInvitation(codeInvitation); + if(!partie.getStatus().equals("pending")) throw new PartyAlreadyStartedException(); + if(!partie.getJoueurs().contains(joueur)){ + partie.getJoueurs().add(joueur); + } + return this.modelMapper.map(this.partieService.update(partie), PartieDTO.class); + } + } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/InviteRequest.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/InviteRequest.java deleted file mode 100644 index 3aefb01..0000000 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/InviteRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.iut.sciencequest.sae.controllers.request; - -import lombok.Data; - -@Data -public class InviteRequest { - private String pseudo; -} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieAddJoueurRequest.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieAddJoueurRequest.java new file mode 100644 index 0000000..c4b3a56 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/request/PartieAddJoueurRequest.java @@ -0,0 +1,12 @@ +package fr.iut.sciencequest.sae.controllers.request; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class PartieAddJoueurRequest { + @NotNull + private int idJoueur; +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/invite/InviteWithPseudoOnlyDTO.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/invite/InviteWithPseudoOnlyDTO.java new file mode 100644 index 0000000..ecc6ae7 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/dto/invite/InviteWithPseudoOnlyDTO.java @@ -0,0 +1,20 @@ +package fr.iut.sciencequest.sae.dto.invite; + +import com.fasterxml.jackson.annotation.JsonInclude; +import fr.iut.sciencequest.sae.dto.partie.PartieDTO; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import org.springframework.hateoas.RepresentationModel; + + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class InviteWithPseudoOnlyDTO extends RepresentationModel { + @NotBlank + private String pseudo; +} 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 341f94c..8ef0d21 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 @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; @@ -27,5 +28,6 @@ public class Joueur { @ManyToOne @JoinColumn(name = "idpartie") @Fetch(FetchMode.JOIN) + @EqualsAndHashCode.Exclude private Partie partie; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/MalformedPartyException.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/partie/MalformedPartyException.java similarity index 88% rename from SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/MalformedPartyException.java rename to SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/partie/MalformedPartyException.java index 28ce239..5e58757 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/MalformedPartyException.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/partie/MalformedPartyException.java @@ -1,4 +1,4 @@ -package fr.iut.sciencequest.sae.exceptions; +package fr.iut.sciencequest.sae.exceptions.partie; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartyAlreadyStartedException.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/partie/PartyAlreadyStartedException.java similarity index 85% rename from SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartyAlreadyStartedException.java rename to SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/partie/PartyAlreadyStartedException.java index 089a428..c32de50 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartyAlreadyStartedException.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/partie/PartyAlreadyStartedException.java @@ -1,4 +1,4 @@ -package fr.iut.sciencequest.sae.exceptions; +package fr.iut.sciencequest.sae.exceptions.partie; import org.springframework.http.HttpStatus; diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/InviteService.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/InviteService.java index 8eccc19..38bfdc5 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/InviteService.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/InviteService.java @@ -2,7 +2,7 @@ package fr.iut.sciencequest.sae.services; import fr.iut.sciencequest.sae.entities.Joueur; import fr.iut.sciencequest.sae.entities.Partie; -import fr.iut.sciencequest.sae.exceptions.PartyAlreadyStartedException; +import fr.iut.sciencequest.sae.exceptions.partie.PartyAlreadyStartedException; import fr.iut.sciencequest.sae.exceptions.notFound.InviteNotFoundException; import fr.iut.sciencequest.sae.repositories.JoueurRepository; import fr.iut.sciencequest.sae.repositories.PartieRepository; @@ -17,33 +17,4 @@ import java.util.HashMap; @AllArgsConstructor @Service public class InviteService { - private final PartieRepository partieRepository; - private final JoueurRepository joueurRepository; - - @PersistenceContext - private EntityManager entityManager; - - @Transactional - public HashMap findByInvite(String invite, String pseudo) { - Partie partie = this.partieRepository.getPartieByCodeInvitation(invite).orElseThrow(() -> new InviteNotFoundException(invite)); - - if(!partie.getStatus().equals("pending")) throw new PartyAlreadyStartedException(); - - HashMap response = new HashMap<>(); - response.put("partieId", partie.getId()); - - Joueur joueur = new Joueur(); - joueur.setPseudo(pseudo); - - joueur = joueurRepository.save(joueur); - - entityManager.createNativeQuery("UPDATE joueur SET idpartie = ? WHERE id = ?") - .setParameter(1, partie.getId()) - .setParameter(2, joueur.getId()) - .executeUpdate(); - - response.put("joueurId", joueur.getId()); - - return response; - } } 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 index c758c9b..49a186f 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieService.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/services/PartieService.java @@ -2,19 +2,12 @@ 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.MalformedPartyException; -import fr.iut.sciencequest.sae.exceptions.notFound.JeuNotFoundException; import fr.iut.sciencequest.sae.exceptions.notFound.PartieNotFoundException; -import fr.iut.sciencequest.sae.exceptions.notFound.ThematiqueNotFoundException; import fr.iut.sciencequest.sae.repositories.*; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Date; -import java.util.List; @AllArgsConstructor @Service @@ -40,6 +33,21 @@ public class PartieService { 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());