jour 4 -- fin de journée

Springboot
Victor SOULIER 1 year ago
parent 0b9c48be47
commit 8347cd163e

@ -3,6 +3,7 @@ package fr.iut.sciencequest.sae.assemblers;
import fr.iut.sciencequest.sae.dto.difficulte.DifficulteDTO; import fr.iut.sciencequest.sae.dto.difficulte.DifficulteDTO;
import fr.iut.sciencequest.sae.entities.Difficulte; import fr.iut.sciencequest.sae.entities.Difficulte;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import org.modelmapper.ModelMapper; import org.modelmapper.ModelMapper;
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport; import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
@ -20,4 +21,5 @@ public class DifficulteModelAssembler extends RepresentationModelAssemblerSuppor
ModelMapper mapper = new ModelMapper(); ModelMapper mapper = new ModelMapper();
return mapper.map(entity, DifficulteDTO.class); return mapper.map(entity, DifficulteDTO.class);
} }
} }

@ -0,0 +1,42 @@
package fr.iut.sciencequest.sae.assemblers;
import fr.iut.sciencequest.sae.controllers.ScientifiqueController;
import org.springframework.hateoas.CollectionModel;
import fr.iut.sciencequest.sae.dto.indice.IndiceSimpleWithScientifiquesIdDTO;
import fr.iut.sciencequest.sae.entities.Indice;
import jakarta.annotation.Nullable;
import org.modelmapper.ModelMapper;
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
@Component
public class IndiceModelAssembler extends RepresentationModelAssemblerSupport<Indice, IndiceSimpleWithScientifiquesIdDTO> {
public IndiceModelAssembler() {
super(Indice.class, IndiceSimpleWithScientifiquesIdDTO.class);
}
@Override
@NonNull
public IndiceSimpleWithScientifiquesIdDTO toModel(@Nullable Indice entity) {
ModelMapper mapper = new ModelMapper();
return mapper.map(entity, IndiceSimpleWithScientifiquesIdDTO.class);
}
@Override
@NonNull
public CollectionModel<IndiceSimpleWithScientifiquesIdDTO> toCollectionModel(@Nullable Iterable<? extends Indice> entities) {
assert entities != null;
CollectionModel<IndiceSimpleWithScientifiquesIdDTO> collectionModel = super.toCollectionModel(entities);
// Le lien n'est pas ajouté automatiquement si l'on utilise pas la pagination /!\
if(collectionModel.iterator().hasNext())
collectionModel.add(linkTo(methodOn(ScientifiqueController.class).getScientistHints(collectionModel.iterator().next().getScientifique().getId())).withSelfRel());
return collectionModel;
}
}

