Modifications jour 2 - encore en cours-

Springboot
Alix JEUDI--LEMOINE 1 year ago
parent 5ee71a4538
commit f8ee356681

@ -41,6 +41,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId> <artifactId>spring-boot-starter-hateoas</artifactId>

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

@ -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<Optional<Partie>> getPartie(@PathVariable int id, HttpServletRequest request) {
Optional<Partie> 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");
}
}
}

@ -55,7 +55,7 @@ public class QuestionController {
return result; return result;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new IncorrectPageException(request.getRequestURI(), "numéro de page incorrect"); throw new IncorrectPageException("numéro de page incorrect");
} }
} }
} }

@ -2,71 +2,117 @@ package fr.iut.sciencequest.sae.controllers;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; 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.entities.Scientifique;
import fr.iut.sciencequest.sae.exceptions.DuplicatedEntity;
import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; import fr.iut.sciencequest.sae.exceptions.IncorrectPageException;
import fr.iut.sciencequest.sae.exceptions.ScientifiqueNotFoundException; import fr.iut.sciencequest.sae.exceptions.ScientifiqueNotFoundException;
import fr.iut.sciencequest.sae.repositories.IndiceRepository;
import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository; 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.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link; import org.springframework.hateoas.Link;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@Controller() @RestController
@RequestMapping("/api/v1/scientifiques") @RequestMapping("/api/v1/scientifiques")
public class ScientifiqueController { public class ScientifiqueController {
private static final int PAGE_SIZE = 10; private static final int PAGE_SIZE = 1;
private final ScientifiqueRepository scientifiqueRepository; private final ScientifiqueRepository scientifiqueRepository;
private final IndiceRepository indiceRepository;
public ScientifiqueController(ScientifiqueRepository scientifiqueRepository) { public ScientifiqueController(ScientifiqueRepository scientifiqueRepository, IndiceRepository indiceRepository) {
this.scientifiqueRepository = scientifiqueRepository; this.scientifiqueRepository = scientifiqueRepository;
this.indiceRepository = indiceRepository;
} }
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public CollectionModel<EntityModel<Scientifique>> getAllScientists(@RequestParam(name = "page") Optional<Integer> page, HttpServletRequest request) { public CollectionModel<EntityModel<Scientifique>> getAllScientists(@RequestParam(name = "page") Optional<Integer> page) {
try { try {
Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE); Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE);
Page<Scientifique> pagedResult = scientifiqueRepository.findAll(paging); Page<Scientifique> pagedResult = scientifiqueRepository.findAll(paging);
List<EntityModel<Scientifique>> scientifiques = pagedResult.map(EntityModel::of).toList(); List<EntityModel<Scientifique>> 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<EntityModel<Scientifique>> result = CollectionModel.of(scientifiques, selfLink); CollectionModel<EntityModel<Scientifique>> result = CollectionModel.of(scientifiques, selfLink);
if (pagedResult.hasPrevious()) { 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())); result.add(prevLink.expand(pagedResult.previousPageable().getPageNumber()));
} }
if (pagedResult.hasNext()) { 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())); result.add(nextLink.expand(pagedResult.nextPageable().getPageNumber()));
} }
return result; return result;
} catch (IllegalArgumentException e) { } 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 @ResponseBody
public EntityModel<Optional<Scientifique>> getScientistById(@PathVariable int id, HttpServletRequest request) { public EntityModel<Optional<Scientifique>> getScientistById(@PathVariable int id) {
Optional<Scientifique> scientifiqueOptional = this.scientifiqueRepository.findById(id); Optional<Scientifique> 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); return EntityModel.of(Optional.ofNullable(scientifique), selfLink);
} }
@GetMapping(value="/{id}/indices", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CollectionModel<EntityModel<Indice>> getScientistHints(@PathVariable int id, @RequestParam(name = "page") Optional<Integer> page) {
try {
Pageable paging = PageRequest.of(page.orElse(0), PAGE_SIZE);
Page<Indice> pagedResult = indiceRepository.findAll(paging);
List<EntityModel<Indice>> indices = pagedResult.map(EntityModel::of).toList();
Link selfLink = linkTo(methodOn(ScientifiqueController.class).getScientistHints(id, page)).withSelfRel().expand(page.map(Object::toString).orElse("0"));
CollectionModel<EntityModel<Indice>> 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());
}
}
} }

@ -1,28 +1,40 @@
package fr.iut.sciencequest.sae.controllers; package fr.iut.sciencequest.sae.controllers;
import fr.iut.sciencequest.sae.entities.Thematique; import fr.iut.sciencequest.sae.entities.Thematique;
import fr.iut.sciencequest.sae.exceptions.DuplicatedEntity;
import fr.iut.sciencequest.sae.repositories.ThematiqueRepository; 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.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@Controller @RestController
@RequestMapping("/api/v1/thematiques") @RequestMapping("/api/v1/thematiques")
public class ThematiqueController { public class ThematiqueController {
private final ThematiqueRepository thematiqueRepository; private final ThematiqueRepository thematiqueRepository;
public ThematiqueController(ThematiqueRepository thematiqueRepository) { public ThematiqueController(ThematiqueRepository thematiqueRepository) {
this.thematiqueRepository = thematiqueRepository; this.thematiqueRepository = thematiqueRepository;
} }
@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody @ResponseStatus(HttpStatus.OK)
public Iterable<Thematique> getAllThematiques() { public Iterable<Thematique> getAllThematiques() {
return this.thematiqueRepository.findAll(); return this.thematiqueRepository.findAll();
} }
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody public Thematique postThematique(@RequestBody Thematique thematique, HttpServletRequest request){
public Thematique postThematique(@) 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à");
}
}
} }

