package org.synyx.urlaubsverwaltung.web.department; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.DataBinder; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.synyx.urlaubsverwaltung.core.department.Department; import org.synyx.urlaubsverwaltung.core.department.DepartmentService; import org.synyx.urlaubsverwaltung.core.person.Person; import org.synyx.urlaubsverwaltung.core.person.PersonService; import org.synyx.urlaubsverwaltung.security.SecurityRules; import org.synyx.urlaubsverwaltung.web.ControllerConstants; import org.synyx.urlaubsverwaltung.web.PersonPropertyEditor; import org.synyx.urlaubsverwaltung.web.person.PersonConstants; import java.util.List; import java.util.Optional; /** * @author Daniel Hammann - <hammann@synyx.de> */ @Controller @RequestMapping(value = "/web") public class DepartmentController { @Autowired private DepartmentService departmentService; @Autowired private PersonService personService; @Autowired private DepartmentValidator validator; @InitBinder public void initBinder(DataBinder binder) { binder.registerCustomEditor(Person.class, new PersonPropertyEditor(personService)); } @PreAuthorize(SecurityRules.IS_BOSS_OR_OFFICE) @RequestMapping(value = "/department", method = RequestMethod.GET) public String showAllDepartments(Model model) { List<Department> departments = departmentService.getAllDepartments(); model.addAttribute(DepartmentConstants.DEPARTMENTS_ATTRIBUTE, departments); return DepartmentConstants.DEPARTMENT_JSP; } @PreAuthorize(SecurityRules.IS_OFFICE) @RequestMapping(value = "/department/new", method = RequestMethod.GET) public String newDepartmentForm(Model model) { List<Person> persons = getPersons(); model.addAttribute(DepartmentConstants.DEPARTMENT_ATTRIBUTE, new Department()); model.addAttribute(PersonConstants.PERSONS_ATTRIBUTE, persons); return DepartmentConstants.DEPARTMENT_FORM_JSP; } private List<Person> getPersons() { return personService.getActivePersons(); } @PreAuthorize(SecurityRules.IS_OFFICE) @RequestMapping(value = "/department", method = RequestMethod.POST) public String newDepartment(@ModelAttribute(DepartmentConstants.DEPARTMENT_ATTRIBUTE) Department department, Errors errors, Model model, RedirectAttributes redirectAttributes) { validator.validate(department, errors); if (errors.hasErrors()) { List<Person> persons = getPersons(); model.addAttribute(DepartmentConstants.DEPARTMENT_ATTRIBUTE, department); model.addAttribute(PersonConstants.PERSONS_ATTRIBUTE, persons); return DepartmentConstants.DEPARTMENT_FORM_JSP; } departmentService.create(department); redirectAttributes.addFlashAttribute("createdDepartment", department); return "redirect:/web/department/"; } @PreAuthorize(SecurityRules.IS_OFFICE) @RequestMapping(value = "/department/{departmentId}/edit", method = RequestMethod.GET) public String editDepartment(@PathVariable("departmentId") Integer departmentId, Model model) throws UnknownDepartmentException { Department department = departmentService.getDepartmentById(departmentId).orElseThrow(() -> new UnknownDepartmentException(departmentId)); List<Person> persons = getPersons(); model.addAttribute(DepartmentConstants.DEPARTMENT_ATTRIBUTE, department); model.addAttribute(PersonConstants.PERSONS_ATTRIBUTE, persons); return DepartmentConstants.DEPARTMENT_FORM_JSP; } @PreAuthorize(SecurityRules.IS_OFFICE) @RequestMapping(value = "/department/{departmentId}", method = RequestMethod.POST) public String updateDepartment(@PathVariable("departmentId") Integer departmentId, @ModelAttribute(DepartmentConstants.DEPARTMENT_ATTRIBUTE) Department department, Errors errors, Model model, RedirectAttributes redirectAttributes) throws UnknownDepartmentException { // Check if department exists departmentService.getDepartmentById(departmentId).orElseThrow(() -> new UnknownDepartmentException(departmentId)); validator.validate(department, errors); if (errors.hasGlobalErrors()) { model.addAttribute(ControllerConstants.ERRORS_ATTRIBUTE, errors); } if (errors.hasErrors()) { List<Person> persons = getPersons(); model.addAttribute(DepartmentConstants.DEPARTMENT_ATTRIBUTE, department); model.addAttribute(PersonConstants.PERSONS_ATTRIBUTE, persons); return DepartmentConstants.DEPARTMENT_FORM_JSP; } departmentService.update(department); redirectAttributes.addFlashAttribute("updatedDepartment", department); return "redirect:/web/department/"; } @PreAuthorize(SecurityRules.IS_OFFICE) @RequestMapping(value = "/department/{departmentId}", method = RequestMethod.DELETE) public String deleteDepartment(@PathVariable("departmentId") Integer departmentId, RedirectAttributes redirectAttributes) { Optional<Department> department = departmentService.getDepartmentById(departmentId); departmentService.delete(departmentId); if (department.isPresent()) { redirectAttributes.addFlashAttribute("deletedDepartment", department.get()); } return "redirect:/web/department/"; } }