Commit 74878490 authored by Kevin Robert's avatar Kevin Robert
Browse files

UNOTOPLYS-332 : Controle d'accès sur un questionnaire.

parent 356dd182
......@@ -223,7 +223,7 @@ public class NavigationService {
* @return Le premier écran du formulaire s'il existe.
*/
private ScreenDTO retrieveFirstScreen(final Long formId) {
return screenService.findFirstScreenOfForm(formId).orElseThrow(() -> new FirstScreenNotFound(formId));
return screenService.findFirstScreenOfFormWithoutRestriction(formId).orElseThrow(() -> new FirstScreenNotFound(formId));
}
/**
......
package com.unantes.orientactive.service;
import com.unantes.orientactive.domain.Answer;
import com.unantes.orientactive.domain.User;
import com.unantes.orientactive.repository.AnswerRepository;
import com.unantes.orientactive.repository.UserActionRepository;
import com.unantes.orientactive.service.dto.AnswerDTO;
import com.unantes.orientactive.service.dto.FormDTO;
import com.unantes.orientactive.service.mapper.AnswerMapper;
import com.unantes.orientactive.web.rest.FormCompletionTime;
import com.unantes.orientactive.web.rest.ResultsPreview;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -47,21 +50,23 @@ public class AnswerService {
*/
private final AnswerMapper answerMapper;
private final FormService formService;
/**
* Constructeur complet.
*
* @param answerRepository Repository des réponses.
* @param answerMapper Mapper des réponse.
* @param formService
*/
public AnswerService(final AnswerRepository answerRepository, final AnswerMapper answerMapper, final UserActionRepository userActionRepository) {
public AnswerService(final AnswerRepository answerRepository, final AnswerMapper answerMapper, final UserActionRepository userActionRepository, final FormService formService) {
this.answerRepository = answerRepository;
this.answerMapper = answerMapper;
this.userActionRepository = userActionRepository;
this.formService = formService;
}
/**
* Save a answer.
*
* @param answerDTO the entity to save.
* @return the persisted entity.
*/
......@@ -75,7 +80,6 @@ public class AnswerService {
/**
* Sauvegarde d'une réponses contenant une mise à jour.
* Supprime les réponses suivantes car elles ne sont plus d'actualités.
*
* @param answerDTO the entity to save.
* @return the persisted entity.
*/
......@@ -90,7 +94,6 @@ public class AnswerService {
/**
* Get all the answers.
*
* @return the list of entities.
*/
@Transactional(readOnly = true)
......@@ -101,7 +104,6 @@ public class AnswerService {
/**
* Get all the answers where Next is {@code null}.
*
* @return the list of entities.
*/
@Transactional(readOnly = true)
......@@ -116,7 +118,6 @@ public class AnswerService {
/**
* Get one answer by id.
*
* @param id the id of the entity.
* @return the entity.
*/
......@@ -128,7 +129,6 @@ public class AnswerService {
/**
* Delete the answer by id.
*
* @param id the id of the entity.
*/
public void delete(Long id) {
......@@ -138,7 +138,6 @@ public class AnswerService {
/**
* Récupération des réponses d'un utilisateur pour un formulaire.
*
* @param sessionId L'identifiant de la session de l'utilisateur.
* @param formId L'identifiant du formulaire.
* @return Les réponses.
......@@ -155,7 +154,6 @@ public class AnswerService {
/**
* Récupération des réponses pour une liste de session.
*
* @param idSessions Les identifiants des sessions.
* @param formId L'identifiant du formulaire.
* @return Les réponses.
......@@ -167,7 +165,6 @@ public class AnswerService {
/**
* Récupération de la réponse d'un utilisateur pour un écran donné.
*
* @param sessionId L'identifiant de la session de l'utilisateur.
* @param screenId L'identifiant de l'écran.
* @return La réponse si elle existe.
......@@ -181,7 +178,6 @@ public class AnswerService {
* Compte du nombre de réponses saisies précédement par l'utilisateur à partir de l'écran donné.
* <p>
* Attention : L'écran courant compte dans le total des réponses.
*
* @param screenId L'identifiant de l'écran.
* @param sessionId L'identifiant de session.
* @return Le compte du nombre de réponses précédentes.
......@@ -198,7 +194,6 @@ public class AnswerService {
/**
* Suppression des réponses suivantes à la réponse passée.
* La réponse passée en paramètre n'est pas supprimée.
*
* @param currentAnswerId L'identifiant de la session.
*/
public void deleteNextAnswers(final Long currentAnswerId) {
......@@ -208,7 +203,6 @@ public class AnswerService {
/**
* Partially update a answer.
*
* @param answerDTO the entity to update partially.
* @return the persisted entity.
*/
......@@ -229,11 +223,14 @@ public class AnswerService {
/**
* Récupération de la preview des résultats d'un formulaire.
*
* @param formId L'identifiant du formulaire.
* @return La preview des résultats.
*/
public ResultsPreview getResultPreview(Long formId) {
public ResultsPreview getResultPreview(Long formId, User user) {
final FormDTO form = formService.findOne(formId).orElseThrow();
if (!formService.hasPermission(user, form)) {
throw new AccessDeniedException("Action non autorisée");
}
final Integer viewNumber = answerRepository.numberOfViewsForForm(formId);
final Integer completedNumber = answerRepository.numberOfCompletedAnswerForForm(formId);
final List<String> sessionWithCompleteAnswer = answerRepository.sessionWithCompletedAnswerForForm(formId);
......@@ -248,7 +245,6 @@ public class AnswerService {
/**
* Récupération du nombre de réponses complètes pour un formulaire.
*
* @param formId L'identifiant du formulaire.
* @return Le nombre de réponses complètes.
*/
......
......@@ -55,11 +55,15 @@ public class ScreenService {
/**
* Save a screen.
*
* @param screenDTO the entity to save.
* @return the persisted entity.
*/
public ScreenDTO save(ScreenDTO screenDTO) {
public ScreenDTO save(ScreenDTO screenDTO, User user) {
log.debug("Récupération du premier écran du formulaire d'identifiant '{}'.", screenDTO.getFormId());
final FormDTO form = formService.findOne(screenDTO.getFormId()).orElseThrow();
if (!formService.hasPermission(user, form)) {
throw new AccessDeniedException("Action non autorisée");
}
log.debug("Request to save Screen : {}", screenDTO);
Screen screen = screenMapper.toEntity(screenDTO);
screen = screenRepository.save(screen);
......@@ -68,7 +72,6 @@ public class ScreenService {
/**
* Partially update a screen.
*
* @param screenDTO the entity to update partially.
* @return the persisted entity.
*/
......@@ -83,7 +86,6 @@ public class ScreenService {
/**
* Get all the screens.
*
* @return the list of entities.
*/
@Transactional(readOnly = true)
......@@ -94,7 +96,6 @@ public class ScreenService {
/**
* Get one screen by id.
*
* @param id the id of the entity.
* @return the entity.
*/
......@@ -106,7 +107,6 @@ public class ScreenService {
/**
* Delete the screen by id.
*
* @param id the id of the entity.
*/
public void delete(Long id) {
......@@ -128,7 +128,6 @@ public class ScreenService {
/**
* Récupération d'un écran par sa référence.
*
* @param reference La référence de l'écran.
* @return L'écran s'il existe.
*/
......@@ -139,18 +138,29 @@ public class ScreenService {
/**
* Récupération du premier écran du formulaire.
*
* @param formId L'identifiant du formulaire.
* @return Le premier écran.
*/
public Optional<ScreenDTO> findFirstScreenOfForm(final Long formId) {
public Optional<ScreenDTO> findFirstScreenOfForm(final Long formId, User user) {
log.debug("Récupération du premier écran du formulaire d'identifiant '{}'.", formId);
final FormDTO form = formService.findOne(formId).orElseThrow();
if (!formService.hasPermission(user, form)) {
throw new AccessDeniedException("Action non autorisée");
}
return screenRepository.findFirstScreenOfForm(formId).map(screenMapper::toDto);
}
/**
* Récupération du premier écran du formulaire.
* @param formId L'identifiant du formulaire.
* @return Le premier écran.
*/
public Optional<ScreenDTO> findFirstScreenOfFormWithoutRestriction(final Long formId) {
return screenRepository.findFirstScreenOfForm(formId).map(screenMapper::toDto);
}
/**
* Récupération de l'écran précédent pour le processus de saisie de l'utilisateur.
*
* @param currentScreenId L'identifiant de l'écran courant.
* @param sessionId L'identifiant de la session de l'utilisateur.
* @return L'écran précédent s'il existe.
......@@ -162,7 +172,6 @@ public class ScreenService {
/**
* Récupération de l'écran suivant dans le processus de saisie de l'utilisateur.
*
* @param currentScreenId L'identifiant de l'écran courant.
* @param sessionId L'identifiant de la session de l'utilisateur.
* @return L'écran suivant s'il existe.
......@@ -176,7 +185,6 @@ public class ScreenService {
* Compte du nombre d'écrans restant potentiellement à saisir.
* <p>
* Attention : L'écran courant compte comme un écran à saisir.
*
* @param formId L'identifiant du formulaire.
* @param screenId L'identifiant de l'écran.
* @return Le nombre d'écran potentiellement restant.
......@@ -188,7 +196,6 @@ public class ScreenService {
/**
* Retourne les écrans du formulaire.
*
* @param formId
* @param user
* @return
......@@ -217,7 +224,6 @@ public class ScreenService {
/**
* Récupération des écrans d'un formulaire sans passer par les droits.
*
* @param formId L'identifiant du formulaire.
* @return La liste des écrans.
*/
......@@ -227,7 +233,6 @@ public class ScreenService {
/**
* Récupération de l'écran via son index et son formulaire.
*
* @param index L'index de l'écran.
* @param formId L'identifiant du formulaire.
* @return L'écran s'il existe.
......@@ -238,7 +243,6 @@ public class ScreenService {
/**
* Modifie les élements de l'écran ciblés par le patch. Si l'index est modifié : met à jour les écrans impactés.
*
* @param id un identifiant d'écran en base de donnée
* @param patch le patch à appliquer
* @return
......@@ -259,7 +263,6 @@ public class ScreenService {
/**
* Met à jour si nécessaire l'ordre d'un écran et ceux des écrans impactés
*
* @param oldScreen l'ancien écran
* @param patchedScreen l'écran modifié
*/
......@@ -275,7 +278,6 @@ public class ScreenService {
/**
* Met à jour l'ordre d'un écran et ceux des écrans impactés
*
* @param id l'ancien écran
* @param oldIndex l'écran modifié
* @param newIndex l'écran modifié
......
package com.unantes.orientactive.web.rest;
import com.unantes.orientactive.domain.User;
import com.unantes.orientactive.repository.AnswerRepository;
import com.unantes.orientactive.service.AnswerService;
import com.unantes.orientactive.service.UserService;
import com.unantes.orientactive.service.dto.AnswerDTO;
import com.unantes.orientactive.web.rest.errors.BadRequestAlertException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
......@@ -25,6 +28,7 @@ import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.Principal;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
......@@ -47,14 +51,16 @@ public class AnswerResource {
private final AnswerRepository answerRepository;
public AnswerResource(AnswerService answerService, AnswerRepository answerRepository) {
private final UserService userService;
public AnswerResource(AnswerService answerService, AnswerRepository answerRepository, final UserService userService) {
this.answerService = answerService;
this.answerRepository = answerRepository;
this.userService = userService;
}
/**
* {@code POST /answers} : Create a new answer.
*
* @param answerDTO the answerDTO to create.
* @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new answerDTO, or with status {@code 400 (Bad Request)} if the answer has already an ID.
* @throws URISyntaxException if the Location URI syntax is incorrect.
......@@ -74,7 +80,6 @@ public class AnswerResource {
/**
* {@code PUT /answers/:id} : Updates an existing answer.
*
* @param id the id of the answerDTO to save.
* @param answerDTO the answerDTO to update.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated answerDTO,
......@@ -108,7 +113,6 @@ public class AnswerResource {
/**
* {@code PATCH /answers/:id} : Partial updates given fields of an existing answer, field will ignore if it is null
*
* @param id the id of the answerDTO to save.
* @param answerDTO the answerDTO to update.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated answerDTO,
......@@ -144,7 +148,6 @@ public class AnswerResource {
/**
* {@code GET /answers} : get all the answers.
*
* @param filter the filter of the request.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of answers in body.
*/
......@@ -160,7 +163,6 @@ public class AnswerResource {
/**
* {@code GET /answers/:id} : get the "id" answer.
*
* @param id the id of the answerDTO to retrieve.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the answerDTO, or with status {@code 404 (Not Found)}.
*/
......@@ -173,7 +175,6 @@ public class AnswerResource {
/**
* {@code DELETE /answers/:id} : delete the "id" answer.
*
* @param id the id of the answerDTO to delete.
* @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
*/
......@@ -189,19 +190,19 @@ public class AnswerResource {
/**
* Récupération de la preview des résultats du formulaire.
*
* @param formId L'identifiant du formulaire.
* @return La preview.
*/
@GetMapping("/answers/preview/{formId}")
public ResultsPreview getResultPreview(@PathVariable Long formId) {
return answerService.getResultPreview(formId);
public ResultsPreview getResultPreview(@PathVariable Long formId, Principal principal) {
final Optional<User> userOptional = userService.getUserWithAuthoritiesByLogin(principal.getName());
final User user = userOptional.orElseThrow(() -> new UsernameNotFoundException(principal.getName()));
return answerService.getResultPreview(formId, user);
}
/**
* Récupération du nombre de réponses complètes d'un formulaire.
*
* @param idForm L'identifiant du formulaire.
* @return Le nombre de formulaire.
*/
......
package com.unantes.orientactive.web.rest;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.Principal;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.hibernate.exception.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.github.fge.jsonpatch.JsonPatch;
import com.unantes.orientactive.condition.DisplayConditions;
import com.unantes.orientactive.condition.ExpressionService;
......@@ -47,9 +19,34 @@ import com.unantes.orientactive.web.rest.errors.ScreenReferenceAlreadyUsedExcept
import com.unantes.orientactive.web.rest.model.DisplayConditionAPI;
import com.unantes.orientactive.web.rest.model.ExpressionElement;
import com.unantes.orientactive.web.rest.model.ScreenAPI;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.hibernate.exception.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.jhipster.web.util.HeaderUtil;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.Principal;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* REST controller for managing {@link com.unantes.orientactive.domain.Screen}.
*/
......@@ -81,19 +78,20 @@ public class ScreenResource {
/**
* {@code POST /screens} : Create a new screen.
*
* @param screenDTO the screenDTO to create.
* @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new screenDTO, or with status {@code 400 (Bad Request)} if the screen has already an ID.
* @throws URISyntaxException if the Location URI syntax is incorrect.
*/
@PostMapping("/screens")
public ResponseEntity<ScreenDTO> createScreen(@Valid @RequestBody ScreenDTO screenDTO) throws URISyntaxException {
public ResponseEntity<ScreenDTO> createScreen(@Valid @RequestBody ScreenDTO screenDTO, Principal principal) throws URISyntaxException {
final Optional<User> userOptional = userService.getUserWithAuthoritiesByLogin(principal.getName());
final User user = userOptional.orElseThrow(() -> new UsernameNotFoundException(principal.getName()));
log.debug("REST request to save Screen : {}", screenDTO);
if (screenDTO.getId() != null) {
throw new BadRequestAlertException("A new screen cannot already have an ID", ENTITY_NAME, "idexists");
}
try {
ScreenDTO result = screenService.save(screenDTO);
ScreenDTO result = screenService.save(screenDTO, user);
return ResponseEntity
.created(new URI("/api/screens/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
......@@ -127,22 +125,25 @@ public class ScreenResource {
}
@GetMapping("/forms/{formId}/firstscreen")
public ScreenDTO getFirstScreenForForm(@PathVariable Long formId) {
return screenService.findFirstScreenOfForm(formId).orElseThrow(ScreenNotFoundException::new);
public ScreenDTO getFirstScreenForForm(@PathVariable Long formId, Principal principal) {
final Optional<User> userOptional = userService.getUserWithAuthoritiesByLogin(principal.getName());
final User user = userOptional.orElseThrow(() -> new UsernameNotFoundException(principal.getName()));
return screenService.findFirstScreenOfForm(formId, user).orElseThrow(ScreenNotFoundException::new);
}
/**
* {@code PUT /screens} : Updates an existing screen.
*
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated screenDTO,
* or with status {@code 400 (Bad Request)} if the screenDTO is not valid,
* or with status {@code 500 (Internal Server Error)} if the screenDTO couldn't be updated.
* @throws URISyntaxException if the Location URI syntax is incorrect.
*/
@PutMapping("/screens")
public ResponseEntity<ScreenAPI> updateScreen(@Valid @RequestBody ScreenAPI screenAPI, final HttpServletRequest request) throws URISyntaxException {
public ResponseEntity<ScreenAPI> updateScreen(@Valid @RequestBody ScreenAPI screenAPI, final HttpServletRequest request, Principal principal) throws URISyntaxException {
final Optional<User> userOptional = userService.getUserWithAuthoritiesByLogin(principal.getName());
final User user = userOptional.orElseThrow(() -> new UsernameNotFoundException(principal.getName()));
try {
ScreenDTO result = screenService.save(screenAPI.toDto());
ScreenDTO result = screenService.save(screenAPI.toDto(), user);
return ResponseEntity
.ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
......@@ -175,7 +176,6 @@ public class ScreenResource {
/**
* {@code GET /screens/:id} : get the "id" screen.
*
* @param id the id of the screenDTO to retrieve.
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the screenDTO, or with status {@code 404 (Not Found)}.
*/
......@@ -188,7 +188,6 @@ public class ScreenResource {
/**
* Génération d'un ScreenAPI depuis un ScreenDTO.
*
* @param screenDTO Le ScreenDTO.
*/
private ScreenAPI generateScreenApi(ScreenDTO screenDTO) {
......@@ -205,7 +204,6 @@ public class ScreenResource {
/**
* {@code DELETE /screens/:id} : delete the "id" screen.
*
* @param id the id of the screenDTO to delete.
* @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
*/
......@@ -221,7 +219,6 @@ public class ScreenResource {
/**
* Récupération de la condition d'affichage d'un item.
*
* @param screenId L'identifiant de l'écran.
* @param itemReference La référence de l'item.
* @return La condition d'affichage de l'item.
......@@ -242,7 +239,6 @@ public class ScreenResource {
/**
* Récupération de l'écran.
*
* @param screenId L'identifiant de l'écran.
* @return L'écran.
*/
......@@ -253,7 +249,6 @@ public class ScreenResource {
/**
* Récupération d'un item.
*
* @param itemReference La référence de l'item.
* @param screenDTO L'écran contenant l'item.
* @return L'item.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment