ajout route pour ajouter des joueurs à une partie

Springboot
Victor SOULIER 1 year ago
parent 0d6c771c26
commit c5009c3d35

@ -1,7 +1,8 @@
package fr.iut.sciencequest.sae.controllers; 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 fr.iut.sciencequest.sae.services.InviteService;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -13,9 +14,4 @@ import java.util.HashMap;
@RequestMapping("/api/v1/invite") @RequestMapping("/api/v1/invite")
public class InviteController { public class InviteController {
private final InviteService inviteService; private final InviteService inviteService;
@GetMapping(value = "/{invite}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public HashMap<String, Object> getParty(@PathVariable String invite, @RequestBody InviteRequest inviteRequest) {
return this.inviteService.findByInvite(invite, inviteRequest.getPseudo());
}
} }

@ -1,11 +1,13 @@
package fr.iut.sciencequest.sae.controllers; package fr.iut.sciencequest.sae.controllers;
import fr.iut.sciencequest.sae.assemblers.PartieModelAssembler; 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.controllers.request.PartieRequest;
import fr.iut.sciencequest.sae.dto.partie.PartieDTO; import fr.iut.sciencequest.sae.dto.partie.PartieDTO;
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.exceptions.notFound.PartieNotFoundException; 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.JeuService;
import fr.iut.sciencequest.sae.services.JoueurService; import fr.iut.sciencequest.sae.services.JoueurService;
import fr.iut.sciencequest.sae.services.PartieService; 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) @RequestMapping(value = "/{codeInvitation}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public PartieDTO getPartie(@PathVariable String codeInvitation) { public PartieDTO getPartie(@PathVariable String codeInvitation) {
//try to get invitation from codeInvitation, if not : try with id return partieModelAssembler.toModel(this.partieService.getPartieByIdOrCodeInvitation(codeInvitation));
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);
} }
@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)
@ -58,4 +49,16 @@ public class PartieController {
return this.modelMapper.map(partie, PartieDTO.class); 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);
}
} }

@ -1,8 +0,0 @@
package fr.iut.sciencequest.sae.controllers.request;
import lombok.Data;
@Data
public class InviteRequest {
private String pseudo;
}

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

@ -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<InviteWithPseudoOnlyDTO> {
@NotBlank
private String pseudo;
}

@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Fetch; import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.FetchMode;
@ -27,5 +28,6 @@ public class Joueur {
@ManyToOne @ManyToOne
@JoinColumn(name = "idpartie") @JoinColumn(name = "idpartie")
@Fetch(FetchMode.JOIN) @Fetch(FetchMode.JOIN)
@EqualsAndHashCode.Exclude
private Partie partie; private Partie partie;
} }

@ -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.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;

@ -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.http.HttpStatus;

@ -2,7 +2,7 @@ package fr.iut.sciencequest.sae.services;
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.exceptions.PartyAlreadyStartedException; import fr.iut.sciencequest.sae.exceptions.partie.PartyAlreadyStartedException;
import fr.iut.sciencequest.sae.exceptions.notFound.InviteNotFoundException; import fr.iut.sciencequest.sae.exceptions.notFound.InviteNotFoundException;
import fr.iut.sciencequest.sae.repositories.JoueurRepository; import fr.iut.sciencequest.sae.repositories.JoueurRepository;
import fr.iut.sciencequest.sae.repositories.PartieRepository; import fr.iut.sciencequest.sae.repositories.PartieRepository;
@ -17,33 +17,4 @@ import java.util.HashMap;
@AllArgsConstructor @AllArgsConstructor
@Service @Service
public class InviteService { public class InviteService {
private final PartieRepository partieRepository;
private final JoueurRepository joueurRepository;
@PersistenceContext
private EntityManager entityManager;
@Transactional
public HashMap<String, Object> findByInvite(String invite, String pseudo) {
Partie partie = this.partieRepository.getPartieByCodeInvitation(invite).orElseThrow(() -> new InviteNotFoundException(invite));
if(!partie.getStatus().equals("pending")) throw new PartyAlreadyStartedException();
HashMap<String, Object> 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;
}
} }

@ -2,19 +2,12 @@ package fr.iut.sciencequest.sae.services;
import fr.iut.sciencequest.sae.entities.*; import fr.iut.sciencequest.sae.entities.*;
import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException; 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.PartieNotFoundException;
import fr.iut.sciencequest.sae.exceptions.notFound.ThematiqueNotFoundException;
import fr.iut.sciencequest.sae.repositories.*; import fr.iut.sciencequest.sae.repositories.*;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceContext;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@Service @Service
@ -40,6 +33,21 @@ public class PartieService {
return this.partieRepository.getPartieByCodeInvitation(codeInvitation).orElseThrow(() -> new PartieNotFoundException("codeInvitation", 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){ public Partie update(Partie partie){
if(!this.partieRepository.existsById(partie.getId())){ if(!this.partieRepository.existsById(partie.getId())){
throw new PartieNotFoundException(partie.getId()); throw new PartieNotFoundException(partie.getId());

Loading…
Cancel
Save