diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java index 9b9f18ed..d2d99ca1 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java @@ -35,7 +35,11 @@ public void addMainCategory(@AuthenticationPrincipal SecurityUserDetails userInf @PostMapping("/sub-category") @Secured("ROLE_ADMIN") public void addSubCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @Valid @RequestBody AddSubCategoryRequest addCategoryRequest) { - addSubCategoryUsecase.addSubCategory(userInfo.getUserId(), addCategoryRequest.mainCategoryId(), addCategoryRequest.code(), addCategoryRequest.name()); + addSubCategoryUsecase.addSubCategory(userInfo.getUserId(), + addCategoryRequest.mainCategoryId(), + addCategoryRequest.code(), + addCategoryRequest.name(), + addCategoryRequest.descriptionExample()); } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java index bb9e97ec..89b7264f 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java @@ -13,6 +13,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @@ -33,17 +34,24 @@ public ResponseEntity> findAllCategory() { return ResponseEntity.ok(findAllCategoryUsecase.findAllCategory()); } - @Operation(summary = "1차 카테고리 조회") + @Operation(summary = "1차 카테고리 목록 조회") @GetMapping("/main-category") @Secured({"ROLE_USER", "ROLE_MANAGER", "ROLE_ADMIN"}) public ResponseEntity> findMainCategory() { return ResponseEntity.ok(findmainCategoryUsecase.findMainCategory()); } - @Operation(summary = "2차 카테고리 조회") + @Operation(summary = "2차 카테고리 목록 조회") @GetMapping("/sub-category") @Secured({"ROLE_USER", "ROLE_MANAGER", "ROLE_ADMIN"}) public ResponseEntity> findSubCategory() { return ResponseEntity.ok(findsubCategoryUsecase.findSubCategory()); } + + @Operation(summary = "2차 카테고리 단일 조회") + @GetMapping("/sub-categories/{categoryId}") + @Secured({"ROLE_USER", "ROLE_MANAGER", "ROLE_ADMIN"}) + public ResponseEntity findOneSubCategory(@PathVariable Long categoryId) { + return ResponseEntity.ok(findsubCategoryUsecase.findOneSubCategory(categoryId)); + } } diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java index ce967a93..80d90d12 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java @@ -27,6 +27,10 @@ public class UpdateCategoryController { @Secured("ROLE_ADMIN") public void updateCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long categoryId, @Valid @RequestBody UpdateCategoryRequest updateCategoryRequest) { - updateCategoryUsecase.updateCategory(userInfo.getUserId(), categoryId, updateCategoryRequest.name(), updateCategoryRequest.code()); + updateCategoryUsecase.updateCategory(userInfo.getUserId(), + categoryId, + updateCategoryRequest.name(), + updateCategoryRequest.code(), + updateCategoryRequest.descriptionExample()); } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/AddSubCategoryRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/AddSubCategoryRequest.java index 725ae23a..88f2d236 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/AddSubCategoryRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/AddSubCategoryRequest.java @@ -11,5 +11,6 @@ public record AddSubCategoryRequest( @NotBlank @Length(max = 20) String name, @NotBlank @Pattern(regexp = "^[A-Z]{1,2}$", message = "올바른 카테고리 코드 형식이 아닙니다.") - String code) { + String code, + String descriptionExample) { } diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/UpdateCategoryRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/UpdateCategoryRequest.java index 4ec1e751..36a0ecea 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/UpdateCategoryRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/UpdateCategoryRequest.java @@ -8,6 +8,7 @@ public record UpdateCategoryRequest( @NotBlank @Length(max = 20) String name, @NotBlank @Pattern(regexp = "^[A-Z]{1,2}$", message = "올바른 카테고리 코드 형식이 아닙니다.") - String code + String code, + String descriptionExample ) { } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/FindSubCategoryResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/FindSubCategoryResponse.java index 8993ddb2..5dc588b7 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/FindSubCategoryResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/response/FindSubCategoryResponse.java @@ -4,6 +4,7 @@ public record FindSubCategoryResponse( Long id, Long mainCategoryId, String name, - String code + String code, + String descriptionExample ) { } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java index 427bf08a..7601f9bc 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java @@ -34,4 +34,9 @@ public Comment saveComment(Comment comment) { public void deleteCommentWithTaskHistory(Long commentId) { commentRepository.deleteCommentWithTaskHistory(commentId); } + + @Override + public void deleteComment(Comment comment) { + commentRepository.delete(commentPersistenceMapper.toEntity(comment)); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java index 42a22bde..5ee18b3b 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java @@ -35,4 +35,9 @@ public TaskHistory save(TaskHistory taskHistory) { TaskHistoryEntity savedTaskHistoryEntity = taskHistoryRepository.save(taskHistoryEntity); return taskHistoryPersistenceMapper.toDomain(savedTaskHistoryEntity); } + + @Override + public void deleteTaskHistoryByCommentId(Long commentId) { + taskHistoryRepository.updateByComment_CommentId(commentId); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/history/TaskHistoryRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/history/TaskHistoryRepository.java index d5e1cc04..7707a184 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/history/TaskHistoryRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/history/TaskHistoryRepository.java @@ -8,5 +8,8 @@ import org.springframework.stereotype.Repository; @Repository -public interface TaskHistoryRepository extends JpaRepository , TaskHistoryCustomRepository{ -} \ No newline at end of file +public interface TaskHistoryRepository extends JpaRepository, TaskHistoryCustomRepository { + @Modifying + @Query("UPDATE TaskHistoryEntity t SET t.isDeleted = true WHERE t.comment.commentId = :commentId") + void updateByComment_CommentId(@Param("commentId") Long commentId); +} diff --git a/src/main/java/clap/server/application/mapper/CategoryResponseMapper.java b/src/main/java/clap/server/application/mapper/CategoryResponseMapper.java index 2b6ba4b7..54f4cf9c 100644 --- a/src/main/java/clap/server/application/mapper/CategoryResponseMapper.java +++ b/src/main/java/clap/server/application/mapper/CategoryResponseMapper.java @@ -22,6 +22,6 @@ public static FindMainCategoryResponse toFindMainCategoryResponse(Category categ } public static FindSubCategoryResponse toFindSubCategoryResponse(Category category) { - return new FindSubCategoryResponse(category.getCategoryId(), category.getMainCategory().getCategoryId(), category.getName(), category.getCode()); + return new FindSubCategoryResponse(category.getCategoryId(), category.getMainCategory().getCategoryId(), category.getName(), category.getCode(), category.getDescriptionExample()); } } diff --git a/src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java index 26df3d7b..0300df03 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java @@ -1,5 +1,5 @@ package clap.server.application.port.inbound.admin; public interface AddSubCategoryUsecase { - void addSubCategory(Long adminId, Long mainCategoryId, String code, String name); + void addSubCategory(Long adminId, Long mainCategoryId, String code, String name, String descriptionExample); } diff --git a/src/main/java/clap/server/application/port/inbound/admin/FindSubCategoryUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/FindSubCategoryUsecase.java index 5b66dd7d..8428b0c9 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/FindSubCategoryUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/FindSubCategoryUsecase.java @@ -6,4 +6,5 @@ public interface FindSubCategoryUsecase { List findSubCategory(); + FindSubCategoryResponse findOneSubCategory(Long categoryId); } diff --git a/src/main/java/clap/server/application/port/inbound/admin/UpdateCategoryUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/UpdateCategoryUsecase.java index a4c7b5f6..131626e8 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/UpdateCategoryUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/UpdateCategoryUsecase.java @@ -1,5 +1,5 @@ package clap.server.application.port.inbound.admin; public interface UpdateCategoryUsecase { - void updateCategory(Long adminId, Long categoryId, String name, String code); + void updateCategory(Long adminId, Long categoryId, String name, String code, String descriptionExample); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java b/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java index 71a60c8c..b5087c45 100644 --- a/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java @@ -7,4 +7,6 @@ public interface CommandCommentPort { Comment saveComment(Comment comment); void deleteCommentWithTaskHistory(Long commentId); + + void deleteComment(Comment comment); } diff --git a/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java b/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java index 9a8b3145..aa6fb800 100644 --- a/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java +++ b/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java @@ -5,4 +5,6 @@ public interface CommandTaskHistoryPort { TaskHistory save(TaskHistory taskHistory); + + void deleteTaskHistoryByCommentId(Long commentId); } diff --git a/src/main/java/clap/server/application/service/admin/AddCategoryService.java b/src/main/java/clap/server/application/service/admin/AddCategoryService.java index 61f656ca..6a09de2f 100644 --- a/src/main/java/clap/server/application/service/admin/AddCategoryService.java +++ b/src/main/java/clap/server/application/service/admin/AddCategoryService.java @@ -36,14 +36,14 @@ public void addMainCategory(Long adminId, String code, String name) { @Override @Transactional - public void addSubCategory(Long adminId, Long mainCategoryId, String code, String name) { + public void addSubCategory(Long adminId, Long mainCategoryId, String code, String name, String descriptionExample) { Optional activeMember = loadMemberPort.findActiveMemberById(adminId); Optional mainCategory = loadCategoryPort.findById(mainCategoryId); Category subCategory = Category.createSubCategory( activeMember.orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)), mainCategory.orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)), - code, name); + code, name, descriptionExample); commandCategoryPort.save(subCategory); } } \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/admin/FindSubCategoryService.java b/src/main/java/clap/server/application/service/admin/FindSubCategoryService.java index 9e343fe3..22c59f45 100644 --- a/src/main/java/clap/server/application/service/admin/FindSubCategoryService.java +++ b/src/main/java/clap/server/application/service/admin/FindSubCategoryService.java @@ -5,6 +5,8 @@ import clap.server.application.port.inbound.admin.FindSubCategoryUsecase; import clap.server.application.port.outbound.task.LoadCategoryPort; import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.TaskErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -16,11 +18,19 @@ public class FindSubCategoryService implements FindSubCategoryUsecase { private final LoadCategoryPort loadCategoryPort; @Override - @Transactional + @Transactional(readOnly = true) public List findSubCategory() { return loadCategoryPort.findSubCategory() .stream() .map(CategoryResponseMapper::toFindSubCategoryResponse) .toList(); } + + @Override + @Transactional(readOnly = true) + public FindSubCategoryResponse findOneSubCategory(Long categoryId) { + return CategoryResponseMapper.toFindSubCategoryResponse(loadCategoryPort + .findById(categoryId) + .orElseThrow(() -> new ApplicationException(TaskErrorCode.CATEGORY_NOT_FOUND))); + } } diff --git a/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java b/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java index 23e44ba5..29ac6249 100644 --- a/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java +++ b/src/main/java/clap/server/application/service/admin/UpdateCategoryService.java @@ -23,11 +23,11 @@ public class UpdateCategoryService implements UpdateCategoryUsecase { @Override @Transactional - public void updateCategory(Long adminId, Long categoryId, String name, String code) { + public void updateCategory(Long adminId, Long categoryId, String name, String code, String descriptionExample) { Member admin = loadMemberPort.findActiveMemberById(adminId).orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)); Category category = loadCategoryPort.findById(categoryId) .orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)); - category.updateCategory(admin, name, code); + category.updateCategory(admin, name, code, descriptionExample); commandCategoryPort.save(category); } } \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/history/CommandCommentService.java b/src/main/java/clap/server/application/service/history/CommandCommentService.java index 4459a68e..670a3fe8 100644 --- a/src/main/java/clap/server/application/service/history/CommandCommentService.java +++ b/src/main/java/clap/server/application/service/history/CommandCommentService.java @@ -55,13 +55,16 @@ public void deleteComment(Long userId, Long commentId) { Member member = memberService.findActiveMember(userId); Comment comment = commentService.findById(commentId); - if (Objects.equals(comment.getMember().getMemberId(), member.getMemberId())) { + if (Member.checkCommenter(comment.getTask(), member)) { + // 첨부파일이 있을 경우 삭제 if (loadAttachmentPort.exitsByCommentId(commentId)) { deleteAttachments(commentId); } - commandCommentPort.deleteCommentWithTaskHistory(commentId); - }else{ - throw new DomainException(MemberErrorCode.NOT_A_COMMENTER); + // comment 삭제 + commandCommentPort.deleteComment(comment); + // comment와 관련된 taskHistory도 함께 삭제 + + commandTaskHistoryPort.deleteTaskHistoryByCommentId(commentId); } } diff --git a/src/main/java/clap/server/domain/model/task/Category.java b/src/main/java/clap/server/domain/model/task/Category.java index c544a79e..4f685ce2 100644 --- a/src/main/java/clap/server/domain/model/task/Category.java +++ b/src/main/java/clap/server/domain/model/task/Category.java @@ -31,19 +31,21 @@ public static Category createMainCategory(Member admin, String code, String name .build(); } - public static Category createSubCategory(Member admin, Category mainCategory, String code, String name) { + public static Category createSubCategory(Member admin, Category mainCategory, String code, String name, String descriptionExample) { return Category.builder() .mainCategory(mainCategory) .admin(admin) .code(code) .name(name) + .descriptionExample(descriptionExample != null ? descriptionExample : "") .build(); } - public void updateCategory(Member admin, String name, String code){ + public void updateCategory(Member admin, String name, String code, String descriptionExample){ this.admin = admin; this.name = name; this.code = code; + this.descriptionExample = descriptionExample != null ? descriptionExample : ""; } public void deleteCategory(Member admin) { diff --git a/src/test/java/clap/server/application/service/admin/AddCategoryServiceTest.java b/src/test/java/clap/server/application/service/admin/AddCategoryServiceTest.java index 83e7fb18..783e00ee 100644 --- a/src/test/java/clap/server/application/service/admin/AddCategoryServiceTest.java +++ b/src/test/java/clap/server/application/service/admin/AddCategoryServiceTest.java @@ -70,7 +70,8 @@ void addMainCategory() { @Test void addSubCategory() { MemberEntity admin = entityManager.find(MemberEntity.class, 1); - addCategoryService.addSubCategory(admin.getMemberId(), 1L, "CR", "생성"); + addCategoryService.addSubCategory(admin.getMemberId(), 1L, + "CR", "생성", "vm이름:\n이미지:\n인스턴스 유형\n볼륨 용량\nvpc이름:\n보안그룸:"); CategoryEntity category = entityManager.find(CategoryEntity.class, 2); assertThat(category.getCategoryId()).isEqualTo(2);