PersonneController.java 5.41 KB
package etunicorn.controller;

import etunicorn.RestrictedTo;
import etunicorn.entity.Personne;
import etunicorn.entity.Role;
import etunicorn.exception.EntityRequestMismatchException;
import etunicorn.exception.NotEnoughDataException;
import etunicorn.exception.ObjectNotFoundException;
import etunicorn.generated.model.UpdatePersonneByIdRequest;
import etunicorn.generated.model.UpdatePersonneRequest;
import etunicorn.repository.PersonneRepository;
import etunicorn.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * etunicorn-server
 * Copyright © 2017 Le Club Info Polytech Lille
 * Tous droits réservés
 */

@RestController
public class PersonneController extends BaseController implements etunicorn.generated.PersonneController {
    @Autowired
    private PersonneRepository personneRepository;

    @Autowired
    private RoleRepository roleRepository;

    @Override
    @RestrictedTo("PERSONNE_LIST")
    public ResponseEntity<?> getPersonne() {
        return new ResponseEntity<List>((List) this.personneRepository.findAll(), HttpStatus.OK);
    }

    private ResponseEntity<?> mergePersonne(Personne personne, String carte, Date naissance, String login, String role) {
        if (carte != null) {
            personne.setCarte(carte);
        }
        if (naissance != null) {
            personne.setNaissance(naissance);
        }
        if (login != null) {
            personne.setLogin(login);
        }
        // TODO Il faut que login ou carte soient mis
        if (role != null) {
            if (hasPermission("PERSONNE_ROLE")) {
                Role roleObj = roleRepository.findByNom(role);
                personne.setRole(roleObj);
                if (roleObj == null) {
                    return new ResponseEntity<Object>("Rôle inconnu", HttpStatus.NOT_FOUND);
                }
            } else {
                return new ResponseEntity<Object>(HttpStatus.FORBIDDEN);
            }
        }
        try {
            this.personneRepository.save(personne);
        } catch (DataIntegrityViolationException e) {
            return new ResponseEntity<Object>(HttpStatus.CONFLICT);
        }
        return new ResponseEntity<Object>(personne, HttpStatus.CREATED);
    }

    @Override
    @RestrictedTo("PERSONNE_ADD")
    public ResponseEntity<?> updatePersonne(@Valid @RequestBody UpdatePersonneRequest updatePersonneRequest) {
        Personne personne = new Personne();
        try {
            mergeRequestInEntity(updatePersonneRequest, personne);
        } catch (EntityRequestMismatchException e) {
            return generateError(e);
        } catch (NotEnoughDataException e) {
            return generateError(HttpStatus.BAD_REQUEST, e, "Il n'y a pas suffisament de données pour identifier un sous-objet");
        } catch (ObjectNotFoundException e) {
            return generateError(HttpStatus.NOT_FOUND, e, "Sous-objet non trouvé");
        }
        return new ResponseEntity<Object>(personne, HttpStatus.CREATED);
    }
    public ResponseEntity<?> updatePersonne(@RequestParam(required = false) String carte, @RequestParam(required = false) Date naissance, @RequestParam(required = false) String login, @RequestParam(required = false) String role) {
        Personne personne = new Personne();
        return mergePersonne(personne, carte, naissance, login, role);
    }

    @Override
    @RestrictedTo("PERSONNE_GET")
    public ResponseEntity<?> getPersonneById(@PathVariable BigDecimal idPersonne) {
        Personne personne = personneRepository.findById(idPersonne.intValueExact());
        if (personne == null) {
            return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity<Object>(personne, HttpStatus.OK);
    }

    @Override
    @RestrictedTo("PERSONNE_EDIT")
    public ResponseEntity<?> updatePersonneById(@PathVariable BigDecimal idPersonne, @Valid @RequestBody UpdatePersonneByIdRequest updatePersonneByIdRequest) {
        return null;
    }

    public ResponseEntity<?> updatePersonneById(@PathVariable BigDecimal idPersonne, @RequestParam(required = false) String carte, @RequestParam(required = false) Date naissance, @RequestParam(required = false) String login, @RequestParam(required = false) String role) {
        Personne personne = personneRepository.findById(idPersonne.intValueExact());
        if (personne == null) {
            return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
        }
        return mergePersonne(personne, carte, naissance, login, role);
    }

    @Override
    @RestrictedTo("PERSONNE_REMOVE")
    public ResponseEntity<?> deletePersonneById(@PathVariable BigDecimal idPersonne) {
        Personne personne = personneRepository.findById(idPersonne.intValueExact());
        if (personne == null) {
            return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
        }
        personneRepository.delete(personne);
        return new ResponseEntity<Object>(personne, HttpStatus.NO_CONTENT);
    }

}