@ -2,13 +2,16 @@ package fr.iut.sciencequest.sae.assemblers;
import fr.iut.sciencequest.sae.controllers.ScientifiqueController; import fr.iut.sciencequest.sae.controllers.ScientifiqueController;
import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueDTO; import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueDTO;
import fr.iut.sciencequest.sae.entities.scientifique.Scientifique; import fr.iut.sciencequest.sae.entities.Scientifique;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
import org.modelmapper.ModelMapper; import org.modelmapper.ModelMapper;
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport; import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
@Component @Component
public class ScientifiqueModelAssembler extends RepresentationModelAssemblerSupport<Scientifique, ScientifiqueDTO> { public class ScientifiqueModelAssembler extends RepresentationModelAssemblerSupport<Scientifique, ScientifiqueDTO> {
public ScientifiqueModelAssembler() { public ScientifiqueModelAssembler() {
@ -19,6 +22,9 @@ public class ScientifiqueModelAssembler extends RepresentationModelAssemblerSupp
@NonNull @NonNull
public ScientifiqueDTO toModel(@Nullable Scientifique entity) { public ScientifiqueDTO toModel(@Nullable Scientifique entity) {
ModelMapper mapper = new ModelMapper(); ModelMapper mapper = new ModelMapper();
return mapper.map(entity, ScientifiqueDTO.class); ScientifiqueDTO scientifiqueDTO = mapper.map(entity, ScientifiqueDTO.class);
scientifiqueDTO.add(linkTo(methodOn(ScientifiqueController.class).getScientistHints(scientifiqueDTO.getId())).withRel("indices"));
scientifiqueDTO.add(linkTo(methodOn(ScientifiqueController.class).getScientistById(scientifiqueDTO.getId())).withSelfRel());
return scientifiqueDTO;
} }
} }

@ -0,0 +1,23 @@
package fr.iut.sciencequest.sae.assemblers;
import fr.iut.sciencequest.sae.dto.thematique.ThematiqueDTO;
import fr.iut.sciencequest.sae.entities.Thematique;
import jakarta.annotation.Nullable;
import org.modelmapper.ModelMapper;
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
@Component
public class ThematiqueModelAssembler extends RepresentationModelAssemblerSupport<Thematique, ThematiqueDTO> {
public ThematiqueModelAssembler() {
super(Thematique.class, ThematiqueDTO.class);
}
@Override
@NonNull
public ThematiqueDTO toModel(@Nullable Thematique entity) {
ModelMapper mapper = new ModelMapper();
return mapper.map(entity, ThematiqueDTO.class);
}
}

@ -1,8 +1,15 @@
package fr.iut.sciencequest.sae.controllers; package fr.iut.sciencequest.sae.controllers;
import fr.iut.sciencequest.sae.entities.indice.Indice; import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.iut.sciencequest.sae.dto.indice.IndiceSimpleWithScientifiquesIdDTO;
import fr.iut.sciencequest.sae.dto.indice.IndiceWithoutIdAndScientifiqueIdOnlyForPatchDTO;
import fr.iut.sciencequest.sae.entities.Indice;
import fr.iut.sciencequest.sae.repositories.IndiceRepository;
import fr.iut.sciencequest.sae.services.IndiceService; import fr.iut.sciencequest.sae.services.IndiceService;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -12,11 +19,14 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/api/v1/indices") @RequestMapping("/api/v1/indices")
public class IndiceController extends Controller { public class IndiceController extends Controller {
private final IndiceService indiceService; private final IndiceService indiceService;
private final ModelMapper modelMapper;
@PatchMapping(value="/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PatchMapping(value="/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
public Indice patchIndice(@PathVariable("id") int id, @RequestBody Indice indice){ public IndiceSimpleWithScientifiquesIdDTO patchIndice(@PathVariable("id") int id, @RequestBody @Valid IndiceWithoutIdAndScientifiqueIdOnlyForPatchDTO indiceInput) throws JsonMappingException {
Indice indice = this.modelMapper.map(indiceInput, Indice.class);
indice.setId(id); indice.setId(id);
return this.indiceService.update(indice);
return this.modelMapper.map(this.indiceService.update(indice), IndiceSimpleWithScientifiquesIdDTO.class);
} }
} }

@ -5,6 +5,7 @@ import fr.iut.sciencequest.sae.dto.partie.PartieDTO;
import fr.iut.sciencequest.sae.entities.Partie; import fr.iut.sciencequest.sae.entities.Partie;
import fr.iut.sciencequest.sae.services.PartieService; import fr.iut.sciencequest.sae.services.PartieService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;

@ -1,16 +1,21 @@
package fr.iut.sciencequest.sae.controllers; package fr.iut.sciencequest.sae.controllers;
import fr.iut.sciencequest.sae.ApplicationConfig; import fr.iut.sciencequest.sae.ApplicationConfig;
import fr.iut.sciencequest.sae.assemblers.IndiceModelAssembler;
import fr.iut.sciencequest.sae.assemblers.ScientifiqueModelAssembler; import fr.iut.sciencequest.sae.assemblers.ScientifiqueModelAssembler;
import fr.iut.sciencequest.sae.dto.indice.IndiceDTO;
import fr.iut.sciencequest.sae.dto.indice.IndiceLibelleOnlyDTO;
import fr.iut.sciencequest.sae.dto.indice.IndiceSimpleWithScientifiquesIdDTO;
import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueDTO; import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueDTO;
import fr.iut.sciencequest.sae.entities.scientifique.Scientifique; import fr.iut.sciencequest.sae.entities.Scientifique;
import fr.iut.sciencequest.sae.entities.indice.IIndiceidAndLibelleAndScientifiqueIdOnlyProjection; import fr.iut.sciencequest.sae.entities.Indice;
import fr.iut.sciencequest.sae.entities.indice.Indice;
import fr.iut.sciencequest.sae.entities.indice.IValidateOnlyLibelle;
import fr.iut.sciencequest.sae.exceptions.IncorrectPageException; import fr.iut.sciencequest.sae.exceptions.IncorrectPageException;
import fr.iut.sciencequest.sae.services.IndiceService; import fr.iut.sciencequest.sae.services.IndiceService;
import fr.iut.sciencequest.sae.services.interfaces.IScientifiqueService; import fr.iut.sciencequest.sae.services.interfaces.IScientifiqueService;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault; import org.springframework.data.web.PageableDefault;
import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.data.web.PagedResourcesAssembler;
@ -19,7 +24,6 @@ import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.PagedModel; import org.springframework.hateoas.PagedModel;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@RestController @RestController
@ -29,34 +33,36 @@ public class ScientifiqueController extends Controller {
private final IScientifiqueService scientifiqueService; private final IScientifiqueService scientifiqueService;
private final ScientifiqueModelAssembler scientifiqueModelAssembler; private final ScientifiqueModelAssembler scientifiqueModelAssembler;
private final IndiceModelAssembler indiceModelAssembler;
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
private final PagedResourcesAssembler<Scientifique> pagedResourcesAssembler; private final PagedResourcesAssembler<Scientifique> pagedResourcesAssembler;
private final IndiceService indiceService; private final IndiceService indiceService;
private final ModelMapper modelMapper;
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public PagedModel<ScientifiqueDTO> getAllScientists(@PageableDefault(size = ApplicationConfig.DEFAULT_PAGEABLE_SIZE) Pageable p) { public PagedModel<ScientifiqueDTO> getAllScientists(@PageableDefault(size = ApplicationConfig.DEFAULT_PAGEABLE_SIZE) Pageable p,
try { @RequestParam(value = "thematiqueId", defaultValue = "-1") Integer thematiqueId,
return pagedResourcesAssembler.toModel(this.scientifiqueService.findAll(p), scientifiqueModelAssembler); @RequestParam(value = "difficulteId", defaultValue = "-1") Integer difficulteId) {
} catch (IllegalArgumentException e) {
throw new IncorrectPageException("numéro de page incorrect"); Page<Scientifique> page = (thematiqueId.equals(-1) && difficulteId.equals(-1) ? this.scientifiqueService.findAll(p) : this.scientifiqueService.findAllWithCriteria(p, thematiqueId, difficulteId));
} return pagedResourcesAssembler.toModel(page, scientifiqueModelAssembler);
} }
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public EntityModel<Scientifique> getScientistById(@PathVariable Integer id) { public ScientifiqueDTO getScientistById(@PathVariable Integer id) {
return getSelfLinkEntityModel(this.scientifiqueService.findById(id), "getScientistById", id); return scientifiqueModelAssembler.toModel(this.scientifiqueService.findById(id));
} }
@GetMapping(value="/{id}/indices", produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value="/{id}/indices", produces = MediaType.APPLICATION_JSON_VALUE)
public CollectionModel<IIndiceidAndLibelleAndScientifiqueIdOnlyProjection> getScientistHints(@PathVariable Integer id) { public CollectionModel<IndiceSimpleWithScientifiquesIdDTO> getScientistHints(@PathVariable Integer id) {
return getSelfLinkCollectionModel(this.scientifiqueService.getLinkedIndicesByScientifiqueId(id), "getScientistHints", id); return indiceModelAssembler.toCollectionModel(this.scientifiqueService.getLinkedIndicesByScientifiqueId(id));
} }
@PostMapping(value="/{id}/indices", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value="/{id}/indices", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
public IIndiceidAndLibelleAndScientifiqueIdOnlyProjection postIndice(@PathVariable Integer id, @Validated(IValidateOnlyLibelle.class) @RequestBody Indice indice){ public IndiceSimpleWithScientifiquesIdDTO postIndice(@PathVariable Integer id, @Valid @RequestBody IndiceLibelleOnlyDTO indiceWithLibelleOnly) {
Indice indice = this.modelMapper.map(indiceWithLibelleOnly, Indice.class);
indice.setScientifique(this.scientifiqueService.findById(id)); indice.setScientifique(this.scientifiqueService.findById(id));
indice = this.indiceService.create(indice); return this.modelMapper.map(this.indiceService.create(indice), IndiceSimpleWithScientifiquesIdDTO.class);
return indice.toProjection(IIndiceidAndLibelleAndScientifiqueIdOnlyProjection.class);
} }
} }

@ -1,8 +1,12 @@
package fr.iut.sciencequest.sae.controllers; package fr.iut.sciencequest.sae.controllers;
import fr.iut.sciencequest.sae.assemblers.IndiceModelAssembler;
import fr.iut.sciencequest.sae.assemblers.ThematiqueModelAssembler;
import fr.iut.sciencequest.sae.dto.thematique.ThematiqueDTO;
import fr.iut.sciencequest.sae.entities.Thematique; import fr.iut.sciencequest.sae.entities.Thematique;
import fr.iut.sciencequest.sae.services.interfaces.IThematiqueService; import fr.iut.sciencequest.sae.services.interfaces.IThematiqueService;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springframework.hateoas.CollectionModel; import org.springframework.hateoas.CollectionModel;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -10,13 +14,11 @@ import org.springframework.web.bind.annotation.*;
@RestController @RestController
@AllArgsConstructor
@RequestMapping("/api/v1/thematiques") @RequestMapping("/api/v1/thematiques")
public class ThematiqueController extends Controller { public class ThematiqueController extends Controller {
private final IThematiqueService thematiqueService; private final IThematiqueService thematiqueService;
private final ThematiqueModelAssembler thematiqueModelAssembler;
public ThematiqueController(IThematiqueService thematiqueService) {
this.thematiqueService = thematiqueService;
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
@ -28,14 +30,14 @@ public class ThematiqueController extends Controller {
//TODO : ajouter liens hateos //TODO : ajouter liens hateos
@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) @ResponseStatus(HttpStatus.CREATED)
public Thematique createThematique(@Valid @RequestBody Thematique thematique){ public ThematiqueDTO createThematique(@Valid @RequestBody Thematique thematique) {
return this.thematiqueService.create(thematique); return thematiqueModelAssembler.toModel(this.thematiqueService.create(thematique));
} }
@PatchMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PatchMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED) @ResponseStatus(HttpStatus.CREATED)
public Thematique updateThematique(@PathVariable("id") int id, @Valid @RequestBody Thematique thematique){ public ThematiqueDTO updateThematique(@PathVariable("id") int id, @Valid @RequestBody Thematique thematique) {
thematique.setId(id); thematique.setId(id);
return this.thematiqueService.update(thematique); return thematiqueModelAssembler.toModel(this.thematiqueService.update(thematique));
} }
} }

@ -15,9 +15,9 @@ import org.springframework.hateoas.RepresentationModel;
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class AdminDTO extends RepresentationModel<AdminDTO> { public class AdminWithPasswordDTO extends RepresentationModel<AdminWithPasswordDTO> {
@NotNull @NotNull
private int id; private Integer id;
@Email @Email
@NotNull @NotNull

@ -1,6 +1,6 @@
package fr.iut.sciencequest.sae.dto.difficulte; package fr.iut.sciencequest.sae.dto.difficulte;
import com.fasterxml.jackson.annotation.JsonInclude; import fr.iut.sciencequest.sae.entities.Scientifique;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.*; import lombok.*;
@ -13,11 +13,12 @@ import org.springframework.hateoas.RepresentationModel;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DifficulteDTO extends RepresentationModel<DifficulteDTO> { public class DifficulteDTO extends RepresentationModel<DifficulteDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotBlank @NotBlank
private String libelle; private String libelle;
private Iterable<Scientifique> scientifiques;
} }

@ -0,0 +1,19 @@
package fr.iut.sciencequest.sae.dto.difficulte;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class DifficulteSimpleDTO extends RepresentationModel<DifficulteSimpleDTO> {
@NotNull
private Integer id;
@NotBlank
private String libelle;
}

@ -1,15 +1,14 @@
package fr.iut.sciencequest.sae.dto.indice; package fr.iut.sciencequest.sae.dto.indice;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import fr.iut.sciencequest.sae.entities.Reponse; import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueDTO;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.*; import lombok.*;
import org.springframework.hateoas.RepresentationModel; import org.springframework.hateoas.RepresentationModel;
import java.util.List;
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@ -18,8 +17,11 @@ import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class IndiceDTO extends RepresentationModel<IndiceDTO> { public class IndiceDTO extends RepresentationModel<IndiceDTO> {
@NotNull @NotNull
private int id; private Integer id;
private String question;
@NotEmpty @NotBlank
private List<Reponse> reponses; private String libelle;
@NotNull
private ScientifiqueDTO scientifique;
} }

@ -0,0 +1,18 @@
package fr.iut.sciencequest.sae.dto.indice;
import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.validation.constraints.NotBlank;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class IndiceLibelleOnlyDTO extends RepresentationModel<IndiceLibelleOnlyDTO> {
@NotBlank
private String libelle;
}

@ -0,0 +1,25 @@
package fr.iut.sciencequest.sae.dto.indice;
import com.fasterxml.jackson.annotation.JsonInclude;
import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueIdOnlyDTO;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class IndiceSimpleWithScientifiquesIdDTO extends RepresentationModel<IndiceSimpleWithScientifiquesIdDTO> {
@NotNull
private Integer id;
@NotBlank
private String libelle;
@NotNull
private ScientifiqueIdOnlyDTO scientifique;
}

@ -0,0 +1,22 @@
package fr.iut.sciencequest.sae.dto.indice;
import com.fasterxml.jackson.annotation.JsonInclude;
import fr.iut.sciencequest.sae.dto.scientifique.ScientifiqueIdOnlyDTO;
import jakarta.validation.Valid;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class IndiceWithoutIdAndScientifiqueIdOnlyForPatchDTO extends RepresentationModel<IndiceWithoutIdAndScientifiqueIdOnlyForPatchDTO> {
private String libelle;
@Valid
private ScientifiqueIdOnlyDTO scientifique;
}

@ -17,7 +17,7 @@ import org.springframework.hateoas.RepresentationModel;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class InviteDTO extends RepresentationModel<InviteDTO> { public class InviteDTO extends RepresentationModel<InviteDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotBlank @NotBlank
private String pseudo; private String pseudo;

@ -17,11 +17,11 @@ import org.springframework.hateoas.RepresentationModel;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class JeuDTO extends RepresentationModel<JeuDTO> { public class JeuDTO extends RepresentationModel<JeuDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotBlank @NotBlank
private String nom; private String nom;
@Min(0) @Min(0)
private int nbrParties = 0; private Integer nbrParties = 0;
} }

@ -17,7 +17,7 @@ import org.springframework.hateoas.RepresentationModel;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class JoueurDTO extends RepresentationModel<JoueurDTO> { public class JoueurDTO extends RepresentationModel<JoueurDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotBlank @NotBlank
private String pseudo; private String pseudo;

@ -8,20 +8,21 @@ import jakarta.validation.constraints.NotNull;
import lombok.*; import lombok.*;
import org.springframework.hateoas.RepresentationModel; import org.springframework.hateoas.RepresentationModel;
import java.util.List;
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PartieDTO extends RepresentationModel<PartieDTO> { public class PartieDTO extends RepresentationModel<PartieDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotEmpty @NotEmpty
private String codeInvitation; private String codeInvitation;
@NotEmpty @NotEmpty
private Iterable<JoueurDTO> joueurs; private List<JoueurDTO> joueurs;
@NotEmpty @NotNull
private JeuDTO jeu; private JeuDTO jeu;
} }

@ -1,6 +1,7 @@
package fr.iut.sciencequest.sae.dto.question; package fr.iut.sciencequest.sae.dto.question;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import fr.iut.sciencequest.sae.dto.reponse.ReponseDTO; import fr.iut.sciencequest.sae.dto.reponse.ReponseDTO;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
@ -18,9 +19,10 @@ import org.springframework.hateoas.RepresentationModel;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class QuestionDTO extends RepresentationModel<QuestionDTO> { public class QuestionDTO extends RepresentationModel<QuestionDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotBlank @NotBlank
private String question; private String question;
@NotEmpty @NotEmpty
private Iterable<ReponseDTO> reponses; private Iterable<ReponseDTO> reponses;
} }

@ -1,7 +1,9 @@
package fr.iut.sciencequest.sae.dto.reponse; package fr.iut.sciencequest.sae.dto.reponse;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import fr.iut.sciencequest.sae.dto.question.QuestionDTO;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.*; import lombok.*;
import org.springframework.hateoas.RepresentationModel; import org.springframework.hateoas.RepresentationModel;
@ -15,9 +17,12 @@ import org.springframework.hateoas.RepresentationModel;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class ReponseDTO extends RepresentationModel<ReponseDTO> { public class ReponseDTO extends RepresentationModel<ReponseDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotNull @NotNull
@NotBlank @NotBlank
private String reponse; private String reponse;
@NotEmpty
private QuestionDTO question;
} }

@ -1,8 +1,10 @@
package fr.iut.sciencequest.sae.dto.scientifique; package fr.iut.sciencequest.sae.dto.scientifique;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import fr.iut.sciencequest.sae.dto.difficulte.DifficulteSimpleDTO;
import fr.iut.sciencequest.sae.dto.thematique.ThematiqueDTO; import fr.iut.sciencequest.sae.dto.thematique.ThematiqueDTO;
import fr.iut.sciencequest.sae.dto.difficulte.DifficulteDTO; import fr.iut.sciencequest.sae.dto.difficulte.DifficulteDTO;
import fr.iut.sciencequest.sae.dto.thematique.ThematiqueSimpleDTO;
import fr.iut.sciencequest.sae.entities.Sexe; import fr.iut.sciencequest.sae.entities.Sexe;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
@ -21,16 +23,15 @@ import java.util.Date;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ScientifiqueDTO extends RepresentationModel<ScientifiqueDTO> { public class ScientifiqueDTO extends RepresentationModel<ScientifiqueDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotNull @NotNull
private DifficulteDTO difficulte; private DifficulteSimpleDTO difficulte;
@NotNull @NotNull
private ThematiqueDTO thematique; private ThematiqueSimpleDTO thematique;
@URL @URL
private String pathToPhoto; private String pathToPhoto;

@ -0,0 +1,18 @@
package fr.iut.sciencequest.sae.dto.scientifique;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
import org.springframework.lang.NonNull;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ScientifiqueIdOnlyDTO extends RepresentationModel<ScientifiqueIdOnlyDTO> {
@NotNull
private Integer id;
}

@ -1,6 +1,6 @@
package fr.iut.sciencequest.sae.dto.thematique; package fr.iut.sciencequest.sae.dto.thematique;
import com.fasterxml.jackson.annotation.JsonInclude; import fr.iut.sciencequest.sae.entities.Scientifique;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.*; import lombok.*;
@ -13,11 +13,12 @@ import org.springframework.hateoas.RepresentationModel;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ThematiqueDTO extends RepresentationModel<ThematiqueDTO> { public class ThematiqueDTO extends RepresentationModel<ThematiqueDTO> {
@NotNull @NotNull
private int id; private Integer id;
@NotBlank @NotBlank
private String libelle; private String libelle;
private Iterable<Scientifique> scientifiques;
} }

@ -0,0 +1,21 @@
package fr.iut.sciencequest.sae.dto.thematique;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ThematiqueSimpleDTO extends RepresentationModel<ThematiqueSimpleDTO> {
@NotNull
private Integer id;
@NotBlank
private String libelle;
}

@ -9,7 +9,6 @@ import lombok.*;
import org.springframework.hateoas.RepresentationModel; import org.springframework.hateoas.RepresentationModel;
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@ -18,15 +17,12 @@ import org.springframework.hateoas.RepresentationModel;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class UtilisateurDTO extends RepresentationModel<UtilisateurDTO> { public class UtilisateurDTO extends RepresentationModel<UtilisateurDTO> {
@NotNull @NotNull
private int id; private Integer id;
@Email @Email
@NotNull @NotNull
private String email; private String email;
@NotBlank
private String motDePasse;
@NotBlank @NotBlank
private String pseudo; private String pseudo;

@ -0,0 +1,34 @@
package fr.iut.sciencequest.sae.dto.utilisateur;
import com.fasterxml.jackson.annotation.JsonInclude;
import fr.iut.sciencequest.sae.dto.partie.PartieDTO;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.springframework.hateoas.RepresentationModel;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UtilisateurWithPasswordDTO extends RepresentationModel<UtilisateurWithPasswordDTO> {
@NotNull
private Integer id;
@Email
@NotNull
private String email;
@NotBlank
private String motDePasse;
@NotBlank
private String pseudo;
private PartieDTO partie;
}

@ -12,13 +12,12 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Entity @Entity
@Table(name="admin") @Table(name="admin")
public class Admin extends BaseEntity { public class Admin {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
@Column(unique = true) @Column(unique = true)
private String email; private String email;

@ -1,12 +0,0 @@
package fr.iut.sciencequest.sae.entities;
import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
public abstract class BaseEntity implements IToProjection {
public <T> T toProjection(Class<T> projectionType){
ProjectionFactory pf = new SpelAwareProxyProjectionFactory();
return pf.createProjection(projectionType, this);
}
}

@ -1,26 +1,37 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
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.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.modelmapper.internal.bytebuddy.implementation.bind.annotation.Super; import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Entity @Entity
@Table(name="difficulte") @Table(name="difficulte")
public class Difficulte extends BaseEntity { @JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Difficulte {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
@Column(unique = true) @Column(unique = true)
private String libelle; private String libelle;
@JsonManagedReference
@OneToMany(mappedBy = "difficulte")
@Fetch(FetchMode.JOIN)
private List<Scientifique> scientifiques;
} }

@ -1,5 +0,0 @@
package fr.iut.sciencequest.sae.entities;
public interface IToProjection {
<T> T toProjection(Class<T> projectionType);
}

@ -0,0 +1,26 @@
package fr.iut.sciencequest.sae.entities;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name="indice")
public class Indice {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false)
private String libelle;
@ManyToOne
@JoinColumn(name="idscientifique", nullable = false)
private Scientifique scientifique;
}

@ -1,7 +1,6 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import fr.iut.sciencequest.sae.entities.joueur.Joueur;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;

@ -12,17 +12,16 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Entity @Entity
@Table(name="jeu") @Table(name="jeu")
public class Jeu extends BaseEntity { public class Jeu {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
@Column(unique = true) @Column(unique = true)
private String nom; private String nom;
@Column(name = "nbrparties") @Column(name = "nbrparties")
private int nbrParties = 0; private Integer nbrParties = 0;
} }

@ -1,10 +1,6 @@
package fr.iut.sciencequest.sae.entities.joueur; package fr.iut.sciencequest.sae.entities;
import fr.iut.sciencequest.sae.entities.BaseEntity;
import fr.iut.sciencequest.sae.entities.Partie;
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.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -13,19 +9,18 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Inheritance ( strategy = InheritanceType.JOINED) @Inheritance ( strategy = InheritanceType.JOINED)
@Entity @Entity
@Table(name="joueur") @Table(name="joueur")
public abstract class Joueur extends BaseEntity { public class Joueur {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
@Column(unique = true) @Column(unique = true)
private String pseudo; private String pseudo;
@ManyToOne @ManyToOne
@JoinColumn(name="idpartie") @JoinColumn(name = "idpartie")
private Partie partie; private Partie partie;
} }

@ -1,8 +1,6 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import fr.iut.sciencequest.sae.entities.joueur.Joueur;
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.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -12,26 +10,24 @@ import org.hibernate.annotations.FetchMode;
import java.util.List; import java.util.List;
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@Entity @Entity
@Table(name="partie") @Table(name="partie")
public class Partie extends BaseEntity { public class Partie {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
@Column(name = "codeinvitation", unique = true) @Column(name = "codeinvitation", unique = true, nullable = false)
private String codeInvitation; private String codeInvitation;
@OneToMany(mappedBy = "id") @OneToMany(mappedBy = "partie")
@Fetch(FetchMode.JOIN) // Sinon crash (Could not write JSON: failed to lazily initialize a collection of role) @Fetch(FetchMode.JOIN) // Sinon crash (Could not write JSON: failed to lazily initialize a collection of T)
private List<Joueur> joueurs; private List<Joueur> joueurs;
@NotNull
@ManyToOne @ManyToOne
@JoinColumn(name="idjeu") @JoinColumn(name="idjeu", nullable = false)
private Jeu jeu; private Jeu jeu;
} }

@ -1,4 +1,5 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -15,17 +16,17 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Entity @Entity
@Table(name="question") @Table(name="question")
public class Question extends BaseEntity { public class Question {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
private String question; private String question;
@OneToMany(mappedBy = "id") @JsonManagedReference
@Fetch(FetchMode.JOIN) // Sinon crash (Could not write JSON: failed to lazily initialize a collection of role) @OneToMany(mappedBy = "question")
@Fetch(FetchMode.JOIN) // Sinon crash (Could not write JSON: failed to lazily initialize a collection of T)
private List<Reponse> reponses; private List<Reponse> reponses;
} }

@ -1,5 +1,6 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -10,14 +11,17 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Entity @Entity
@Table(name="reponse") @Table(name="reponse")
public class Reponse extends BaseEntity { public class Reponse{
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
private String reponse; private String reponse;
@JsonBackReference
@ManyToOne
@JoinColumn(name = "idquestion", nullable = false)
private Question question;
} }

@ -0,0 +1,60 @@
package fr.iut.sciencequest.sae.entities;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
@AllArgsConstructor
@RequiredArgsConstructor
//@Relation(collectionRelation = "scientifiques", itemRelation = "scientifique")
@Data
@Entity
@Table(name = "scientifique")
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Scientifique {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@JsonBackReference
@ManyToOne
@JoinColumn(name="iddifficulte", nullable = false)
private Difficulte difficulte;
@JsonBackReference
@ManyToOne
@JoinColumn(name="idthematique", nullable = false)
private Thematique thematique;
@Column(name = "photo")
private String pathToPhoto;
@Column(nullable = false)
private String nom;
@Column(nullable = false)
private String prenom;
@Column(nullable = false)
private String descriptif;
@Column(name = "datenaissance", nullable = false)
private Date dateNaissance;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Sexe sexe;
@Column(name = "ratiotrouvee")
private BigDecimal ratioTrouve = BigDecimal.ZERO;
}

@ -1,25 +1,38 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@EqualsAndHashCode(callSuper = false)
@Entity @Entity
@Table(name="thematique") @Table(name="thematique")
public class Thematique extends BaseEntity { @JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Thematique {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private Integer id;
@Column(unique = true) @Column(unique = true)
private String libelle; private String libelle;
@JsonManagedReference
@OneToMany(mappedBy = "thematique")
@Fetch(FetchMode.JOIN)
private List<Scientifique> scientifiques;
} }

@ -1,11 +1,7 @@
package fr.iut.sciencequest.sae.entities; package fr.iut.sciencequest.sae.entities;
import fr.iut.sciencequest.sae.entities.joueur.Joueur;
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;

@ -1,10 +0,0 @@
package fr.iut.sciencequest.sae.entities.indice;
import fr.iut.sciencequest.sae.entities.scientifique.IScientifiqueIdOnlyProjection;
public interface IIndiceidAndLibelleAndScientifiqueIdOnlyProjection {
int getId();
String getLibelle();
IScientifiqueIdOnlyProjection getScientifique();
}

@ -1,3 +0,0 @@
package fr.iut.sciencequest.sae.entities.indice;
public interface IValidateOnlyLibelle {}

@ -1,37 +0,0 @@
package fr.iut.sciencequest.sae.entities.indice;
import fr.iut.sciencequest.sae.entities.BaseEntity;
import fr.iut.sciencequest.sae.entities.scientifique.Scientifique;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Entity
@Table(name="indice")
public class Indice extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotBlank(groups = {IValidateOnlyLibelle.class})
private String libelle;
@ManyToOne
@NotNull
@JoinColumn(name="idscientifique", nullable = false)
private Scientifique scientifique;
public Indice(int id, String libelle) { // Used for projection
this.id = id;
this.libelle = libelle;
}
}

@ -1,6 +0,0 @@
package fr.iut.sciencequest.sae.entities.joueur;
public interface IIdAndPseudoOnlyProjection {
int getId();
String getPseudo();
}

@ -1,5 +0,0 @@
package fr.iut.sciencequest.sae.entities.scientifique;
public interface IScientifiqueIdOnlyProjection {
int getId();
}

@ -1,58 +0,0 @@
package fr.iut.sciencequest.sae.entities.scientifique;
import fr.iut.sciencequest.sae.entities.BaseEntity;
import fr.iut.sciencequest.sae.entities.Difficulte;
import fr.iut.sciencequest.sae.entities.Sexe;
import fr.iut.sciencequest.sae.entities.Thematique;
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.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import org.hibernate.validator.constraints.URL;
import org.springframework.hateoas.server.core.Relation;
import java.math.BigDecimal;
import java.util.Date;
@AllArgsConstructor
@RequiredArgsConstructor
@Relation(collectionRelation = "scientifiques", itemRelation = "scientifique")
@Data
@EqualsAndHashCode(callSuper = false)
@Entity
@Table(name = "scientifique")
public class Scientifique extends BaseEntity {
@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;
private String prenom;
private String descriptif;
@Column(name = "datenaissance")
private Date dateNaissance;
@Enumerated(EnumType.STRING)
private Sexe sexe;
@Column(name = "ratiotrouvee")
private BigDecimal ratioTrouve = BigDecimal.ZERO;
}

@ -0,0 +1,34 @@
package fr.iut.sciencequest.sae.exceptions;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class ValidationHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
protected ResponseEntity<Object> hand(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) ->{
String fieldName = ((FieldError) error).getField();
String message = error.getDefaultMessage();
errors.put(fieldName, message);
});
return new ResponseEntity<Object>(errors, HttpStatus.BAD_REQUEST);
}
}

@ -0,0 +1,7 @@
package fr.iut.sciencequest.sae.exceptions.notFound;
public class DifficulteNotFoundException extends EntityNotFoundException{
public DifficulteNotFoundException(int id) {
super("Difficulté", id);
}
}

@ -2,6 +2,6 @@ package fr.iut.sciencequest.sae.exceptions.notFound;
public class ThematiqueNotFoundException extends EntityNotFoundException{ public class ThematiqueNotFoundException extends EntityNotFoundException{
public ThematiqueNotFoundException(int id) { public ThematiqueNotFoundException(int id) {
super("thématique", id); super("Thématique", id);
} }
} }

@ -6,4 +6,6 @@ import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@Repository @Repository
public interface DifficulteRepository extends JpaRepository<Difficulte, Integer> {} public interface DifficulteRepository extends JpaRepository<Difficulte, Integer> {
Difficulte findDifficulteByLibelleEqualsIgnoreCase(String libelle);
}

@ -1,6 +1,6 @@
package fr.iut.sciencequest.sae.repositories; package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.indice.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.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -11,4 +11,6 @@ public interface IndiceRepository extends PagingAndSortingRepository<Indice, Int
boolean existsByScientifiqueId(int id); boolean existsByScientifiqueId(int id);
Iterable<Indice> findByScientifiqueId(int id); Iterable<Indice> findByScientifiqueId(int id);
Indice getById(int id);
} }