@ -1,6 +1,9 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -12,8 +15,18 @@ import lombok.NoArgsConstructor;
@Table(name="admin") @Table(name="admin")
public class Admin { public class Admin {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; 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;
} }

@ -1,6 +1,8 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -13,7 +15,11 @@ import lombok.NoArgsConstructor;
@Table(name="difficulte") @Table(name="difficulte")
public class Difficulte { public class Difficulte {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotBlank
@Column(unique = true)
private String libelle; private String libelle;
} }

@ -1,6 +1,8 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -12,8 +14,13 @@ import lombok.NoArgsConstructor;
@Table(name="indice") @Table(name="indice")
public class Indice { public class Indice {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotBlank
private String libelle; private String libelle;
//private Scientifique scientifique;
@NotNull
private int idScientifique;
} }

@ -1,9 +1,13 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.bind.DefaultValue;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ -12,9 +16,15 @@ import lombok.NoArgsConstructor;
@Table(name="jeu") @Table(name="jeu")
public class Jeu { public class Jeu {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotBlank
@Column(unique = true)
private String nom; private String nom;
@Column(name = "nbrparties") @Column(name = "nbrparties")
private int nbrParties; @Min(0)
private int nbrParties = 0;
} }

@ -1,6 +1,8 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -13,8 +15,12 @@ import lombok.NoArgsConstructor;
@Table(name="joueur") @Table(name="joueur")
public abstract class Joueur { public abstract class Joueur {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotBlank
@Column(unique = true)
private String pseudo; private String pseudo;
//private Partie partie; //private Partie partie;
} }

