From 35991ab0b20c2967f96d0fc27a805eab5b38a9ab Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Sun, 26 Jan 2025 00:05:10 +0900 Subject: [PATCH 1/9] =?UTF-8?q?CLAP-119=20Feat:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=8A=B9=EC=9D=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/task/ApprovalTaskRequest.java | 22 ++++++++ .../web/dto/task/ApprovalTaskResponse.java | 14 +++++ .../web/dto/task/FilterTaskListRequest.java | 4 +- ...rderRequest.java => OrderTaskRequest.java} | 2 +- .../inbound/web/task/FindTaskController.java | 2 +- .../web/task/ManagementTaskController.java | 17 ++++-- .../persistense/MemberPersistenceAdapter.java | 1 - .../repository/LabelPersistenceAdapter.java | 26 +++++++++ .../application/Task/ApprovalTaskService.java | 49 +++++++++++++++++ .../application/Task/CreateTaskService.java | 7 ++- .../application/Task/UpdateTaskService.java | 9 ++-- .../server/application/mapper/TaskMapper.java | 10 ++++ .../port/inbound/domain/LabelService.java | 20 +++++++ .../inbound/task/ApprovalTaskUsecase.java | 8 +++ .../port/outbound/task/LoadLabelPort.java | 10 ++++ .../server/domain/model/member/Member.java | 3 ++ .../server/domain/model/task/Category.java | 54 ++++++++++--------- .../clap/server/domain/model/task/Task.java | 13 ++++- .../exception/code/MemberErrorCode.java | 1 + .../server/exception/code/TaskErrorCode.java | 5 +- .../task/FindTaskListServiceTest.java | 6 +-- 21 files changed, 236 insertions(+), 47 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskRequest.java create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskResponse.java rename src/main/java/clap/server/adapter/inbound/web/dto/task/{OrderRequest.java => OrderTaskRequest.java} (90%) create mode 100644 src/main/java/clap/server/adapter/outbound/persistense/repository/LabelPersistenceAdapter.java create mode 100644 src/main/java/clap/server/application/Task/ApprovalTaskService.java create mode 100644 src/main/java/clap/server/application/port/inbound/domain/LabelService.java create mode 100644 src/main/java/clap/server/application/port/inbound/task/ApprovalTaskUsecase.java create mode 100644 src/main/java/clap/server/application/port/outbound/task/LoadLabelPort.java rename src/test/java/clap/server/{ => application/service}/task/FindTaskListServiceTest.java (96%) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskRequest.java new file mode 100644 index 00000000..123cde62 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskRequest.java @@ -0,0 +1,22 @@ +package clap.server.adapter.inbound.web.dto.task; + +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDateTime; + +public record ApprovalTaskRequest( + @NotNull + Long taskId, + @NotNull + Long mainCategoryId, + @NotNull + Long categoryId, + @NotNull + Long processorId, + @NotNull + LocalDateTime dueDate, + @NotNull + Long labelId + +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskResponse.java new file mode 100644 index 00000000..5b1f8b3c --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/ApprovalTaskResponse.java @@ -0,0 +1,14 @@ +package clap.server.adapter.inbound.web.dto.task; + +import clap.server.adapter.outbound.persistense.entity.task.constant.LabelType; + +import java.time.LocalDateTime; + +public record ApprovalTaskResponse( + Long taskId, + String processorName, + String reviewerName, + LocalDateTime deadLine, + LabelType labelName +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java index 6b361be3..afedd25b 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterTaskListRequest.java @@ -32,8 +32,8 @@ public record FilterTaskListRequest( @NotNull List taskStatus, - @Schema(description = "정렬 기준", implementation = OrderRequest.class) + @Schema(description = "정렬 기준", implementation = OrderTaskRequest.class) @NotNull - OrderRequest orderRequest + OrderTaskRequest orderRequest ) { } diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderTaskRequest.java similarity index 90% rename from src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java rename to src/main/java/clap/server/adapter/inbound/web/dto/task/OrderTaskRequest.java index c756d06e..fd849bab 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/OrderTaskRequest.java @@ -2,7 +2,7 @@ import io.swagger.v3.oas.annotations.media.Schema; -public record OrderRequest( +public record OrderTaskRequest( @Schema(description = "정렬 기준", example = "REQUESTED_AT") String sortBy, diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java index f58dcdbb..e7618937 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java @@ -27,7 +27,7 @@ public class FindTaskController { private final FindTaskListUsecase taskListUsecase; @Operation(summary = "사용자 요청 작업 목록 조회") - @Secured({"ROLE_USER"}) + @Secured({"ROLE_USER", "ROLE_MANAGER"}) @GetMapping("/requests") public ResponseEntity> findTasksRequestedByUser( @RequestParam(defaultValue = "0") int page, diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java index 5e30f255..40781b8e 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java @@ -1,10 +1,8 @@ package clap.server.adapter.inbound.web.task; import clap.server.adapter.inbound.security.SecurityUserDetails; -import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; -import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse; -import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; -import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.*; +import clap.server.application.port.inbound.task.ApprovalTaskUsecase; import clap.server.application.port.inbound.task.CreateTaskUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.common.annotation.architecture.WebAdapter; @@ -15,6 +13,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -31,6 +30,7 @@ public class ManagementTaskController { private final CreateTaskUsecase createTaskUsecase; private final UpdateTaskUsecase updateTaskUsecase; + private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) @@ -51,4 +51,13 @@ public ResponseEntity updateTask( @AuthenticationPrincipal SecurityUserDetails userInfo){ return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), taskId, updateTaskRequest, attachments)); } + + @Operation(summary = "작업 승인") + @Secured({"ROLE_MANAGER"}) + @PostMapping("/approval") + public ResponseEntity approvalTask( + @RequestBody @Valid ApprovalTaskRequest approvalTaskRequest, + @AuthenticationPrincipal SecurityUserDetails userInfo){ + return ResponseEntity.ok(approvalTaskUsecase.approvalTaskByReviewer(userInfo.getUserId(), approvalTaskRequest)); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java index 6a142f5d..355879d4 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -85,6 +85,5 @@ public List findTasksByMemberIdAndStatus(Long memberId, List t .map(taskPersistenceMapper::toDomain) .collect(Collectors.toList()); } - } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/LabelPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/LabelPersistenceAdapter.java new file mode 100644 index 00000000..c64863fb --- /dev/null +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/LabelPersistenceAdapter.java @@ -0,0 +1,26 @@ +package clap.server.adapter.outbound.persistense.repository; + +import clap.server.adapter.outbound.persistense.entity.task.LabelEntity; +import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; +import clap.server.adapter.outbound.persistense.mapper.LabelPersistenceMapper; +import clap.server.adapter.outbound.persistense.repository.task.LabelRepository; +import clap.server.application.port.outbound.task.LoadLabelPort; +import clap.server.common.annotation.architecture.PersistenceAdapter; +import clap.server.domain.model.task.Label; +import lombok.RequiredArgsConstructor; + +import java.util.Optional; + +@PersistenceAdapter +@RequiredArgsConstructor +public class LabelPersistenceAdapter implements LoadLabelPort { + + private final LabelRepository labelRepository; + private final LabelPersistenceMapper labelPersistenceMapper; + + @Override + public Optional