From 7cb2fe76e9ad0af1cf5e389d7f8045f70f4c8776 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 17:27:10 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=ED=8C=8C=ED=8A=B8=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9D=98=20=EC=99=B8=EB=9E=98?= =?UTF-8?q?=ED=82=A4=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 해결된 오류: - skil로 만들어지는 Map 형식을 구현하기 위한 테이블이 외래 키 관계가 userId가 아닌 기본 컬럼으로 매핑되고 있던 문제 - 따라서 조회시 해당 skill에 대한 정보가 넘어오지 않음 - 따라서 해당 table을 모두 drop하고 userId로 다시 연관관계 매핑시킴 --- .../com/mtvs/devlinkbackend/oauth2/entity/UserPartner.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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; From 29f40c3e97ab08ab7f103f6745ffc3059287d898 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Mon, 21 Oct 2024 17:28:41 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20Project=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20Vector=20=EC=A0=95=EB=B3=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추가된 기능: - 해당 값은 Project가 공고 게시판에서 위치할 정보를 나타내는 값 - Flow는 해당 값이 있는지 GET API로 확인하고 없는 경우 언리얼 측에서 PATCH 요청으로 해당 Vector 정보를 등록하는 방식 --- .../project/controller/ProjectController.java | 32 +++++++++++++++++++ .../dto/ProjectVectorRegistRequestDTO.java | 20 ++++++++++++ .../project/entity/Project.java | 11 +++++++ .../project/service/ProjectService.java | 22 +++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 src/main/java/com/mtvs/devlinkbackend/project/dto/ProjectVectorRegistRequestDTO.java 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); }