@ -1,6 +1,7 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
@ -15,9 +16,11 @@ import java.util.Set;
@Table(name="partie") @Table(name="partie")
public class Partie { public class Partie {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@Column(name = "codeinvitation")
@Column(name = "codeinvitation", unique = true)
private String codeInvitation; private String codeInvitation;
/*private Jeu jeu; /*private Jeu jeu;
@Getter() private Set<Joueur> joueurs; @Getter() private Set<Joueur> joueurs;

@ -1,5 +1,7 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -14,10 +16,12 @@ import java.util.List;
@Table(name="question") @Table(name="question")
public class Question { public class Question {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
private String question; private String question;
@NotEmpty
@OneToMany(mappedBy = "id") @OneToMany(mappedBy = "id")
private List<Reponse> reponses; private List<Reponse> reponses;
} }

@ -1,6 +1,7 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -12,8 +13,11 @@ import lombok.NoArgsConstructor;
@Table(name="reponse") @Table(name="reponse")
public class Reponse { public class Reponse {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotNull
private String reponse; private String reponse;
} }

@ -1,6 +1,9 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -15,13 +18,16 @@ import java.util.Date;
@Table(name = "scientifique") @Table(name = "scientifique")
public class Scientifique { public class Scientifique {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotNull
@ManyToOne @ManyToOne
@JoinColumn(name="iddifficulte") @JoinColumn(name="iddifficulte")
private Difficulte difficulte; private Difficulte difficulte;
@NotNull
@ManyToOne @ManyToOne
@JoinColumn(name="idthematique") @JoinColumn(name="idthematique")
private Thematique thematique; private Thematique thematique;
@ -29,13 +35,24 @@ public class Scientifique {
@Column(name = "photo") @Column(name = "photo")
private String pathToPhoto; private String pathToPhoto;
private String nom, prenom, descriptif; @NotBlank
private String nom;
@NotBlank
private String prenom;
@NotBlank
private String descriptif;
@NotBlank
@Column(name = "datenaissance") @Column(name = "datenaissance")
private Date dateNaissance; private Date dateNaissance;
private char sexe; @NotBlank
@Enumerated(EnumType.STRING)
private Sexe sexe;
@Column(name = "ratiotrouvee") @Column(name = "ratiotrouvee")
private double ratioTrouve; @Size(min=0, max=1)
private double ratioTrouve = 0.0;
} }

@ -0,0 +1,6 @@
package fr.iut.sciencequest.sae.entities;
public enum Sexe {
F,
H
}

@ -1,6 +1,8 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -12,7 +14,11 @@ import lombok.NoArgsConstructor;
@Table(name="thematique") @Table(name="thematique")
public class Thematique { public class Thematique {
@Id @Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
@NotBlank
@Column(unique = true)
private String libelle; private String libelle;
} }

@ -2,6 +2,9 @@ package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -14,9 +17,13 @@ import lombok.NoArgsConstructor;
@Entity @Entity
@Table(name="utilisateur") @Table(name="utilisateur")
public class Utilisateur extends Joueur{ public class Utilisateur extends Joueur{
@Email(message="Veuillez fournir une adresse mail valide")
@NotNull
@Column(unique = true)
private String email; private String email;
@NotBlank
@Column(name = "motdepasse") @Column(name = "motdepasse")
private String motDePasse; private String motDePasse;
private String pseudo;
} }

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

@ -1,9 +1,12 @@
package fr.iut.sciencequest.sae.exceptions; 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 class IncorrectPageException extends RuntimeException {
public final String uri;
public IncorrectPageException(String uri, String exception) { public IncorrectPageException(String exception) {
super(exception); super(exception);
this.uri = uri;
} }
} }

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

@ -1,10 +1,12 @@
package fr.iut.sciencequest.sae.exceptions; 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 class ScientifiqueNotFoundException extends RuntimeException {
public final String uri;
public ScientifiqueNotFoundException(String uri, String exception) { public ScientifiqueNotFoundException(String message) {
super(exception); super(message);
this.uri = uri;
} }
} }

@ -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<String, Object> exceptionHandler(IncorrectPageException ex) {
Map<String, Object> 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;
}
}

@ -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<String, Object> exceptionHandler(IncorrectPageException ex) {
Map<String, Object> 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;
}
}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Admin; import fr.iut.sciencequest.sae.entities.Admin;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface AdminRepository extends CrudRepository<Admin, Integer> {} public interface AdminRepository extends CrudRepository<Admin, Integer> {}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Difficulte; import fr.iut.sciencequest.sae.entities.Difficulte;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface DifficulteRepository extends CrudRepository<Difficulte, Integer> {} public interface DifficulteRepository extends CrudRepository<Difficulte, Integer> {}

@ -2,5 +2,10 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Indice; import fr.iut.sciencequest.sae.entities.Indice;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
public interface IndiceRepository extends CrudRepository<Indice, Integer> {} @Repository
public interface IndiceRepository extends PagingAndSortingRepository<Indice, Integer>, CrudRepository<Indice, Integer> {
}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Invite; import fr.iut.sciencequest.sae.entities.Invite;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface InviteRepository extends CrudRepository<Invite, Integer> {} public interface InviteRepository extends CrudRepository<Invite, Integer> {}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Jeu; import fr.iut.sciencequest.sae.entities.Jeu;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface JeuRepository extends CrudRepository<Jeu, Integer> {} public interface JeuRepository extends CrudRepository<Jeu, Integer> {}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Joueur; import fr.iut.sciencequest.sae.entities.Joueur;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface JoueurRepository extends CrudRepository<Joueur, Integer> {} public interface JoueurRepository extends CrudRepository<Joueur, Integer> {}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Partie; import fr.iut.sciencequest.sae.entities.Partie;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PartieRepository extends CrudRepository<Partie, Integer> {} public interface PartieRepository extends CrudRepository<Partie, Integer> {}

@ -5,5 +5,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface QuestionRepository extends PagingAndSortingRepository<Question, Integer> {} public interface QuestionRepository extends PagingAndSortingRepository<Question, Integer> {}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Reponse; import fr.iut.sciencequest.sae.entities.Reponse;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ReponseRepository extends CrudRepository<Reponse, Integer> {} public interface ReponseRepository extends CrudRepository<Reponse, Integer> {}

@ -3,5 +3,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Scientifique; import fr.iut.sciencequest.sae.entities.Scientifique;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ScientifiqueRepository extends PagingAndSortingRepository<Scientifique, Integer>, CrudRepository<Scientifique, Integer> {} public interface ScientifiqueRepository extends PagingAndSortingRepository<Scientifique, Integer>, CrudRepository<Scientifique, Integer> {}

@ -2,5 +2,8 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Thematique; import fr.iut.sciencequest.sae.entities.Thematique;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ThematiqueRepository extends CrudRepository<Thematique, Integer> {} public interface ThematiqueRepository extends CrudRepository<Thematique, Integer> {}

@ -2,5 +2,7 @@ package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.Utilisateur; import fr.iut.sciencequest.sae.entities.Utilisateur;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UtilisateurRepository extends CrudRepository<Utilisateur, Integer> {} public interface UtilisateurRepository extends CrudRepository<Utilisateur, Integer> {}

@ -4,4 +4,5 @@ spring.datasource.password=password974519874185$976
spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.driver-class-name=org.postgresql.Driver
spring.sql.init.mode=always spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql spring.sql.init.schema-locations=classpath:schema.sql
spring.jackson.serialization.indent_output = true spring.jackson.serialization.indent_output = true
server.error.include-message=always

@ -153,6 +153,11 @@ VALUES
('Quel mathématicien a dit : « Dieu existe, cest les mathématiques » ?'), ('Quel mathématicien a dit : « Dieu existe, cest les mathématiques » ?'),
('Quel mathématicienne utilisa comme nom d"emprunt « Antoine Auguste Le Blanc » ?'); ('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 -- Réponses
INSERT INTO Reponse(reponse, idQuestion, idScientifique) INSERT INTO Reponse(reponse, idQuestion, idScientifique)
VALUES VALUES

Loading…
Cancel
Save