@ -1,6 +1,6 @@
package fr.iut.sciencequest.sae.repositories; package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.joueur.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; import org.springframework.stereotype.Repository;

@ -1,10 +1,19 @@
package fr.iut.sciencequest.sae.repositories; package fr.iut.sciencequest.sae.repositories;
import fr.iut.sciencequest.sae.entities.scientifique.Scientifique; import fr.iut.sciencequest.sae.entities.Difficulte;
import fr.iut.sciencequest.sae.entities.Scientifique;
import fr.iut.sciencequest.sae.entities.Thematique;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
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; import org.springframework.stereotype.Repository;
@Repository @Repository
public interface ScientifiqueRepository extends PagingAndSortingRepository<Scientifique, Integer>, CrudRepository<Scientifique, Integer> { public interface ScientifiqueRepository extends JpaRepository<Scientifique, Integer> {
Page<Scientifique> findAllByDifficulteEquals(Difficulte difficulte, Pageable pageable);
Page<Scientifique> findAllByThematiqueEquals(Thematique thematique, Pageable pageable);
Page<Scientifique> findAllByThematiqueEqualsAndDifficulteEquals(Thematique thematique, Difficulte difficulte, Pageable pageable);
} }

@ -8,4 +8,5 @@ import org.springframework.stereotype.Repository;
@Repository @Repository
public interface ThematiqueRepository extends CrudRepository<Thematique, Integer> { public interface ThematiqueRepository extends CrudRepository<Thematique, Integer> {
boolean existsByLibelle(String libelle); boolean existsByLibelle(String libelle);
Thematique findThematiqueByLibelleEqualsIgnoreCase(String thematique);
} }

