diff --git a/SpringBootProject/pom.xml b/SpringBootProject/pom.xml index 56c9fab..42c773a 100644 --- a/SpringBootProject/pom.xml +++ b/SpringBootProject/pom.xml @@ -41,6 +41,10 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-starter-hateoas diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/ApplicationConfig.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/ApplicationConfig.java new file mode 100644 index 0000000..62d7b2a --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/ApplicationConfig.java @@ -0,0 +1,18 @@ +package fr.iut.sciencequest.sae; + +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.web.accept.FixedContentNegotiationStrategy; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +public class ApplicationConfig implements WebMvcConfigurer { + // Permet de forcer l'affichage des erreurs en JSON sans prendre en compte les headers du client + @Override + public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { + configurer.strategies(List.of(new FixedContentNegotiationStrategy(MediaType.APPLICATION_JSON))); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..51747ea --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java @@ -0,0 +1,52 @@ +package fr.iut.sciencequest.sae.controllers; + +import fr.iut.sciencequest.sae.entities.Partie; +import fr.iut.sciencequest.sae.exceptions.DuplicatedEntity; +import fr.iut.sciencequest.sae.exceptions.PartieNotFoundException; +import fr.iut.sciencequest.sae.repositories.PartieRepository; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.Link; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; + +import javax.print.attribute.standard.Media; +import java.util.Optional; + +@RestController +@RequestMapping("/api/v1/partie") +public class PartieController { + + private static final int PAGE_SIZE = 5; + private final PartieRepository partieRepository; + + public PartieController(PartieRepository partieRepository) { + this.partieRepository = partieRepository; + } + + @RequestMapping(value = "/{id}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public EntityModel> getPartie(@PathVariable int id, HttpServletRequest request) { + Optional partieOptional = this.partieRepository.findById(id); + Partie partie = partieOptional.orElseThrow(() -> + new PartieNotFoundException("Partie introuvable avec l'ID : " + id) + ); + + Link selfLink = linkTo(methodOn(PartieController.class).getPartie(id,request)).withSelfRel(); + return EntityModel.of(Optional.ofNullable(partie), selfLink); + } + + @RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public Partie createPartie(@RequestBody Partie partie) { + try { + return this.partieRepository.save(partie); + } catch (DataIntegrityViolationException e) { + throw new DuplicatedEntity("ERREUR : il existe déjà une partie : " + partie.getId() + " en base"); + } + } + + +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java index 852825b..484b1c7 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java @@ -55,7 +55,7 @@ public class QuestionController { return result; } catch (IllegalArgumentException e) { - throw new IncorrectPageException(request.getRequestURI(), "numéro de page incorrect"); + throw new IncorrectPageException("numéro de page incorrect"); } } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java index c611094..5127c6a 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java @@ -2,71 +2,117 @@ package fr.iut.sciencequest.sae.controllers; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; +import fr.iut.sciencequest.sae.entities.Indice; import fr.iut.sciencequest.sae.entities.Scientifique; +import fr.iut.sciencequest.sae.exceptions.DuplicatedEntity; import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; import fr.iut.sciencequest.sae.exceptions.ScientifiqueNotFoundException; +import fr.iut.sciencequest.sae.repositories.IndiceRepository; import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository; -import jakarta.servlet.http.HttpServletRequest; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; -@Controller() +@RestController @RequestMapping("/api/v1/scientifiques") public class ScientifiqueController { - private static final int PAGE_SIZE = 10; + private static final int PAGE_SIZE = 1; + private final ScientifiqueRepository scientifiqueRepository; + private final IndiceRepository indiceRepository; - public ScientifiqueController(ScientifiqueRepository scientifiqueRepository) { + public ScientifiqueController(ScientifiqueRepository scientifiqueRepository, IndiceRepository indiceRepository) { this.scientifiqueRepository = scientifiqueRepository; + this.indiceRepository = indiceRepository; } - @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public CollectionModel> getAllScientists(@RequestParam(name = "page") Optional page, HttpServletRequest request) { + public CollectionModel> getAllScientists(@RequestParam(name = "page") Optional page) { try { Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE); Page pagedResult = scientifiqueRepository.findAll(paging); List> scientifiques = pagedResult.map(EntityModel::of).toList(); - Link selfLink = linkTo(methodOn(ScientifiqueController.class).getAllScientists(page, request)).withSelfRel().expand(page.map(Object::toString).orElse("0")); + Link selfLink = linkTo(methodOn(ScientifiqueController.class).getAllScientists(page)).withSelfRel().expand(page.map(Object::toString).orElse("0")); CollectionModel> result = CollectionModel.of(scientifiques, selfLink); if (pagedResult.hasPrevious()) { - Link prevLink = linkTo(methodOn(QuestionController.class).getAllQuestions(Optional.of(pagedResult.previousPageable().getPageNumber()), request)).withRel("previous"); + Link prevLink = linkTo(methodOn(ScientifiqueController.class).getAllScientists(Optional.of(pagedResult.previousPageable().getPageNumber()))).withRel("previous"); result.add(prevLink.expand(pagedResult.previousPageable().getPageNumber())); } if (pagedResult.hasNext()) { - Link nextLink = linkTo(methodOn(QuestionController.class).getAllQuestions(Optional.of(pagedResult.nextPageable().getPageNumber()), request)).withRel("next"); + Link nextLink = linkTo(methodOn(ScientifiqueController.class).getAllScientists(Optional.of(pagedResult.nextPageable().getPageNumber()))).withRel("next"); result.add(nextLink.expand(pagedResult.nextPageable().getPageNumber())); } return result; } catch (IllegalArgumentException e) { - throw new IncorrectPageException(request.getRequestURI(), "numéro de page incorrect"); + throw new IncorrectPageException("numéro de page incorrect"); } } - @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public EntityModel> getScientistById(@PathVariable int id, HttpServletRequest request) { + public EntityModel> getScientistById(@PathVariable int id) { Optional scientifiqueOptional = this.scientifiqueRepository.findById(id); - Scientifique scientifique = scientifiqueOptional.orElseThrow(() -> new ScientifiqueNotFoundException(request.getRequestURI(), "Scientifique non trouvé avec l'ID : " + id)); + Scientifique scientifique = scientifiqueOptional.orElseThrow(() -> new ScientifiqueNotFoundException("Scientifique non trouvé avec l'ID : " + id)); - Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistById(id, request)).withSelfRel(); + Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistById(id)).withSelfRel(); return EntityModel.of(Optional.ofNullable(scientifique), selfLink); } + + @GetMapping(value="/{id}/indices", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public CollectionModel> getScientistHints(@PathVariable int id, @RequestParam(name = "page") Optional page) { + try { + Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE); + Page pagedResult = indiceRepository.findAll(paging); + + List> indices = pagedResult.map(EntityModel::of).toList(); + + Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistHints(id, page)).withSelfRel().expand(page.map(Object::toString).orElse("0")); + + CollectionModel> result = CollectionModel.of(indices, selfLink); + + if (pagedResult.hasPrevious()) { + Link prevLink = linkTo(methodOn(ScientifiqueController.class).getScientistHints(id, Optional.of(pagedResult.previousPageable().getPageNumber()))).withRel("previous"); + result.add(prevLink.expand(pagedResult.previousPageable().getPageNumber())); + } + + if (pagedResult.hasNext()) { + Link nextLink = linkTo(methodOn(ScientifiqueController.class).getScientistHints(id, Optional.of(pagedResult.nextPageable().getPageNumber()))).withRel("next"); + result.add(nextLink.expand(pagedResult.nextPageable().getPageNumber())); + } + + return result; + } catch (IllegalArgumentException e) { + throw new IncorrectPageException("numéro de page incorrect"); + } + } + + @PostMapping(value="/{id}/indices", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public Indice postIndice(@RequestBody Indice indice){ + try{ + + return this.indiceRepository.save(indice); + } catch (DataIntegrityViolationException e){ + throw new DuplicatedEntity(e.getMessage()); + } + } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java index 96b3d68..ef6401c 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java @@ -1,28 +1,40 @@ package fr.iut.sciencequest.sae.controllers; import fr.iut.sciencequest.sae.entities.Thematique; +import fr.iut.sciencequest.sae.exceptions.DuplicatedEntity; import fr.iut.sciencequest.sae.repositories.ThematiqueRepository; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; -@Controller +@RestController @RequestMapping("/api/v1/thematiques") public class ThematiqueController { + private final ThematiqueRepository thematiqueRepository; public ThematiqueController(ThematiqueRepository thematiqueRepository) { this.thematiqueRepository = thematiqueRepository; } - @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody + @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) public Iterable getAllThematiques() { return this.thematiqueRepository.findAll(); } @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - - @ResponseBody - public Thematique postThematique(@) + @ResponseStatus(HttpStatus.CREATED) + public Thematique postThematique(@RequestBody Thematique thematique, HttpServletRequest request){ + if(this.thematiqueRepository.existsById(thematique.getId())) + throw new DuplicatedEntity("Une thématique avec l'ID "+thematique.getId()+" existe déjà"); + try{ + thematique = this.thematiqueRepository.save(thematique); + return thematique; + } catch (DataIntegrityViolationException e) { + throw new DuplicatedEntity("Une thématique avec le libelle : " + thematique.getLibelle() + " existe déjà"); + } + } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Admin.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Admin.java index 313fb99..f53d4ca 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Admin.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Admin.java @@ -1,6 +1,9 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,8 +15,18 @@ import lombok.NoArgsConstructor; @Table(name="admin") public class Admin { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; - private String email, password; + @Email(message="Veuillez fournir une adresse mail valide") + @NotNull + @NotBlank + @Column(unique = true) + private String email; + + @NotNull + @NotBlank + @Column() + private String password; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Difficulte.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Difficulte.java index 953c773..dcfcfef 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Difficulte.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Difficulte.java @@ -1,6 +1,8 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -13,7 +15,11 @@ import lombok.NoArgsConstructor; @Table(name="difficulte") public class Difficulte { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + + @NotBlank + @Column(unique = true) private String libelle; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java index f6bb849..1d919ed 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java @@ -1,6 +1,8 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,8 +14,13 @@ import lombok.NoArgsConstructor; @Table(name="indice") public class Indice { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + + @NotBlank private String libelle; - //private Scientifique scientifique; + + @NotNull + private int idScientifique; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Jeu.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Jeu.java index 3bb7ea4..4c740a4 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Jeu.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Jeu.java @@ -1,9 +1,13 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.bind.DefaultValue; @NoArgsConstructor @AllArgsConstructor @@ -12,9 +16,15 @@ import lombok.NoArgsConstructor; @Table(name="jeu") public class Jeu { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + + @NotBlank + @Column(unique = true) private String nom; + @Column(name = "nbrparties") - private int nbrParties; + @Min(0) + private int nbrParties = 0; } 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 95d40ce..d3005b7 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 @@ -1,6 +1,8 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -13,8 +15,12 @@ import lombok.NoArgsConstructor; @Table(name="joueur") public abstract class Joueur { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + + @NotBlank + @Column(unique = true) private String pseudo; //private Partie partie; } 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 b8a52ae..455dfef 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 @@ -1,6 +1,7 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; @@ -15,9 +16,11 @@ import java.util.Set; @Table(name="partie") public class Partie { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; - @Column(name = "codeinvitation") + + @Column(name = "codeinvitation", unique = true) private String codeInvitation; /*private Jeu jeu; @Getter() private Set joueurs; diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Question.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Question.java index 26dbf11..4290c17 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Question.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Question.java @@ -1,5 +1,7 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -14,10 +16,12 @@ import java.util.List; @Table(name="question") public class Question { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String question; + @NotEmpty @OneToMany(mappedBy = "id") private List reponses; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Reponse.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Reponse.java index ea2033f..c3924e1 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Reponse.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Reponse.java @@ -1,6 +1,7 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,8 +13,11 @@ import lombok.NoArgsConstructor; @Table(name="reponse") public class Reponse { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + + @NotNull private String reponse; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Scientifique.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Scientifique.java index 6665ea9..336cae0 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Scientifique.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Scientifique.java @@ -1,6 +1,9 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; @@ -15,13 +18,16 @@ import java.util.Date; @Table(name = "scientifique") public class Scientifique { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + @NotNull @ManyToOne @JoinColumn(name="iddifficulte") private Difficulte difficulte; + @NotNull @ManyToOne @JoinColumn(name="idthematique") private Thematique thematique; @@ -29,13 +35,24 @@ public class Scientifique { @Column(name = "photo") private String pathToPhoto; - private String nom, prenom, descriptif; + @NotBlank + private String nom; + @NotBlank + private String prenom; + + @NotBlank + private String descriptif; + + @NotBlank @Column(name = "datenaissance") private Date dateNaissance; - private char sexe; + @NotBlank + @Enumerated(EnumType.STRING) + private Sexe sexe; @Column(name = "ratiotrouvee") - private double ratioTrouve; + @Size(min=0, max=1) + private double ratioTrouve = 0.0; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Sexe.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Sexe.java new file mode 100644 index 0000000..e064ef7 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Sexe.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.entities; + +public enum Sexe { + F, + H +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Thematique.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Thematique.java index 75b3a51..e825295 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Thematique.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Thematique.java @@ -1,6 +1,8 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,7 +14,11 @@ import lombok.NoArgsConstructor; @Table(name="thematique") public class Thematique { @Id + @NotNull @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + + @NotBlank + @Column(unique = true) private String libelle; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Utilisateur.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Utilisateur.java index a580fc4..05ee7ee 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Utilisateur.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Utilisateur.java @@ -2,6 +2,9 @@ package fr.iut.sciencequest.sae.entities; import jakarta.persistence.*; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -14,9 +17,13 @@ import lombok.NoArgsConstructor; @Entity @Table(name="utilisateur") public class Utilisateur extends Joueur{ + @Email(message="Veuillez fournir une adresse mail valide") + @NotNull + @Column(unique = true) private String email; + + @NotBlank @Column(name = "motdepasse") private String motDePasse; - private String pseudo; } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/DuplicatedEntity.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/DuplicatedEntity.java new file mode 100644 index 0000000..8bfefa0 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/DuplicatedEntity.java @@ -0,0 +1,12 @@ +package fr.iut.sciencequest.sae.exceptions; + + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.CONFLICT) +public class DuplicatedEntity extends RuntimeException { + public DuplicatedEntity(String message){ + super(message); + } +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/IncorrectPageException.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/IncorrectPageException.java index 9a807bf..57fbd68 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/IncorrectPageException.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/IncorrectPageException.java @@ -1,9 +1,12 @@ package fr.iut.sciencequest.sae.exceptions; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_ACCEPTABLE) public class IncorrectPageException extends RuntimeException { - public final String uri; - public IncorrectPageException(String uri, String exception) { + + public IncorrectPageException(String exception) { super(exception); - this.uri = uri; } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartieNotFoundException.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartieNotFoundException.java new file mode 100644 index 0000000..da3d34c --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartieNotFoundException.java @@ -0,0 +1,12 @@ +package fr.iut.sciencequest.sae.exceptions; + + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) +public class PartieNotFoundException extends RuntimeException{ + public PartieNotFoundException(String message) { + super(message); + } +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/ScientifiqueNotFoundException.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/ScientifiqueNotFoundException.java index dbe86ec..b5fbe36 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/ScientifiqueNotFoundException.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/ScientifiqueNotFoundException.java @@ -1,10 +1,12 @@ package fr.iut.sciencequest.sae.exceptions; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.NOT_FOUND) public class ScientifiqueNotFoundException extends RuntimeException { - public final String uri; - public ScientifiqueNotFoundException(String uri, String exception) { - super(exception); - this.uri = uri; + public ScientifiqueNotFoundException(String message) { + super(message); } } diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/IncorrectPageAdvice.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/IncorrectPageAdvice.java deleted file mode 100644 index 30ea8b5..0000000 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/IncorrectPageAdvice.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.iut.sciencequest.sae.exceptions.advices; - -import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.sql.Timestamp; -import java.util.HashMap; -import java.util.Map; - -@ControllerAdvice -public class IncorrectPageAdvice { - @ResponseBody - @ExceptionHandler(IncorrectPageException.class) - @ResponseStatus(HttpStatus.NOT_ACCEPTABLE) - Map exceptionHandler(IncorrectPageException ex) { - Map map = new HashMap<>(); - map.put("timestamp", String.valueOf(new Timestamp(System.currentTimeMillis()))); - map.put("error", ex.getMessage()); - map.put("status", HttpStatus.NOT_ACCEPTABLE.value()); - map.put("path", ex.uri); - return map; - } -} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/ScientifiqueNotFoundAdvice.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/ScientifiqueNotFoundAdvice.java deleted file mode 100644 index 99e5ae4..0000000 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/ScientifiqueNotFoundAdvice.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.iut.sciencequest.sae.exceptions.advices; - -import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.sql.Timestamp; -import java.util.HashMap; -import java.util.Map; - -@ControllerAdvice -public class ScientifiqueNotFoundAdvice { - @ResponseBody - @ExceptionHandler(IncorrectPageException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - Map exceptionHandler(IncorrectPageException ex) { - Map map = new HashMap<>(); - map.put("timestamp", String.valueOf(new Timestamp(System.currentTimeMillis()))); - map.put("error", ex.getMessage()); - map.put("status", HttpStatus.NOT_FOUND.value()); - map.put("path", ex.uri); - return map; - } -} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/AdminRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/AdminRepository.java index 241c437..f17aa0d 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/AdminRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/AdminRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Admin; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface AdminRepository extends CrudRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/DifficulteRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/DifficulteRepository.java index bc3c4f6..c3a49ec 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/DifficulteRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/DifficulteRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Difficulte; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface DifficulteRepository extends CrudRepository {} \ No newline at end of file diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java index a0e026a..62fa68b 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java @@ -2,5 +2,10 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Indice; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; -public interface IndiceRepository extends CrudRepository {} \ No newline at end of file +@Repository +public interface IndiceRepository extends PagingAndSortingRepository, CrudRepository { + +} \ No newline at end of file diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/InviteRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/InviteRepository.java index 1f4e346..cb89deb 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/InviteRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/InviteRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Invite; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface InviteRepository extends CrudRepository {} \ No newline at end of file diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JeuRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JeuRepository.java index ca5b3ad..5d237b9 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JeuRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JeuRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Jeu; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface JeuRepository extends CrudRepository {} \ No newline at end of file diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JoueurRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JoueurRepository.java index 2a9412b..61ae108 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JoueurRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JoueurRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Joueur; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface JoueurRepository extends CrudRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieRepository.java index 8129c91..0de5afa 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Partie; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface PartieRepository extends CrudRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/QuestionRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/QuestionRepository.java index ffd649e..0a5a69e 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/QuestionRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/QuestionRepository.java @@ -5,5 +5,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; +@Repository public interface QuestionRepository extends PagingAndSortingRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ReponseRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ReponseRepository.java index 4a250e1..8eff9b1 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ReponseRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ReponseRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Reponse; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface ReponseRepository extends CrudRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java index 04f1950..c47a28a 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java @@ -3,5 +3,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Scientifique; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; +@Repository public interface ScientifiqueRepository extends PagingAndSortingRepository, CrudRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ThematiqueRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ThematiqueRepository.java index a6a67fd..d57aec4 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ThematiqueRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ThematiqueRepository.java @@ -2,5 +2,8 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Thematique; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository public interface ThematiqueRepository extends CrudRepository {} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/UtilisateurRepository.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/UtilisateurRepository.java index 1d98fe5..ec10a32 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/UtilisateurRepository.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/UtilisateurRepository.java @@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories; import fr.iut.sciencequest.sae.entities.Utilisateur; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +@Repository public interface UtilisateurRepository extends CrudRepository {} \ No newline at end of file diff --git a/SpringBootProject/src/main/resources/application.properties b/SpringBootProject/src/main/resources/application.properties index a5b376c..2e130ca 100644 --- a/SpringBootProject/src/main/resources/application.properties +++ b/SpringBootProject/src/main/resources/application.properties @@ -4,4 +4,5 @@ spring.datasource.password=password974519874185$976 spring.datasource.driver-class-name=org.postgresql.Driver spring.sql.init.mode=always spring.sql.init.schema-locations=classpath:schema.sql -spring.jackson.serialization.indent_output = true \ No newline at end of file +spring.jackson.serialization.indent_output = true +server.error.include-message=always \ No newline at end of file diff --git a/SpringBootProject/src/main/resources/schema.sql b/SpringBootProject/src/main/resources/schema.sql index 6f75065..6f13849 100644 --- a/SpringBootProject/src/main/resources/schema.sql +++ b/SpringBootProject/src/main/resources/schema.sql @@ -153,6 +153,11 @@ VALUES ('Quel mathématicien a dit : « Dieu existe, c’est les mathématiques » ?'), ('Quel mathématicienne utilisa comme nom d"emprunt « Antoine Auguste Le Blanc » ?'); +-- Indices +INSERT INTO Indice (id, libelle, idscientifique) VALUES + (1, 'Indice pour aider', 1), + (2, 'S''appelle Marie', 1); + -- Réponses INSERT INTO Reponse(reponse, idQuestion, idScientifique) VALUES