From 5ee71a4538438b3522bb245458e7ceb9d2c34a46 Mon Sep 17 00:00:00 2001 From: Alix JEUDI--LEMOINE Date: Tue, 27 Feb 2024 00:05:37 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Travail=20groupe=20API=20journ=C3=A9e=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBootProject/pom.xml | 8 + .../iut/sciencequest/sae/SaeApplication.java | 1 - .../sae/controllers/QuestionController.java | 62 +++++++ .../controllers/ScientifiqueController.java | 72 ++++++++ .../sae/controllers/ThematiqueController.java | 28 +++ .../iut/sciencequest/sae/entities/Admin.java | 19 ++ .../sciencequest/sae/entities/Difficulte.java | 19 ++ .../iut/sciencequest/sae/entities/Indice.java | 19 ++ .../iut/sciencequest/sae/entities/Invite.java | 15 ++ .../fr/iut/sciencequest/sae/entities/Jeu.java | 20 ++ .../iut/sciencequest/sae/entities/Joueur.java | 20 ++ .../iut/sciencequest/sae/entities/Partie.java | 33 ++++ .../sciencequest/sae/entities/Question.java | 24 +++ .../sciencequest/sae/entities/Reponse.java | 19 ++ .../sae/entities/Scientifique.java | 41 +++++ .../sciencequest/sae/entities/Thematique.java | 18 ++ .../sae/entities/Utilisateur.java | 22 +++ .../exceptions/IncorrectPageException.java | 9 + .../ScientifiqueNotFoundException.java | 10 + .../advices/IncorrectPageAdvice.java | 27 +++ .../advices/ScientifiqueNotFoundAdvice.java | 27 +++ .../sae/repositories/AdminRepository.java | 6 + .../repositories/DifficulteRepository.java | 6 + .../sae/repositories/IndiceRepository.java | 6 + .../sae/repositories/InviteRepository.java | 6 + .../sae/repositories/JeuRepository.java | 6 + .../sae/repositories/JoueurRepository.java | 6 + .../sae/repositories/PartieRepository.java | 6 + .../sae/repositories/QuestionRepository.java | 9 + .../sae/repositories/ReponseRepository.java | 6 + .../repositories/ScientifiqueRepository.java | 7 + .../repositories/ThematiqueRepository.java | 6 + .../repositories/UtilisateurRepository.java | 6 + .../src/main/resources/application.properties | 8 +- .../src/main/resources/schema.sql | 171 ++++++++++++++++++ 35 files changed, 766 insertions(+), 2 deletions(-) create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Admin.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Difficulte.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Invite.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Jeu.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Joueur.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Partie.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Question.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Reponse.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Scientifique.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Thematique.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Utilisateur.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/IncorrectPageException.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/ScientifiqueNotFoundException.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/IncorrectPageAdvice.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/ScientifiqueNotFoundAdvice.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/AdminRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/DifficulteRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/InviteRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JeuRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JoueurRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/QuestionRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ReponseRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ThematiqueRepository.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/UtilisateurRepository.java create mode 100644 SpringBootProject/src/main/resources/schema.sql diff --git a/SpringBootProject/pom.xml b/SpringBootProject/pom.xml index df5e722..56c9fab 100644 --- a/SpringBootProject/pom.xml +++ b/SpringBootProject/pom.xml @@ -37,6 +37,14 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-hateoas + diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/SaeApplication.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/SaeApplication.java index e4c25d6..3595451 100644 --- a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/SaeApplication.java +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/SaeApplication.java @@ -9,5 +9,4 @@ public class SaeApplication { public static void main(String[] args) { SpringApplication.run(SaeApplication.class, args); } - } 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 new file mode 100644 index 0000000..852825b --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/QuestionController.java @@ -0,0 +1,62 @@ +package fr.iut.sciencequest.sae.controllers; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; + +import fr.iut.sciencequest.sae.entities.Question; +import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; +import fr.iut.sciencequest.sae.repositories.QuestionRepository; +import jakarta.servlet.http.HttpServletRequest; +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.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.Optional; +import java.util.List; + +@Controller +@RequestMapping("/api/v1/questions") +public class QuestionController { + + private static final int PAGE_SIZE = 10; + private final QuestionRepository questionRepository; + + public QuestionController(QuestionRepository questionRepository) { + this.questionRepository = questionRepository; + } + + @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public CollectionModel> getAllQuestions(@RequestParam(name = "page") Optional page, HttpServletRequest request) { + try { + Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE); + Page pagedResult = questionRepository.findAll(paging); + + List> questions = pagedResult.map(EntityModel::of).toList(); + + Link selfLink = linkTo(methodOn(QuestionController.class).getAllQuestions(page, request)).withSelfRel().expand(page.map(Object::toString).orElse("0")); + + CollectionModel> result = CollectionModel.of(questions, selfLink); + + if (pagedResult.hasPrevious()) { + Link prevLink = linkTo(methodOn(QuestionController.class).getAllQuestions(Optional.of(pagedResult.previousPageable().getPageNumber()), request)).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"); + result.add(nextLink.expand(pagedResult.nextPageable().getPageNumber())); + } + + return result; + } catch (IllegalArgumentException e) { + throw new IncorrectPageException(request.getRequestURI(), "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 new file mode 100644 index 0000000..c611094 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ScientifiqueController.java @@ -0,0 +1,72 @@ +package fr.iut.sciencequest.sae.controllers; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; + +import fr.iut.sciencequest.sae.entities.Scientifique; +import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; +import fr.iut.sciencequest.sae.exceptions.ScientifiqueNotFoundException; +import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository; +import jakarta.servlet.http.HttpServletRequest; +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.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +@Controller() +@RequestMapping("/api/v1/scientifiques") +public class ScientifiqueController { + + private static final int PAGE_SIZE = 10; + private final ScientifiqueRepository scientifiqueRepository; + + public ScientifiqueController(ScientifiqueRepository scientifiqueRepository) { + this.scientifiqueRepository = scientifiqueRepository; + } + + @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public CollectionModel> getAllScientists(@RequestParam(name = "page") Optional page, HttpServletRequest request) { + 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")); + + CollectionModel> result = CollectionModel.of(scientifiques, selfLink); + + if (pagedResult.hasPrevious()) { + Link prevLink = linkTo(methodOn(QuestionController.class).getAllQuestions(Optional.of(pagedResult.previousPageable().getPageNumber()), request)).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"); + result.add(nextLink.expand(pagedResult.nextPageable().getPageNumber())); + } + + return result; + } catch (IllegalArgumentException e) { + throw new IncorrectPageException(request.getRequestURI(), "numéro de page incorrect"); + } + } + + @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public EntityModel> getScientistById(@PathVariable int id, HttpServletRequest request) { + Optional scientifiqueOptional = this.scientifiqueRepository.findById(id); + Scientifique scientifique = scientifiqueOptional.orElseThrow(() -> new ScientifiqueNotFoundException(request.getRequestURI(), "Scientifique non trouvé avec l'ID : " + id)); + + Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistById(id, request)).withSelfRel(); + return EntityModel.of(Optional.ofNullable(scientifique), selfLink); + } +} 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 new file mode 100644 index 0000000..96b3d68 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/ThematiqueController.java @@ -0,0 +1,28 @@ +package fr.iut.sciencequest.sae.controllers; + +import fr.iut.sciencequest.sae.entities.Thematique; +import fr.iut.sciencequest.sae.repositories.ThematiqueRepository; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +@Controller +@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 + public Iterable getAllThematiques() { + return this.thematiqueRepository.findAll(); + } + + @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + + @ResponseBody + public Thematique postThematique(@) +} 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 new file mode 100644 index 0000000..313fb99 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Admin.java @@ -0,0 +1,19 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name="admin") +public class Admin { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + private String email, 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 new file mode 100644 index 0000000..953c773 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Difficulte.java @@ -0,0 +1,19 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name="difficulte") +public class Difficulte { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + 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 new file mode 100644 index 0000000..f6bb849 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Indice.java @@ -0,0 +1,19 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name="indice") +public class Indice { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + private String libelle; + //private Scientifique scientifique; +} diff --git a/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Invite.java b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Invite.java new file mode 100644 index 0000000..8c316a7 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Invite.java @@ -0,0 +1,15 @@ +package fr.iut.sciencequest.sae.entities; + + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +@Entity +@Table(name = "invite") +public class Invite extends Joueur{ +} 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 new file mode 100644 index 0000000..3bb7ea4 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Jeu.java @@ -0,0 +1,20 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name="jeu") +public class Jeu { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + private String nom; + @Column(name = "nbrparties") + private int nbrParties; +} 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 new file mode 100644 index 0000000..95d40ce --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Joueur.java @@ -0,0 +1,20 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Inheritance ( strategy = InheritanceType.JOINED) +@Entity +@Table(name="joueur") +public abstract class Joueur { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + 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 new file mode 100644 index 0000000..b8a52ae --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Partie.java @@ -0,0 +1,33 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Entity +@Table(name="partie") +public class Partie { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + @Column(name = "codeinvitation") + private String codeInvitation; + /*private Jeu jeu; + @Getter() private Set joueurs; + + public boolean add(Joueur joueur){ + return this.joueurs.add(joueur); + } + + public boolean remove(Joueur joueur){ + return this.joueurs.remove(joueur); + } + */ +} 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 new file mode 100644 index 0000000..26dbf11 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Question.java @@ -0,0 +1,24 @@ +package fr.iut.sciencequest.sae.entities; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Entity +@Table(name="question") +public class Question { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + private String question; + + @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 new file mode 100644 index 0000000..ea2033f --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Reponse.java @@ -0,0 +1,19 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Entity +@Table(name="reponse") +public class Reponse { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + 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 new file mode 100644 index 0000000..6665ea9 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Scientifique.java @@ -0,0 +1,41 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.hibernate.annotations.Type; + +import java.util.Date; + +@AllArgsConstructor +@RequiredArgsConstructor +@Data +@Entity +@Table(name = "scientifique") +public class Scientifique { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @ManyToOne + @JoinColumn(name="iddifficulte") + private Difficulte difficulte; + + @ManyToOne + @JoinColumn(name="idthematique") + private Thematique thematique; + + @Column(name = "photo") + private String pathToPhoto; + + private String nom, prenom, descriptif; + + @Column(name = "datenaissance") + private Date dateNaissance; + + private char sexe; + + @Column(name = "ratiotrouvee") + private double ratioTrouve; +} 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 new file mode 100644 index 0000000..75b3a51 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Thematique.java @@ -0,0 +1,18 @@ +package fr.iut.sciencequest.sae.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name="thematique") +public class Thematique { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + 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 new file mode 100644 index 0000000..a580fc4 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Utilisateur.java @@ -0,0 +1,22 @@ +package fr.iut.sciencequest.sae.entities; + + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +@Data +@Entity +@Table(name="utilisateur") +public class Utilisateur extends Joueur{ + private String email; + @Column(name = "motdepasse") + private String motDePasse; + private String pseudo; +} + 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 new file mode 100644 index 0000000..9a807bf --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/IncorrectPageException.java @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.sae.exceptions; + +public class IncorrectPageException extends RuntimeException { + public final String uri; + public IncorrectPageException(String uri, String exception) { + super(exception); + this.uri = uri; + } +} 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 new file mode 100644 index 0000000..dbe86ec --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/ScientifiqueNotFoundException.java @@ -0,0 +1,10 @@ +package fr.iut.sciencequest.sae.exceptions; + +public class ScientifiqueNotFoundException extends RuntimeException { + public final String uri; + + public ScientifiqueNotFoundException(String uri, String exception) { + super(exception); + this.uri = uri; + } +} 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 new file mode 100644 index 0000000..30ea8b5 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/IncorrectPageAdvice.java @@ -0,0 +1,27 @@ +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 new file mode 100644 index 0000000..99e5ae4 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/ScientifiqueNotFoundAdvice.java @@ -0,0 +1,27 @@ +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 new file mode 100644 index 0000000..241c437 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/AdminRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Admin; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..bc3c4f6 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/DifficulteRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Difficulte; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..a0e026a --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/IndiceRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Indice; +import org.springframework.data.repository.CrudRepository; + +public interface IndiceRepository extends 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 new file mode 100644 index 0000000..1f4e346 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/InviteRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Invite; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..ca5b3ad --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JeuRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Jeu; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..2a9412b --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/JoueurRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Joueur; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..8129c91 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/PartieRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Partie; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..ffd649e --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/QuestionRepository.java @@ -0,0 +1,9 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Question; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; + +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 new file mode 100644 index 0000000..4a250e1 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ReponseRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Reponse; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..04f1950 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ScientifiqueRepository.java @@ -0,0 +1,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; + +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 new file mode 100644 index 0000000..a6a67fd --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/ThematiqueRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Thematique; +import org.springframework.data.repository.CrudRepository; + +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 new file mode 100644 index 0000000..1d98fe5 --- /dev/null +++ b/SpringBootProject/src/main/java/fr/iut/sciencequest/sae/repositories/UtilisateurRepository.java @@ -0,0 +1,6 @@ +package fr.iut.sciencequest.sae.repositories; + +import fr.iut.sciencequest.sae.entities.Utilisateur; +import org.springframework.data.repository.CrudRepository; + +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 8b13789..a5b376c 100644 --- a/SpringBootProject/src/main/resources/application.properties +++ b/SpringBootProject/src/main/resources/application.properties @@ -1 +1,7 @@ - +spring.datasource.url=jdbc:postgresql://localhost:5432/postgres +spring.datasource.username=iut +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 diff --git a/SpringBootProject/src/main/resources/schema.sql b/SpringBootProject/src/main/resources/schema.sql new file mode 100644 index 0000000..6f75065 --- /dev/null +++ b/SpringBootProject/src/main/resources/schema.sql @@ -0,0 +1,171 @@ +-- Testé sous pgsql 15 + +DROP TABLE IF EXISTS Reponse CASCADE; +DROP TABLE IF EXISTS Question CASCADE; +DROP TABLE IF EXISTS Admin CASCADE; +DROP TABLE IF EXISTS Partie CASCADE; +DROP TABLE IF EXISTS Jeu CASCADE; +DROP TABLE IF EXISTS Decouvrir CASCADE; +DROP TABLE IF EXISTS Utilisateur CASCADE; +DROP TABLE IF EXISTS Invite CASCADE; +DROP TABLE IF EXISTS Joueur CASCADE; +DROP TABLE IF EXISTS Indice CASCADE; +DROP TABLE IF EXISTS Scientifique CASCADE; +DROP TABLE IF EXISTS Thematique CASCADE; +DROP TABLE IF EXISTS Difficulte; + + +-- THEMATIQUE + +CREATE TABLE Thematique( + id SERIAL PRIMARY KEY, + libelle varchar(128) NOT NULL UNIQUE +); + + +-- DIFFICULTE + +CREATE TABLE Difficulte( + id SERIAL PRIMARY KEY, + libelle varchar(128) NOT NULL UNIQUE +); + + +-- SCIENTIFIQUE + +CREATE TABLE Scientifique( + id SERIAL PRIMARY KEY, + nom varchar(128) NOT NULL, + prenom varchar(128) NOT NULL, + photo varchar(512) NOT NULL, + dateNaissance date NOT NULL, + descriptif text NOT NULL, + ratioTrouvee numeric(5,4), + sexe char(1) NOT NULL CHECK(sexe IN ('F', 'H')), + idThematique integer REFERENCES Thematique(id), + idDifficulte integer REFERENCES Difficulte(id) +); + + +-- INDICE + +CREATE TABLE Indice( + id SERIAL PRIMARY KEY, + libelle varchar(512) NOT NULL UNIQUE, + idScientifique integer REFERENCES Scientifique(id) +); + +-- QUESTION + +CREATE TABLE Question( + id SERIAL PRIMARY KEY, + question varchar(256) NOT NULL UNIQUE +); + + +-- REPONSE + +CREATE TABLE Reponse( + id SERIAL PRIMARY KEY, + reponse varchar(255) NOT NULL, + idQuestion integer REFERENCES Question(id), + idScientifique integer REFERENCES Scientifique(id) +); + + +-- ADMIN + +CREATE TABLE Admin( + id SERIAL PRIMARY KEY, + email varchar(255) NOT NULL UNIQUE, + password varchar(255) NOT NULL +); + +-- Jeu + +CREATE TABLE Jeu( + id SERIAL PRIMARY KEY, + nom varchar(128) NOT NULL UNIQUE, + nbrParties integer NOT NULL DEFAULT 0 +); + + +-- Partie + +CREATE TABLE Partie( + id SERIAL PRIMARY KEY, + codeInvitation varchar(10) NOT NULL UNIQUE, + idJeu integer REFERENCES Jeu(id) +); + +-- JOUEUR + +CREATE TABLE Joueur( + id SERIAL PRIMARY KEY, + idPartie integer REFERENCES Partie(id), + pseudo varchar(255) NOT NULL UNIQUE +); + + +-- Invite + +CREATE TABLE Invite( + idJoueur integer PRIMARY KEY REFERENCES Joueur(id) +); + + +-- Utilisateur + +CREATE TABLE Utilisateur( + idJoueur integer PRIMARY KEY REFERENCES Joueur(id), + email varchar(255) NOT NULL UNIQUE, + password varchar(255) NOT NULL +); + + +-- Decouvrir + +CREATE TABLE Decouvrir( + idUtilisateur integer REFERENCES Utilisateur(idJoueur), + idScientifique integer REFERENCES Scientifique(id), + PRIMARY KEY (idUtilisateur, idScientifique) +); + + +-- INSERTS + +-- Scientifiques +INSERT INTO Difficulte(libelle) VALUES ('Facile'),('Intermédiaire'),('Difficile'); +INSERT INTO Thematique(libelle) VALUES ('Nucléaire'),('Mathématiques'); +INSERT INTO Scientifique(nom, prenom, photo, dateNaissance, descriptif, ratioTrouvee, idThematique, idDifficulte, sexe) +VALUES + ('Marie', 'Curie', '', CURRENT_DATE, 'desc', 0, 1, 1, 'F'), + ('Albert', 'Einstein', '', CURRENT_DATE, 'desc', 0, 2, 1, 'H'), + ('Sophie', 'Germain', '', CURRENT_DATE, 'desc', 0, 2, 2, 'F'); + +-- Jeu +INSERT INTO Jeu(nom) VALUES ('Qui-est-ce ?'),('Science Quizz'), ('Pendu'); + +-- Questions +INSERT INTO Question(question) +VALUES + ('Qui a reçu le prix Nobel de chimie en 1911, pour avoir réussi à isoler un gramme de radium ?'), + ('Quel mathématicien a dit : « Dieu existe, c’est les mathématiques » ?'), + ('Quel mathématicienne utilisa comme nom d"emprunt « Antoine Auguste Le Blanc » ?'); + +-- Réponses +INSERT INTO Reponse(reponse, idQuestion, idScientifique) +VALUES + ('Marie Curie', 1, 1), + ('Albert Einstein', 2, 2), + ('Sophie Germain', 3, 3); + +-- Utilisateurs +INSERT INTO Joueur(id,pseudo) VALUES (1337, 'moi, le meilleur joueur du monde'); +INSERT INTO Utilisateur(idJoueur,email,password) VALUES (1337, 'joueur','$2y$10$juGnlWC9cS19popEKLZsYeir0Jl39k6hDl0dpaCix00FDcdiEbtmS'); +-- mdp = test + +INSERT INTO decouvrir(idUtilisateur,idScientifique) VALUES (1337,1); + +INSERT INTO Admin(id,email,password) VALUES (1, 'admin','$2y$10$juGnlWC9cS19popEKLZsYeir0Jl39k6hDl0dpaCix00FDcdiEbtmS'); +-- mdp = test From f8ee356681c3d2d5a0a68ce4e42cd4b63d6a21ea Mon Sep 17 00:00:00 2001 From: Alix JEUDI--LEMOINE Date: Tue, 27 Feb 2024 17:00:40 +0100 Subject: [PATCH 2/2] Modifications jour 2 - encore en cours- --- SpringBootProject/pom.xml | 4 + .../sciencequest/sae/ApplicationConfig.java | 18 +++++ .../sae/controllers/PartieController.java | 52 +++++++++++++ .../sae/controllers/QuestionController.java | 2 +- .../controllers/ScientifiqueController.java | 76 +++++++++++++++---- .../sae/controllers/ThematiqueController.java | 26 +++++-- .../iut/sciencequest/sae/entities/Admin.java | 15 +++- .../sciencequest/sae/entities/Difficulte.java | 6 ++ .../iut/sciencequest/sae/entities/Indice.java | 9 ++- .../fr/iut/sciencequest/sae/entities/Jeu.java | 12 ++- .../iut/sciencequest/sae/entities/Joueur.java | 6 ++ .../iut/sciencequest/sae/entities/Partie.java | 5 +- .../sciencequest/sae/entities/Question.java | 4 + .../sciencequest/sae/entities/Reponse.java | 4 + .../sae/entities/Scientifique.java | 23 +++++- .../iut/sciencequest/sae/entities/Sexe.java | 6 ++ .../sciencequest/sae/entities/Thematique.java | 6 ++ .../sae/entities/Utilisateur.java | 9 ++- .../sae/exceptions/DuplicatedEntity.java | 12 +++ .../exceptions/IncorrectPageException.java | 9 ++- .../exceptions/PartieNotFoundException.java | 12 +++ .../ScientifiqueNotFoundException.java | 10 ++- .../advices/IncorrectPageAdvice.java | 27 ------- .../advices/ScientifiqueNotFoundAdvice.java | 27 ------- .../sae/repositories/AdminRepository.java | 2 + .../repositories/DifficulteRepository.java | 2 + .../sae/repositories/IndiceRepository.java | 7 +- .../sae/repositories/InviteRepository.java | 2 + .../sae/repositories/JeuRepository.java | 2 + .../sae/repositories/JoueurRepository.java | 2 + .../sae/repositories/PartieRepository.java | 2 + .../sae/repositories/QuestionRepository.java | 2 + .../sae/repositories/ReponseRepository.java | 2 + .../repositories/ScientifiqueRepository.java | 2 + .../repositories/ThematiqueRepository.java | 3 + .../repositories/UtilisateurRepository.java | 2 + .../src/main/resources/application.properties | 3 +- .../src/main/resources/schema.sql | 5 ++ 38 files changed, 324 insertions(+), 94 deletions(-) create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/ApplicationConfig.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/controllers/PartieController.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/entities/Sexe.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/DuplicatedEntity.java create mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/PartieNotFoundException.java delete mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/IncorrectPageAdvice.java delete mode 100644 SpringBootProject/src/main/java/fr/iut/sciencequest/sae/exceptions/advices/ScientifiqueNotFoundAdvice.java 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