@ -1,7 +1,6 @@
package fr.iut.sciencequest.sae.services; package fr.iut.sciencequest.sae.services;
import fr.iut.sciencequest.sae.entities.indice.IIndiceidAndLibelleAndScientifiqueIdOnlyProjection; import fr.iut.sciencequest.sae.entities.Indice;
import fr.iut.sciencequest.sae.entities.indice.Indice;
import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException; import fr.iut.sciencequest.sae.exceptions.DuplicatedIdException;
import fr.iut.sciencequest.sae.exceptions.notFound.IndiceNotFoundException; import fr.iut.sciencequest.sae.exceptions.notFound.IndiceNotFoundException;
import fr.iut.sciencequest.sae.repositories.IndiceRepository; import fr.iut.sciencequest.sae.repositories.IndiceRepository;
@ -18,8 +17,8 @@ public class IndiceService implements IIndiceService {
} }
@Override @Override
public Iterable<IIndiceidAndLibelleAndScientifiqueIdOnlyProjection> findByScientifiqueId(int id) { public Iterable<Indice> findByScientifiqueId(int id) {
return this.indiceRepository.findByScientifiqueId(id, IIndiceidAndLibelleAndScientifiqueIdOnlyProjection.class); return this.indiceRepository.findByScientifiqueId(id);
} }
@Override @Override

