From 202ba23b7631dd0daf0ec63e6f11771aafdf54e3 Mon Sep 17 00:00:00 2001 From: Viktoria Date: Wed, 31 Aug 2022 16:35:51 +0200 Subject: [PATCH] security --- .../easystartup/web/domain/model/User.java | 4 +- .../project/controller/ProjectController.java | 33 ++++++++++---- .../web/project/domain/model/Participant.java | 28 ++++++------ .../web/project/domain/model/Project.java | 30 ++++++------- .../project/domain/requst/ProjectRequest.java | 5 ++- .../web/project/dto/ParticipantDto.java | 11 ++--- .../web/project/dto/ProjectDto.java | 18 ++++---- .../web/project/repo/ParticipantRepo.java | 6 ++- .../project/service/ParticipantService.java | 43 +++++++++++++++++++ .../web/project/service/ProjectService.java | 36 +++++++++++----- src/main/resources/application.properties | 2 +- 11 files changed, 146 insertions(+), 70 deletions(-) create mode 100644 src/main/java/site/easystartup/web/project/service/ParticipantService.java diff --git a/src/main/java/site/easystartup/web/domain/model/User.java b/src/main/java/site/easystartup/web/domain/model/User.java index 429bc4f..9db34c4 100644 --- a/src/main/java/site/easystartup/web/domain/model/User.java +++ b/src/main/java/site/easystartup/web/domain/model/User.java @@ -10,9 +10,7 @@ import site.easystartup.web.project.domain.model.Participant; import javax.persistence.*; import java.util.*; -@Getter -@Setter -@ToString +@Data @RequiredArgsConstructor @Entity @Table(name = "usr") 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 13a3b43..7db124f 100644 --- a/src/main/java/site/easystartup/web/project/controller/ProjectController.java +++ b/src/main/java/site/easystartup/web/project/controller/ProjectController.java @@ -13,6 +13,7 @@ import site.easystartup.web.domain.response.MessageResponse; import site.easystartup.web.domain.validation.ResponseErrorValidation; import site.easystartup.web.project.dto.ParticipantDto; import site.easystartup.web.project.dto.ProjectDto; +import site.easystartup.web.project.service.ParticipantService; import site.easystartup.web.project.service.ProjectService; import javax.validation.Valid; @@ -22,13 +23,15 @@ import java.util.stream.Collectors; @RestController @RequiredArgsConstructor -@RequestMapping("/project") +@RequestMapping("/api/project") public class ProjectController { private final ProjectService projectService; private final ResponseErrorValidation responseErrorValidation; private final ModelMapper modelMapper; - @PostMapping("/") + private final ParticipantService participantService; + + @PostMapping public ResponseEntity createProject(@Valid @RequestBody ProjectRequest projectRequest, BindingResult bindingResult, Principal principal) { @@ -51,6 +54,20 @@ public class ProjectController { return ResponseEntity.ok().body(modelMapper.map(projectUpdated, ProjectDto.class)); } + @PutMapping("/{projectId}/{partId}/part") + public ResponseEntity editPart(@Valid @RequestBody ParticipantDto participantDto, + @PathVariable("projectId") Long projectId, + @PathVariable("partId") Long partId, + BindingResult bindingResult, + Principal principal) { + ResponseEntity errors = responseErrorValidation.mapValidationService(bindingResult); + if (!ObjectUtils.isEmpty(errors)) return errors; + + Project projectUpdated = participantService.edit(participantDto, partId, projectId, principal); + return ResponseEntity.ok().body(modelMapper.map(projectUpdated, ProjectDto.class)); + } + + @DeleteMapping("/{projectId}") public ResponseEntity deleteProject(@PathVariable("projectId") Long projectId, Principal principal) { @@ -64,14 +81,14 @@ public class ProjectController { } // - @GetMapping("/{userId}") + @GetMapping("/{userId}/all") 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}") + @GetMapping("/{technology}/tech") public ResponseEntity> getAllProjectsWithTechnology(@PathVariable("technology") String technology) { List projects = projectService.getAllProjectsWithTechnology(technology) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); @@ -86,15 +103,15 @@ public class ProjectController { } - @GetMapping("/positions") - public ResponseEntity> getAllProjectsWithPosition(@RequestBody String nameOfPosition) { + @GetMapping("/{nameOfPosition}/positions") + public ResponseEntity> getAllProjectsWithPosition(@PathVariable("nameOfPosition") 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) { + @GetMapping("/{commercialStatus}/commercial_status") + public ResponseEntity> getAllProjectsWithCommercialStatus(@PathVariable("commercialStatus") int commercialStatus) { List projects = projectService.getAllProjectsWithCommercialStatus(commercialStatus) .stream().map(project -> modelMapper.map(project, ProjectDto.class)).collect(Collectors.toList()); return ResponseEntity.ok().body(projects); diff --git a/src/main/java/site/easystartup/web/project/domain/model/Participant.java b/src/main/java/site/easystartup/web/project/domain/model/Participant.java index 59d58ba..7169d71 100644 --- a/src/main/java/site/easystartup/web/project/domain/model/Participant.java +++ b/src/main/java/site/easystartup/web/project/domain/model/Participant.java @@ -5,12 +5,11 @@ import org.hibernate.Hibernate; import site.easystartup.web.domain.model.User; import javax.persistence.*; +import javax.validation.constraints.NotNull; import java.util.List; import java.util.Objects; -@Getter -@Setter -@ToString +@Data @RequiredArgsConstructor @Entity @Table(name = "participant") @@ -25,6 +24,7 @@ public class Participant { private Project project; @Column(name = "name_of_position") + @NotNull private String nameOfPosition; @ManyToOne @JoinColumn(name = "user_id") @@ -37,16 +37,16 @@ public class Participant { @ToString.Exclude private List requests; - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; - Participant that = (Participant) o; - return participantId != null && Objects.equals(participantId, that.participantId); - } +// @Override +// public boolean equals(Object o) { +// if (this == o) return true; +// if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; +// Participant that = (Participant) o; +// return participantId != null && Objects.equals(participantId, that.participantId); +// } - @Override - public int hashCode() { - return getClass().hashCode(); - } +// @Override +// public int hashCode() { +// return getClass().hashCode(); +// } } diff --git a/src/main/java/site/easystartup/web/project/domain/model/Project.java b/src/main/java/site/easystartup/web/project/domain/model/Project.java index 348aad8..dbdf96f 100644 --- a/src/main/java/site/easystartup/web/project/domain/model/Project.java +++ b/src/main/java/site/easystartup/web/project/domain/model/Project.java @@ -12,9 +12,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Objects; -@Getter -@Setter -@ToString +@Data @RequiredArgsConstructor @Entity @Table(name = "project") @@ -53,7 +51,7 @@ public class Project { private User owner; @OneToMany(mappedBy = "project", cascade = {CascadeType.ALL}) - @ToString.Exclude +// @ToString.Exclude private List participants; @Column(name = "created_date", updatable = false) @@ -65,16 +63,16 @@ public class Project { this.createdDate = LocalDateTime.now(); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; - Project project = (Project) o; - return projectId != null && Objects.equals(projectId, project.projectId); - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } +// @Override +// public boolean equals(Object o) { +// if (this == o) return true; +// if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; +// Project project = (Project) o; +// return projectId != null && Objects.equals(projectId, project.projectId); +// } +// +// @Override +// public int hashCode() { +// return getClass().hashCode(); +// } } diff --git a/src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java b/src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java index 6c2d826..41b8a97 100644 --- a/src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java +++ b/src/main/java/site/easystartup/web/project/domain/requst/ProjectRequest.java @@ -1,6 +1,7 @@ package site.easystartup.web.project.domain.requst; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import org.springframework.web.multipart.MultipartFile; import site.easystartup.web.project.domain.model.Tag; @@ -11,10 +12,10 @@ import javax.validation.constraints.Size; import java.util.List; @Data -@RequiredArgsConstructor +@NoArgsConstructor public class ProjectRequest { - private MultipartFile cover; + // private MultipartFile cover; @Size(min = 3, max = 100, message = "Title should be no less 3 and no more 100 signs") @NotNull diff --git a/src/main/java/site/easystartup/web/project/dto/ParticipantDto.java b/src/main/java/site/easystartup/web/project/dto/ParticipantDto.java index 12b5759..d19f3e2 100644 --- a/src/main/java/site/easystartup/web/project/dto/ParticipantDto.java +++ b/src/main/java/site/easystartup/web/project/dto/ParticipantDto.java @@ -1,17 +1,18 @@ package site.easystartup.web.project.dto; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Set; @Data +@NoArgsConstructor public class ParticipantDto implements Serializable { - private final Long participantId; + private Long participantId; @NotNull - private final String technology; - private final String nameOfPosition; - private final UserDto user; - private final Set requests; + private String nameOfPosition; + private UserDto user; + private Set requests; } diff --git a/src/main/java/site/easystartup/web/project/dto/ProjectDto.java b/src/main/java/site/easystartup/web/project/dto/ProjectDto.java index e20c6b1..643f992 100644 --- a/src/main/java/site/easystartup/web/project/dto/ProjectDto.java +++ b/src/main/java/site/easystartup/web/project/dto/ProjectDto.java @@ -1,6 +1,7 @@ package site.easystartup.web.project.dto; import lombok.Data; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @@ -9,18 +10,19 @@ import java.time.LocalDateTime; import java.util.List; @Data +@NoArgsConstructor public class ProjectDto implements Serializable { - private final Long projectId; - private final String coverLink; + private Long projectId; + private String coverLink; @Size(min = 3, max = 100, message = "Title should be no less 3 and no more 100 signs") @NotNull - private final String title; + private String title; @Size(min = 50, message = "Description should be no less 50 signs") @NotNull - private final String description; - private final int commercialStatus; + private String description; + private int commercialStatus; @NotNull - private final String technology; - private final List participants; - private final LocalDateTime createdDate; + private String technology; + private List participants; + private LocalDateTime createdDate; } diff --git a/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java b/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java index 710721e..6ed830a 100644 --- a/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java +++ b/src/main/java/site/easystartup/web/project/repo/ParticipantRepo.java @@ -8,9 +8,11 @@ import site.easystartup.web.project.domain.model.Participant; import site.easystartup.web.project.domain.model.Project; import java.util.LinkedHashSet; +import java.util.List; @Repository public interface ParticipantRepo extends JpaRepository { - @Query ("SELECT p FROM Participant p WHERE p.nameOfPosition = :nameOfPosition") - LinkedHashSet findAllByNameOfPosition(@Param("nameOfPosition") String name); + + List findAllByNameOfPositionIgnoreCase(String name); + } diff --git a/src/main/java/site/easystartup/web/project/service/ParticipantService.java b/src/main/java/site/easystartup/web/project/service/ParticipantService.java new file mode 100644 index 0000000..0353a75 --- /dev/null +++ b/src/main/java/site/easystartup/web/project/service/ParticipantService.java @@ -0,0 +1,43 @@ +package site.easystartup.web.project.service; + +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Service; +import site.easystartup.web.project.domain.model.Participant; +import site.easystartup.web.project.domain.model.Project; +import site.easystartup.web.project.domain.requst.ProjectRequest; +import site.easystartup.web.project.dto.ParticipantDto; +import site.easystartup.web.project.repo.ParticipantRepo; + +import java.security.Principal; + +@Service +@RequiredArgsConstructor +public class ParticipantService { + private final ParticipantRepo participantRepo; + private final ModelMapper modelMapper; + private final ProjectService projectService; + + public Project edit(ParticipantDto participantDto, + Long partId, + Long projectId, + Principal principal) { + Project project = projectService.getProjectById(projectId); + if (!projectService.projectIsBelongUser(project, principal)) + throw new RuntimeException("This project cannot be changed"); + Participant participantOld = participantRepo.findById(partId).orElseThrow(() -> new RuntimeException()); + if (!partIsBelongProject(project, participantOld)) + throw new RuntimeException("This participant cannot be changed"); + + Participant participant = modelMapper.map(participantDto, Participant.class); + participant.setParticipantId(partId); + participantRepo.save(participant); + return projectService.getProjectById(projectId); + } + + private boolean partIsBelongProject(Project project, Participant participant) { + return project.equals(participant.getProject()); + } + + +} 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 64b9619..d0978e2 100644 --- a/src/main/java/site/easystartup/web/project/service/ProjectService.java +++ b/src/main/java/site/easystartup/web/project/service/ProjectService.java @@ -14,8 +14,7 @@ import site.easystartup.web.service.UserService; import site.easystartup.web.storage.service.StorageService; import java.security.Principal; -import java.util.LinkedHashSet; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Service @@ -29,21 +28,36 @@ public class ProjectService { private final TagService tagService; + public Project createProject(ProjectRequest projectRequest, Principal principal) { - Project project = projectRequestToProject(projectRequest, principal); + Project project = projectRepo.save(projectRequestToProject(projectRequest, principal)); + project.setParticipants(getParticipantForProject(projectRequest, project)); return projectRepo.save(project); } public Project editProject(ProjectRequest projectRequest, Long projectId, Principal principal) { - if (!projectIsBelongUser(getProjectById(projectId), principal)) + Project projectOld = getProjectById(projectId); + if (!projectIsBelongUser(projectOld, principal)) throw new RuntimeException("This project cannot be changed"); Project project = projectRequestToProject(projectRequest, principal); + project.setParticipants(projectOld.getParticipants()); project.setProjectId(projectId); return projectRepo.save(project); } + private List getParticipantForProject(ProjectRequest projectRequest, Project project) { + List part = new ArrayList<>(); + projectRequest.getParticipants().forEach(participantDto -> { + Participant participant = new Participant(); + participant.setProject(project); + participant.setNameOfPosition(participantDto.getNameOfPosition()); + part.add(participant); + }); + return part; + } + public void deleteProject(Long projectId, Principal principal) { Project project = getProjectById(projectId); if (!projectIsBelongUser(project, principal)) @@ -74,7 +88,11 @@ public class ProjectService { } public LinkedHashSet getAllProjectsWithPosition(String nameOfPosition) { - return participantRepo.findAllByNameOfPosition(nameOfPosition.trim()); + List parts = participantRepo.findAllByNameOfPositionIgnoreCase(nameOfPosition.trim()); + LinkedHashSet projects = new LinkedHashSet<>(); + parts.forEach(part -> projects.add(part.getProject())); + + return projects; } public Project applyOnProject(Long projectId, String nameOfPosition, Principal principal) { @@ -112,20 +130,16 @@ public class ProjectService { private Project projectRequestToProject(ProjectRequest projectRequest, Principal principal) { Project project = new Project(); - project.setParticipants(projectRequest.getParticipants() - .stream().map(part -> modelMapper.map(part, Participant.class)).collect(Collectors.toList())); project.setTitle(projectRequest.getTitle()); project.setDescription(projectRequest.getDescription()); project.setTechnology(tagService.convertTechnology(projectRequest.getTechnology())); project.setCommercialStatus(project.getCommercialStatus()); - project.setCoverLink(projectRequest.getCover().getName()); +// project.setCoverLink(projectRequest.getCover().getName()); project.setOwner(userService.getUserByPrincipal(principal)); - storageService.save(projectRequest.getCover()); - return project; } - private boolean projectIsBelongUser(Project project, Principal principal) { + public boolean projectIsBelongUser(Project project, Principal principal) { return project.getOwner().equals(userService.getUserByPrincipal(principal)); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b6e4ffc..1d36ab8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ server.port=80 -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=update spring.sql.init.mode=always