diff --git a/src/main/java/site/easystartup/web/project/controller/ProjectController.java b/src/main/java/site/easystartup/web/project/controller/ProjectController.java index 3512180..5a1d184 100644 --- a/src/main/java/site/easystartup/web/project/controller/ProjectController.java +++ b/src/main/java/site/easystartup/web/project/controller/ProjectController.java @@ -41,7 +41,7 @@ public class ProjectController { } @PatchMapping("/{projectId}/update") - public ModelAndView updateProject(@ModelAttribute("projectUpdate") ProjectDto projectDto, + public ModelAndView updateProject(@ModelAttribute("projectUpdate") ProjectRequest projectRequest, @PathVariable("projectId") Long projectId, BindingResult bindingResult, Principal principal) { @@ -53,7 +53,7 @@ public class ProjectController { } Project projectUpdated = projectService - .updateProject(modelMapper.map(projectDto, Project.class), projectId, principal); + .updateProject(projectRequest, projectId, principal); modelAndView.addObject(projectUpdated); modelAndView.setViewName("project"); return modelAndView; @@ -117,25 +117,27 @@ public class ProjectController { return modelAndView; } - @PostMapping("/{projectId}/applay") + @PostMapping("/{projectId}/{nameOfPosition}/applay") public ModelAndView applayOnProject(@PathVariable("projectId") Long projectId, + @PathVariable("nameOfPosition") String nameOfPosition, Principal principal) { ModelAndView modelAndView = new ModelAndView(); - modelAndView.addObject("message", projectService.applayOnProject(projectId, principal)); + modelAndView.addObject("message", projectService.applayOnProject(projectId, nameOfPosition, principal)); modelAndView.addObject("project", modelMapper.map(projectService.getProjectById(projectId), ProjectDto.class)); modelAndView.setViewName("project"); return modelAndView; } - @PostMapping("/{projectId}/{participantId}") + @PostMapping("/{projectId}/{participantId}/{nameOfPosition}") public ModelAndView confirmParticipant(@PathVariable("projectId") Long projectId, @PathVariable("participantId") Long participantId, + @PathVariable("nameOfPosition") String nameOfPosition, Principal principal) { ModelAndView modelAndView = new ModelAndView(); - modelAndView.addObject("message", projectService.confirmParticipant(projectId, participantId, principal)); + modelAndView.addObject("message", projectService.confirmParticipant(projectId, nameOfPosition, participantId, principal)); modelAndView.addObject("project", projectService.getProjectById(projectId)); modelAndView.setViewName("project"); diff --git a/src/main/java/site/easystartup/web/project/domain/exeption/ProjectNotFoundException.java b/src/main/java/site/easystartup/web/project/domain/exeption/ProjectNotFoundException.java new file mode 100644 index 0000000..0a090f9 --- /dev/null +++ b/src/main/java/site/easystartup/web/project/domain/exeption/ProjectNotFoundException.java @@ -0,0 +1,11 @@ +package site.easystartup.web.project.domain.exeption; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.BAD_REQUEST) +public class ProjectNotFoundException extends RuntimeException{ + public ProjectNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java b/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java new file mode 100644 index 0000000..7a3f563 --- /dev/null +++ b/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java @@ -0,0 +1,16 @@ +package site.easystartup.web.project.repo; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import site.easystartup.web.project.domain.model.Participant; +import site.easystartup.web.project.domain.model.Project; + +import java.util.LinkedHashSet; + +@Repository +public interface ParticipantRepo extends JpaRepository { + @Query ("SELECT Project FROM Participant WHERE nameOfPosition = :nameOfPosition") + LinkedHashSet findAllByNameOfPosition(@Param("nameOfPosition") String nameOfPosition); +} diff --git a/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java b/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java index da92bfa..0757587 100644 --- a/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java +++ b/src/main/java/site/easystartup/web/project/repo/ProjectRepo.java @@ -1,9 +1,21 @@ package site.easystartup.web.project.repo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import site.easystartup.web.domain.User; import site.easystartup.web.project.domain.model.Project; +import java.util.List; +import java.util.Set; + @Repository public interface ProjectRepo extends JpaRepository { + + List findAllByOwner(User owner); + + @Query(value = "SELECT p from Project p WHERE p.technology LIKE %:technology%") + List findAllByTechnology(@Param("technology") String tech); + } diff --git a/src/main/java/site/easystartup/web/project/service/ProjectService.java b/src/main/java/site/easystartup/web/project/service/ProjectService.java index 38456d1..90eaa7e 100644 --- a/src/main/java/site/easystartup/web/project/service/ProjectService.java +++ b/src/main/java/site/easystartup/web/project/service/ProjectService.java @@ -3,16 +3,20 @@ package site.easystartup.web.project.service; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; +import site.easystartup.web.domain.User; +import site.easystartup.web.project.domain.exeption.ProjectNotFoundException; import site.easystartup.web.project.domain.model.Participant; import site.easystartup.web.project.domain.model.Project; import site.easystartup.web.project.domain.payload.requst.ProjectRequest; +import site.easystartup.web.project.repo.ParticipantRepo; import site.easystartup.web.project.repo.ProjectRepo; import site.easystartup.web.service.UserService; import site.easystartup.web.storage.service.StorageService; import java.security.Principal; import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -23,42 +27,77 @@ public class ProjectService { private final UserService userService; private final ModelMapper modelMapper; private final StorageService storageService; + private final ParticipantRepo participantRepo; public Project createProject(ProjectRequest projectRequest, Principal principal) { - Project project = projectRequestToProject(projectRequest); - - project.setOwner(userService.getUserByPrincipal(principal)); - return project; + Project project = projectRequestToProject(projectRequest, principal); + return projectRepo.save(project); } - public Project updateProject(Project projectUpdate, Long projectId, Principal principal) { + public Project updateProject(ProjectRequest projectRequest, Long projectId, Principal principal) { + if (!projectIsBelongUser(getProjectById(projectId), principal)) + throw new RuntimeException("This project cannot be changed"); + + Project project = projectRequestToProject(projectRequest, principal); + project.setProjectId(projectId); + + return projectRepo.save(project); } public void deleteProject(Long projectId, Principal principal) { + Project project = getProjectById(projectId); + if (!projectIsBelongUser(project, principal)) + throw new RuntimeException("This project cannot be deleted"); + + projectRepo.delete(project); } public Project getProjectById(Long projectId) { + return projectRepo.findById(projectId).orElseThrow(() -> new ProjectNotFoundException("Project not found")); } - public Set getAllProjectsForUser(Long userId) { - - + public List getAllProjectsForUser(Long userId) { + User user = userService.getUserById(userId); + return projectRepo.findAllByOwner(user); } - public Set getAllProjectsWithTechnology(String technology) { + public List getAllProjectsWithTechnology(String technology) { + return projectRepo.findAllByTechnology(technology.trim()); } - public Set getAllProjectsForCurrentUser(Principal principal) { + public List getAllProjectsForCurrentUser(Principal principal) { + return projectRepo.findAllByOwner(userService.getUserByPrincipal(principal)); } - public Set getAllProjectsWithPosition(String nameOfPosition) { + public LinkedHashSet getAllProjectsWithPosition(String nameOfPosition) { + return participantRepo.findAllByNameOfPosition(nameOfPosition.trim()); } - public Object applayOnProject(Long projectId, Principal principal) { + public Project applayOnProject(Long projectId, String nameOfPosition, Principal principal) { + Project project = getProjectById(projectId); + project.getParticipants().stream().forEach(participant -> { + if (participant.getNameOfPosition().equals(nameOfPosition)) + participant.getRequests().add(userService.getUserByPrincipal(principal)); + }); + + return projectRepo.save(project); } - public Object confirmParticipant(Long projectId, Long participantId, Principal principal) { + public Object confirmParticipant(Long projectId, String nameOfPosition, Long participantId, Principal principal) { + Project project = getProjectById(projectId); + + if (!projectIsBelongUser(project, principal)) + throw new RuntimeException("This project cannot be changed"); + + User user = userService.getUserById(participantId); + project.getParticipants().forEach(participant -> { + if (participant.getNameOfPosition().equals(nameOfPosition)) { + participant.setUser(user); + participant.getRequests().remove(user); + } + }); + return projectRepo.save(project); } @@ -68,7 +107,7 @@ public class ProjectService { return result.toString(); } - private Project projectRequestToProject(ProjectRequest projectRequest) { + private Project projectRequestToProject(ProjectRequest projectRequest, Principal principal) { Project project = new Project(); project.setParticipants(projectRequest.getParticipants() @@ -78,8 +117,13 @@ public class ProjectService { project.setTechnology(formatTechnology(projectRequest.getTechnology())); project.setCommercialStatus(project.getCommercialStatus()); project.setCoverLink(projectRequest.getCover().getName()); + project.setOwner(userService.getUserByPrincipal(principal)); storageService.save(projectRequest.getCover()); return project; } + + private boolean projectIsBelongUser(Project project, Principal principal) { + return project.getOwner().equals(userService.getUserByPrincipal(principal)); + } } diff --git a/src/main/java/site/easystartup/web/service/UserService.java b/src/main/java/site/easystartup/web/service/UserService.java index 4bc139c..92513c6 100644 --- a/src/main/java/site/easystartup/web/service/UserService.java +++ b/src/main/java/site/easystartup/web/service/UserService.java @@ -2,6 +2,7 @@ package site.easystartup.web.service; import lombok.RequiredArgsConstructor; import org.hibernate.query.criteria.internal.predicate.PredicateImplementor; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import site.easystartup.web.domain.User; import site.easystartup.web.repo.UserRepo; @@ -16,4 +17,8 @@ public class UserService { public User getUserByPrincipal(Principal principal) { return userRepo.findByUsername(principal.getName()); } + + public User getUserById(Long userId) { + return userRepo.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User not found")); + } }