@ -1,27 +1,32 @@
package fr.iut.sciencequest.sae.services; package fr.iut.sciencequest.sae.services;
import fr.iut.sciencequest.sae.entities.scientifique.Scientifique; import fr.iut.sciencequest.sae.entities.Difficulte;
import fr.iut.sciencequest.sae.entities.indice.IIndiceidAndLibelleAndScientifiqueIdOnlyProjection; import fr.iut.sciencequest.sae.entities.Scientifique;
import fr.iut.sciencequest.sae.entities.Indice;
import fr.iut.sciencequest.sae.entities.Thematique;
import fr.iut.sciencequest.sae.exceptions.notFound.DifficulteNotFoundException;
import fr.iut.sciencequest.sae.exceptions.notFound.ScientifiqueNotFoundException; import fr.iut.sciencequest.sae.exceptions.notFound.ScientifiqueNotFoundException;
import fr.iut.sciencequest.sae.exceptions.notFound.ThematiqueNotFoundException;
import fr.iut.sciencequest.sae.repositories.DifficulteRepository;
import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository; import fr.iut.sciencequest.sae.repositories.ScientifiqueRepository;
import fr.iut.sciencequest.sae.repositories.ThematiqueRepository;
import fr.iut.sciencequest.sae.services.interfaces.IScientifiqueService; import fr.iut.sciencequest.sae.services.interfaces.IScientifiqueService;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.NoSuchElementException;
import java.util.Optional;
@AllArgsConstructor
@Service @Service
public class ScientifiqueService implements IScientifiqueService { public class ScientifiqueService implements IScientifiqueService {
private static final int PAGE_SIZE = 1;
private final ScientifiqueRepository scientifiqueRepository; private final ScientifiqueRepository scientifiqueRepository;
private final ThematiqueRepository thematiqueRepository;
private final DifficulteRepository difficulteRepository;
private final IndiceService indiceService; private final IndiceService indiceService;
public ScientifiqueService(ScientifiqueRepository scientifiqueRepository, IndiceService indiceService) {
this.scientifiqueRepository = scientifiqueRepository;
this.indiceService = indiceService;
}
@Override @Override
public Scientifique update(Scientifique scientifique) { public Scientifique update(Scientifique scientifique) {
@ -35,6 +40,25 @@ public class ScientifiqueService implements IScientifiqueService {
@Override @Override
public Page<Scientifique> findAll(Pageable page) { public Page<Scientifique> findAll(Pageable page) {
return scientifiqueRepository.findAll(page);
}
public Page<Scientifique> findAllWithCriteria(Pageable page, Integer tId, Integer dId) {
Thematique thematique = null;
Difficulte difficulte = null;
if (tId != -1) thematique = thematiqueRepository.findById(tId).orElseThrow(() -> new ThematiqueNotFoundException(tId));
if (dId != -1) difficulte = difficulteRepository.findById(dId).orElseThrow(() -> new DifficulteNotFoundException(dId));
if (thematique != null && difficulte != null) {
return scientifiqueRepository.findAllByThematiqueEqualsAndDifficulteEquals(thematique, difficulte, page);
} else if (thematique != null) {
return scientifiqueRepository.findAllByThematiqueEquals(thematique, page);
} else if (difficulte != null) {
return scientifiqueRepository.findAllByDifficulteEquals(difficulte, page);
}
return scientifiqueRepository.findAll(page); return scientifiqueRepository.findAll(page);
} }
@ -44,7 +68,7 @@ public class ScientifiqueService implements IScientifiqueService {
} }
@Override @Override
public Iterable<IIndiceidAndLibelleAndScientifiqueIdOnlyProjection> getLinkedIndicesByScientifiqueId(int id){ public Iterable<Indice> getLinkedIndicesByScientifiqueId(int id){
if(!this.scientifiqueRepository.existsById(id)){ if(!this.scientifiqueRepository.existsById(id)){
throw new ScientifiqueNotFoundException(id); throw new ScientifiqueNotFoundException(id);
} }

@ -1,10 +1,9 @@
package fr.iut.sciencequest.sae.services.interfaces; package fr.iut.sciencequest.sae.services.interfaces;
import fr.iut.sciencequest.sae.entities.indice.IIndiceidAndLibelleAndScientifiqueIdOnlyProjection; import fr.iut.sciencequest.sae.entities.Indice;
import fr.iut.sciencequest.sae.entities.indice.Indice;
public interface IIndiceService { public interface IIndiceService {
Iterable<IIndiceidAndLibelleAndScientifiqueIdOnlyProjection> findByScientifiqueId(int id); Iterable<Indice> findByScientifiqueId(int id);
Indice update(Indice indice); Indice update(Indice indice);
Indice create(Indice indice); Indice create(Indice indice);
} }

@ -1,7 +1,7 @@
package fr.iut.sciencequest.sae.services.interfaces; package fr.iut.sciencequest.sae.services.interfaces;
import fr.iut.sciencequest.sae.entities.scientifique.Scientifique; import fr.iut.sciencequest.sae.entities.Indice;
import fr.iut.sciencequest.sae.entities.indice.IIndiceidAndLibelleAndScientifiqueIdOnlyProjection; import fr.iut.sciencequest.sae.entities.Scientifique;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@ -11,8 +11,9 @@ public interface IScientifiqueService {
Scientifique create(Scientifique scientifique); Scientifique create(Scientifique scientifique);
Page<Scientifique> findAll(Pageable page); Page<Scientifique> findAll(Pageable page);
Page<Scientifique> findAllWithCriteria(Pageable page, Integer tId, Integer dId);
Scientifique findById(int id); Scientifique findById(int id);
Iterable<IIndiceidAndLibelleAndScientifiqueIdOnlyProjection> getLinkedIndicesByScientifiqueId(int id); Iterable<Indice> getLinkedIndicesByScientifiqueId(int id);
} }

Loading…
Cancel
Save