DateSondageController.java
package fr.univ.lorraine.ufr.mim.m2.gi.mysurvey.controllers;
import fr.univ.lorraine.ufr.mim.m2.gi.mysurvey.dtos.DateSondageDto;
import fr.univ.lorraine.ufr.mim.m2.gi.mysurvey.exception.DateSondageAlreadyExistsException;
import fr.univ.lorraine.ufr.mim.m2.gi.mysurvey.models.DateSondage;
import fr.univ.lorraine.ufr.mim.m2.gi.mysurvey.services.DateSondageService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.persistence.NoResultException;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import java.util.Date;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.TimeZone;
@RestController
@RequestMapping(value = "/api/datesondage")
public class DateSondageController {
@Autowired
private DateSondageService service;
@Autowired
private ModelMapper mapper;
/**
* Création d'une date de sondage pour un sondage
* @param id d'un sondage
* @param dto du sondage à créer
* @return sondage créé
*/
@PostMapping(value = "/{id}")
@ResponseStatus(HttpStatus.CREATED)
@Operation(summary = "Créer un sondage", description = "Retourne le sondage créé.")
public DateSondageDto create(@PathVariable("id") Long id, @RequestBody DateSondageDto dto) {
TimeZone tz = TimeZone.getDefault(); // pour enlever le fuseau horaire set par le système local
if (dto.getDate() == null)
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Précisez une date valide.");
Date localDTO = new Date(dto.getDate().getTime() - tz.getRawOffset());
if(localDTO.before(new Date()))
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Vous ne pouvez pas donner une date dans le passé");
try{
service.checkIfDateAlreadyExists(id, dto);
var model = mapper.map(dto, DateSondage.class);
var result = service.create(id, model);
return mapper.map(result, DateSondageDto.class);
} catch(DateSondageAlreadyExistsException | NoSuchElementException e){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage());
}
catch (Exception e) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Erreur lors de la création de la date.");
}
}
/**
* Récupération des dates d'un sondage
* @param id du sondage
* @return liste des dates récupérées
*/
@GetMapping(value = "/{id}")
@ResponseStatus(HttpStatus.OK)
@Operation(summary = "Récupérer la liste des dates d'un sondage", description = "Retourne la liste récupérée.")
public List<DateSondageDto> getAllDatesBySondageId(@PathVariable("id") Long id) {
try {
var models = service.getBySondageId(id);
return models.stream()
.map(model -> mapper.map(model, DateSondageDto.class))
.toList();
}
catch(NoSuchElementException e){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage());
}
catch(NoResultException e) {
throw new ResponseStatusException(HttpStatus.NO_CONTENT, e.getMessage());
}
catch (Exception e) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Erreur lors de la récupération des dates.");
}
}
/**
* Suppression d'une date d'un sondage
* @param id de la date à supprimer
*/
@DeleteMapping(value = "/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
@Operation(summary = "Supprimer une date de sondage", description = "Ne retourne rien.")
public void delete(@PathVariable("id") Long id) {
try {
service.delete(id);
}
catch(NoSuchElementException e){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage());
}
catch (Exception e) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Erreur lors de la suppression de la date.");
}
}
}