diff --git a/src/main/java/com/mtvs/devlinkbackend/oauth2/entity/UserPartner.java b/src/main/java/com/mtvs/devlinkbackend/oauth2/entity/UserPartner.java index 4e9c4a4..adb7e0e 100644 --- a/src/main/java/com/mtvs/devlinkbackend/oauth2/entity/UserPartner.java +++ b/src/main/java/com/mtvs/devlinkbackend/oauth2/entity/UserPartner.java @@ -3,6 +3,7 @@ import com.mtvs.devlinkbackend.util.StringListConverter; import jakarta.persistence.*; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.List; @@ -12,6 +13,7 @@ @Entity(name = "UserPartner") @DiscriminatorValue("UserPartner") // purpose 값으로 지정 @Getter @Setter +@NoArgsConstructor public class UserPartner extends User { @Column(name = "NICKNAME") private String nickname; @@ -33,7 +35,7 @@ public class UserPartner extends User { private String experience; @ElementCollection - @CollectionTable(name = "SKILL", joinColumns = @JoinColumn(name = "SKILL_ID")) + @CollectionTable(name = "SKILL", joinColumns = @JoinColumn(name = "USER_ID")) @MapKeyColumn(name = "SKILL_NAME") @Column(name = "SKILL_PROFICIENCY") private Map skillSet; diff --git a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java index af28f9f..370be69 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/controller/ProjectController.java @@ -1,5 +1,6 @@ package com.mtvs.devlinkbackend.project.controller; +import com.mtvs.devlinkbackend.project.dto.ProjectVectorRegistRequestDTO; import com.mtvs.devlinkbackend.util.JwtUtil; import com.mtvs.devlinkbackend.project.dto.ProjectRegistRequestDTO; import com.mtvs.devlinkbackend.project.dto.ProjectUpdateRequestDTO; @@ -14,6 +15,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Map; @RestController @RequestMapping("/api/project") @@ -142,6 +144,19 @@ public ResponseEntity> getProjectsByTitleContainingIgnoreCase( return ResponseEntity.ok(projects); } + @Operation(summary = "PK로 프로젝트 의뢰의 Vector 정보 조회", description = "PK에 맞는 프로젝트가 가진 Vector 정보를 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Vector 정보가 성공적으로 조회됨") + }) + @GetMapping("/{projectId}/vector") + public ResponseEntity> getProjectVectorByProjectId( + @PathVariable(name = "projectId") Long projectId) { + + Map foundProjectVector = projectService.findProjectVectorByProjectId(projectId); + return ResponseEntity.ok(foundProjectVector); + } + + @Operation(summary = "프로젝트 의뢰 업데이트", description = "기존 프로젝트 의뢰를 업데이트합니다.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "프로젝트 의뢰가 성공적으로 업데이트됨"), @@ -161,6 +176,23 @@ public ResponseEntity updateProject( } } + @Operation(summary = "프로젝트 의뢰 업데이트", description = "기존 프로젝트 의뢰를 업데이트합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "프로젝트 의뢰가 성공적으로 업데이트됨"), + @ApiResponse(responseCode = "400", description = "잘못된 파라미터 또는 권한 없음") + }) + @PatchMapping("/vector") + public ResponseEntity updateProject( + @RequestBody ProjectVectorRegistRequestDTO projectVectorRegistRequestDTO) { + + try { + Project updatedProject = projectService.updateProjectVector(projectVectorRegistRequestDTO); + return ResponseEntity.ok(updatedProject); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); + } + } + @Operation(summary = "프로젝트 의뢰 삭제", description = "ID로 특정 프로젝트 의뢰를 삭제합니다.") @ApiResponses({ @ApiResponse(responseCode = "204", description = "프로젝트 의뢰가 성공적으로 삭제됨"), diff --git a/src/main/java/com/mtvs/devlinkbackend/project/dto/ProjectVectorRegistRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/project/dto/ProjectVectorRegistRequestDTO.java new file mode 100644 index 0000000..219803f --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/project/dto/ProjectVectorRegistRequestDTO.java @@ -0,0 +1,20 @@ +package com.mtvs.devlinkbackend.project.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.util.Map; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ProjectVectorRegistRequestDTO { + private Long projectId; + @Schema( + description = "프로젝트 벡터 정보. Key는 축 이름(X, Y, Z)이고, Value는 해당 축의 값입니다.", + example = "{\"x\": 1, \"y\": 2, \"z\": 3}" + ) + private Map projectVector; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java b/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java index 8992a91..3ec38cf 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/entity/Project.java @@ -12,6 +12,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Table(name = "PROJECT") @Entity(name = "Project") @@ -77,6 +78,12 @@ public class Project { @Column(name = "MODIFIED_AT") private LocalDateTime modifiedAt; + @ElementCollection + @CollectionTable(name = "PROJECT_VECTOR", joinColumns = @JoinColumn(name = "PROJECT_ID")) + @MapKeyColumn(name = "AXIS") + @Column(name = "VALUE") + private Map projectVector; + @OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true) @JsonManagedReference private List comments = new ArrayList<>(); @@ -158,4 +165,8 @@ public void setStartDateTime(LocalDateTime startDateTime) { public void setEndDateTime(LocalDateTime endDateTime) { this.endDateTime = endDateTime; } + + public void setProjectVector(Map projectVector) { + this.projectVector = projectVector; + } } diff --git a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java index 15151e0..39325ef 100644 --- a/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java +++ b/src/main/java/com/mtvs/devlinkbackend/project/service/ProjectService.java @@ -2,13 +2,16 @@ import com.mtvs.devlinkbackend.project.dto.ProjectRegistRequestDTO; import com.mtvs.devlinkbackend.project.dto.ProjectUpdateRequestDTO; +import com.mtvs.devlinkbackend.project.dto.ProjectVectorRegistRequestDTO; import com.mtvs.devlinkbackend.project.entity.Project; import com.mtvs.devlinkbackend.project.repository.ProjectRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; @Service @@ -77,6 +80,10 @@ public List findProjectsWithLargerRequirements( requiredClient, requiredServer, requiredDesign, requiredPlanner, requiredAIEngineer); } + public Map findProjectVectorByProjectId(Long projectId) { + return projectRepository.findById(projectId).orElse(null).getProjectVector(); + } + @Transactional public Project updateProject(ProjectUpdateRequestDTO projectUpdateRequestDTO, String accountId) { Optional request = projectRepository.findById(projectUpdateRequestDTO.getRequestId()); @@ -104,6 +111,21 @@ else throw new IllegalArgumentException("잘못된 accountId로 Request ID : " else throw new IllegalArgumentException("잘못된 requestId로 수정 시도"); } + @Transactional + public Project updateProjectVector(ProjectVectorRegistRequestDTO projectVectorRegistRequestDTO) { + Optional project = projectRepository.findById(projectVectorRegistRequestDTO.getProjectId()); + if(project.isPresent()) { + Project foundProject = project.get(); + if(foundProject.getProjectVector().keySet().containsAll(List.of("x","y","z"))) { + foundProject.setProjectVector(projectVectorRegistRequestDTO.getProjectVector()); + return foundProject; + } else + throw new IllegalArgumentException("잘못된 vector key를 넣고 있음 | vector = " + + projectVectorRegistRequestDTO.getProjectVector()); + } else + throw new IllegalArgumentException("등록되지 않은 Project에게 vector 정보를 추가/수정 시도 중"); + } + public void deleteProject(Long requestId) { projectRepository.deleteById(requestId); }