package site.easystartup.web.project.controller; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.http.ResponseEntity; import org.springframework.util.ObjectUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import site.easystartup.web.project.domain.model.Project; import site.easystartup.web.project.domain.payload.requst.ParticipantRequest; import site.easystartup.web.project.domain.payload.requst.ProjectRequest; import site.easystartup.web.project.domain.payload.response.ResponseMessage; import site.easystartup.web.project.domain.validation.ResponseErrorValidation; import site.easystartup.web.project.dto.ParticipantDto; import site.easystartup.web.project.dto.ProjectDto; import site.easystartup.web.project.service.ProjectService; import javax.validation.Valid; import java.security.Principal; import java.util.List; import java.util.stream.Collectors; @RestController @RequiredArgsConstructor @RequestMapping("/project") public class ProjectController { private final ProjectService projectService; private final ResponseErrorValidation responseErrorValidation; private final ModelMapper modelMapper; @PostMapping("/") public ResponseEntity createProject(@Valid @RequestBody ProjectRequest projectRequest, BindingResult bindingResult, Principal principal) { ResponseEntity errors = responseErrorValidation.mapValidationService(bindingResult); if (!ObjectUtils.isEmpty(errors)) return errors; Project project = projectService.createProject(projectRequest, principal); return ResponseEntity.ok().body(modelMapper.map(project, ProjectDto.class)); } @PatchMapping("/{projectId}") public ResponseEntity editProject(@Valid @RequestBody ProjectRequest projectRequest, @PathVariable("projectId") Long projectId, BindingResult bindingResult, Principal principal) { ResponseEntity errors = responseErrorValidation.mapValidationService(bindingResult); if (!ObjectUtils.isEmpty(errors)) return errors; Project projectUpdated = projectService.editProject(projectRequest, projectId, principal); return ResponseEntity.ok().body(modelMapper.map(projectUpdated, ProjectDto.class)); } @DeleteMapping("/{projectId}") public ResponseEntity deleteProject(@PathVariable("projectId") Long projectId, Principal principal) { projectService.deleteProject(projectId, principal); return ResponseEntity.ok(new ResponseMessage("Project was deleted!")); } @GetMapping("/{projectId}") public ResponseEntity getProject(@PathVariable("projectId") Long projectId) { return ResponseEntity.ok().body(modelMapper.map(projectService.getProjectById(projectId), ProjectDto.class)); } // @GetMapping("/{userId}") public ResponseEntity> getAllProjectsForUser(@PathVariable("userId") Long userId) { List projects = projectService.getAllProjectsForUser(userId) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(projects); } @GetMapping("/{technology}") public ResponseEntity> getAllProjectsWithTechnology(@PathVariable("technology") String technology) { List projects = projectService.getAllProjectsWithTechnology(technology) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(projects); } @GetMapping("/my") public ResponseEntity> getAllProjectsForCurrentUser(Principal principal) { List projects = projectService.getAllProjectsForCurrentUser(principal) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(projects); } @GetMapping("/positions") public ResponseEntity> getAllProjectsWithPosition(@RequestBody String nameOfPosition) { List projects = projectService.getAllProjectsWithPosition(nameOfPosition) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(projects); } @GetMapping("/commercial_status") public ResponseEntity> getAllProjectsWithCommercialStatus(@RequestBody int commercialStatus) { List projects = projectService.getAllProjectsWithCommercialStatus(commercialStatus) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(projects); } @GetMapping("/requests") public ResponseEntity> getAllRequestsForProject(@RequestBody Long projectId) { List requests = projectService.getAllRequestsForProject(projectId) .stream().map(project -> modelMapper.map(project, ParticipantDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(requests); } @PostMapping("/apply") public ResponseEntity applyOnProject(@RequestBody ParticipantRequest participantRequest, Principal principal) { Project project = projectService .applyOnProject(participantRequest.getProjectId(), participantRequest.getNameOfPosition(), principal); return ResponseEntity.ok().body(modelMapper.map(project, ProjectDto.class)); } @PostMapping("/participant") public ResponseEntity confirmParticipant(@RequestBody ParticipantRequest participantRequest, Principal principal) { Project project = projectService.confirmParticipant(participantRequest.getProjectId(), participantRequest.getNameOfPosition(), participantRequest.getParticipantId(), principal); return ResponseEntity.ok().body(modelMapper.map(project, ProjectDto.class)); } }