package ru.ulstu.project.controller; import io.swagger.v3.oas.annotations.Hidden; import jakarta.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import ru.ulstu.deadline.model.Deadline; import ru.ulstu.grant.model.GrantDto; import ru.ulstu.project.model.Project; import ru.ulstu.project.model.ProjectDto; import ru.ulstu.project.service.ProjectService; import ru.ulstu.user.model.User; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; import static org.springframework.util.StringUtils.isEmpty; @Controller() @RequestMapping(value = "/projects") @Hidden public class ProjectController { private final ProjectService projectService; public ProjectController(ProjectService projectService) { this.projectService = projectService; } @GetMapping("/dashboard") public void getDashboard(ModelMap modelMap) { modelMap.put("projects", projectService.findAllDto()); } @GetMapping("/projects") public void getProjects(ModelMap modelMap) { modelMap.put("projects", projectService.findAllDto()); } @GetMapping("/project") public void getProject(ModelMap modelMap, @RequestParam(value = "id") Integer id) { if (id != null && id > 0) { ProjectDto projectDto = projectService.findOneDto(id); attachGrant(projectDto); modelMap.put("projectDto", projectService.findOneDto(id)); } else { modelMap.put("projectDto", new ProjectDto()); } } @ModelAttribute("allStatuses") public List getProjectStatuses() { return projectService.getProjectStatuses(); } @PostMapping(value = "/project", params = "save") public String save(@Valid ProjectDto projectDto, Errors errors) throws IOException { filterEmptyDeadlines(projectDto); if (projectDto.getDeadlines().isEmpty()) { errors.rejectValue("deadlines", "errorCode", "Не может быть пустым"); } if (errors.hasErrors()) { return "/projects/project"; } projectService.save(projectDto); return String.format("redirect:%s", "/projects/projects"); } @PostMapping(value = "/project", params = "attachGrant") public String attachGrant(ProjectDto projectDto) { projectService.attachGrant(projectDto); return "/projects/project"; } @PostMapping(value = "/project", params = "addDeadline") public String addDeadline(@Valid ProjectDto projectDto, Errors errors) { filterEmptyDeadlines(projectDto); if (errors.hasErrors()) { return "/projects/project"; } projectDto.getDeadlines().add(new Deadline()); return "/projects/project"; } @PostMapping(value = "/project", params = "removeDeadline") public String removeDeadline(ProjectDto projectDto, @RequestParam(value = "removeDeadline") Integer deadlineId) { projectService.removeDeadline(projectDto, deadlineId); return "/projects/project"; } @GetMapping("/delete/{project-id}") public String delete(@PathVariable("project-id") Integer projectId) throws IOException { projectService.delete(projectId); return String.format("redirect:%s", "/projects/projects"); } @ModelAttribute("allExecutors") public List getAllExecutors(ProjectDto projectDto) { return projectService.getProjectExecutors(projectDto); } @ModelAttribute("allGrants") public List getAllGrants() { return projectService.getAllGrants(); } private void filterEmptyDeadlines(ProjectDto projectDto) { projectDto.setDeadlines(projectDto.getDeadlines().stream() .filter(dto -> dto.getDate() != null || !isEmpty(dto.getDescription())) .collect(Collectors.toList())); } @ResponseBody @PostMapping(value = "/ping") public void ping(@RequestParam("projectId") int projectId) throws IOException { projectService.ping(projectId); } }