diff --git a/src/main/java/com/issueDive/controller/IssueController.java b/src/main/java/com/issueDive/controller/IssueController.java index 4bd827d..b3ebd9c 100644 --- a/src/main/java/com/issueDive/controller/IssueController.java +++ b/src/main/java/com/issueDive/controller/IssueController.java @@ -64,10 +64,22 @@ public ResponseEntity> getIssue(@PathVariable Long id /** * Update * @param id 수정할 이슈 id - * @param request title, description, assignee(uid) + * @param request title, description, assignee(uid), labelIds * @return 공통 응답 포맷 + 수정된 이슈 dto */ @PutMapping("/{id}") + public ResponseEntity> patchIssue(@PathVariable Long id, + @RequestBody UpdateIssueRequest request) { + return ResponseEntity.ok(ApiResponse.ok(issueService.updateIssue(id, request))); + } + + /** + * Update (부분 수정) + * @param id 수정할 이슈 id + * @param request title, description, assigneeId, labelIds + * @return 공통 응답 포맷 + 수정된 이슈 dto + */ + @PatchMapping("/{id}") public ResponseEntity> updateIssue(@PathVariable Long id, @RequestBody UpdateIssueRequest request) { return ResponseEntity.ok(ApiResponse.ok(issueService.updateIssue(id, request))); diff --git a/src/main/java/com/issueDive/dto/UpdateIssueRequest.java b/src/main/java/com/issueDive/dto/UpdateIssueRequest.java index 14ae7e4..f34eee1 100644 --- a/src/main/java/com/issueDive/dto/UpdateIssueRequest.java +++ b/src/main/java/com/issueDive/dto/UpdateIssueRequest.java @@ -1,8 +1,11 @@ package com.issueDive.dto; +import java.util.List; + public record UpdateIssueRequest( String title, String description, - Long assigneeId + Long assigneeId, + List labelIds ) {} diff --git a/src/main/java/com/issueDive/service/IssueService.java b/src/main/java/com/issueDive/service/IssueService.java index cb41118..abaaad6 100644 --- a/src/main/java/com/issueDive/service/IssueService.java +++ b/src/main/java/com/issueDive/service/IssueService.java @@ -9,12 +9,14 @@ import com.issueDive.exception.NotFoundException; import com.issueDive.exception.ValidationException; import com.issueDive.repository.IssueRepository; +import com.issueDive.repository.LabelRepository; import com.issueDive.repository.UserRepository; import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -26,6 +28,7 @@ public class IssueService { private final QIssue qIssue = QIssue.issue; private final IssueRepository issueRepository; private final UserRepository userRepository; // 작성자/담당자 유효성 검증용 + private final LabelRepository labelRepository; /** * Issue 생성 @@ -106,9 +109,10 @@ public IssueResponse getIssue(Long id) { /** * 수정 * @param id 수정할 이슈 id - * @param request (선택적으로) title, description, assignee(uid) + * @param request (선택적으로) title, description, assigneeId, labelIds * @return 수정한 이슈 dto */ + @Transactional public IssueResponse updateIssue(Long id, UpdateIssueRequest request) { Issue issue = issueRepository.findById(id) .orElseThrow(() -> new NotFoundException("Issue not found")); @@ -122,6 +126,17 @@ public IssueResponse updateIssue(Long id, UpdateIssueRequest request) { issue.setAssignee(assignee); } + if (request.labelIds() != null) { + // 1. 요청으로 받은 ID 목록으로 새로운 라벨 엔티티들을 조회합니다. + List