From 97dbdd3600b35848bd4c8a09f91c5e90b5c96903 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 18:06:45 +0900 Subject: [PATCH 1/9] =?UTF-8?q?CLAP-162=20Feat:=20=EB=AF=B8=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EC=95=8C=EB=A6=BC=EA=B0=9C=EC=88=98=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CountNotificationResponse.java | 7 ++++++ .../FindNotificationController.java | 10 ++++++++ .../NotificationPersistenceAdapter.java | 5 ++++ .../notification/NotificationRepository.java | 3 +++ .../mapper/NotificationMapper.java | 8 ++++++ .../CountNotificationUseCase.java | 8 ++++++ .../notification/LoadNotificationPort.java | 2 ++ .../CountNotificationService.java | 25 +++++++++++++++++++ 8 files changed, 68 insertions(+) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/notification/CountNotificationResponse.java create mode 100644 src/main/java/clap/server/application/port/inbound/notification/CountNotificationUseCase.java create mode 100644 src/main/java/clap/server/application/service/notification/CountNotificationService.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/notification/CountNotificationResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/notification/CountNotificationResponse.java new file mode 100644 index 00000000..0c9eba0b --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/notification/CountNotificationResponse.java @@ -0,0 +1,7 @@ +package clap.server.adapter.inbound.web.dto.notification; + +public record CountNotificationResponse( + Long memberId, + Integer count +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/notification/FindNotificationController.java b/src/main/java/clap/server/adapter/inbound/web/notification/FindNotificationController.java index 5dfc9b59..1feb38ed 100644 --- a/src/main/java/clap/server/adapter/inbound/web/notification/FindNotificationController.java +++ b/src/main/java/clap/server/adapter/inbound/web/notification/FindNotificationController.java @@ -2,7 +2,9 @@ import clap.server.adapter.inbound.security.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.common.SliceResponse; +import clap.server.adapter.inbound.web.dto.notification.CountNotificationResponse; import clap.server.adapter.inbound.web.dto.notification.FindNotificationListResponse; +import clap.server.application.port.inbound.notification.CountNotificationUseCase; import clap.server.application.port.inbound.notification.FindNotificationListUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; @@ -27,6 +29,7 @@ public class FindNotificationController { private final FindNotificationListUsecase findNotificationListUsecase; + private final CountNotificationUseCase countNotificationUseCase; @Operation(summary = "알림 목록 조회 API") @Parameters({ @@ -41,4 +44,11 @@ public ResponseEntity> findNotificat Pageable pageable = PageRequest.of(page, size); return ResponseEntity.ok(findNotificationListUsecase.findNotificationList(securityUserDetails.getUserId(), pageable)); } + + @Operation(summary = "미확인 알림 개수 조회 API") + @GetMapping("/count") + public ResponseEntity countNotification( + @AuthenticationPrincipal SecurityUserDetails userInfo) { + return ResponseEntity.ok(countNotificationUseCase.countNotification(userInfo.getUserId())); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java index b7330bd0..6df83e81 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java @@ -49,6 +49,11 @@ public List findNotificationsByMemberId(Long memberId) { .collect(Collectors.toList()); } + @Override + public Integer countNotification(Long memberId) { + return notificationRepository.countByIsReadFalseAndReceiver_MemberId(memberId); + } + @Override public void save(Notification notification) { notificationRepository.save(notificationPersistenceMapper.toEntity(notification)); diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java index 0239cd44..e4462dd5 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java @@ -1,5 +1,6 @@ package clap.server.adapter.outbound.persistense.repository.notification; +import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; import clap.server.adapter.outbound.persistense.entity.notification.NotificationEntity; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -15,4 +16,6 @@ public interface NotificationRepository extends JpaRepository findAllByReceiver_MemberIdOrderByCreatedAtDesc(Long receiverId, Pageable pageable); List findAllByReceiver_MemberId(Long memberId); + + Integer countByIsReadFalseAndReceiver_MemberId(Long memberId); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/mapper/NotificationMapper.java b/src/main/java/clap/server/application/mapper/NotificationMapper.java index e2c83e52..4098dd39 100644 --- a/src/main/java/clap/server/application/mapper/NotificationMapper.java +++ b/src/main/java/clap/server/application/mapper/NotificationMapper.java @@ -1,6 +1,7 @@ package clap.server.application.mapper; import clap.server.adapter.inbound.web.dto.common.SliceResponse; +import clap.server.adapter.inbound.web.dto.notification.CountNotificationResponse; import clap.server.adapter.inbound.web.dto.notification.FindNotificationListResponse; import clap.server.domain.model.notification.Notification; import org.springframework.data.domain.Slice; @@ -28,4 +29,11 @@ public static SliceResponse toSliceOfFindNoticeLis slice.isLast() ); } + + public static CountNotificationResponse toCountNotificationResponse(Long userId, Integer count) { + return new CountNotificationResponse( + userId, + count + ); + } } diff --git a/src/main/java/clap/server/application/port/inbound/notification/CountNotificationUseCase.java b/src/main/java/clap/server/application/port/inbound/notification/CountNotificationUseCase.java new file mode 100644 index 00000000..f69158a6 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/notification/CountNotificationUseCase.java @@ -0,0 +1,8 @@ +package clap.server.application.port.inbound.notification; + +import clap.server.adapter.inbound.web.dto.notification.CountNotificationResponse; + +public interface CountNotificationUseCase { + + CountNotificationResponse countNotification(Long userId); +} diff --git a/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java b/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java index 8954c40d..4e4a8731 100644 --- a/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java +++ b/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java @@ -15,4 +15,6 @@ public interface LoadNotificationPort { SliceResponse findAllByReceiverId(Long receiverId, Pageable pageable); List findNotificationsByMemberId(Long memberId); + + Integer countNotification(Long memberId); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/notification/CountNotificationService.java b/src/main/java/clap/server/application/service/notification/CountNotificationService.java new file mode 100644 index 00000000..325688bc --- /dev/null +++ b/src/main/java/clap/server/application/service/notification/CountNotificationService.java @@ -0,0 +1,25 @@ +package clap.server.application.service.notification; + +import clap.server.adapter.inbound.web.dto.notification.CountNotificationResponse; +import clap.server.application.mapper.NotificationMapper; +import clap.server.application.port.inbound.notification.CountNotificationUseCase; +import clap.server.application.port.outbound.notification.LoadNotificationPort; +import clap.server.common.annotation.architecture.ApplicationService; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@ApplicationService +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CountNotificationService implements CountNotificationUseCase { + + private final LoadNotificationPort loadNotificationPort; + + @Transactional + @Override + public CountNotificationResponse countNotification(Long userId) { + Integer count = loadNotificationPort.countNotification(userId); + + return NotificationMapper.toCountNotificationResponse(userId, count); + } +} From b6ca0379d19c8e1edf495deddf9003bbb967c5d6 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 18:07:11 +0900 Subject: [PATCH 2/9] =?UTF-8?q?CLAP-162=20Fix:=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20service=20@Transactional=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/notification/CreateNotificationService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java index 8071eba1..a99af8bc 100644 --- a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java +++ b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java @@ -4,6 +4,7 @@ import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.notification.Notification; import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; @ApplicationService @RequiredArgsConstructor @@ -11,6 +12,7 @@ public class CreateNotificationService{ private final CommandNotificationPort commandNotificationPort; + @Transactional public void createNotification(Notification request) { commandNotificationPort.save(request); From 602382adfbe0f8fa326a3077513d8c2b74565de5 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 16:55:26 +0900 Subject: [PATCH 3/9] =?UTF-8?q?CLAP-161=20Feat:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/task/UpdateTaskLabelRequest.java | 6 ++++ .../web/task/ManagementTaskController.java | 11 +++++++ .../application/Task/UpdateTaskService.java | 33 ++++++++++++++----- .../inbound/task/UpdateTaskLabelUsecase.java | 8 +++++ .../clap/server/domain/model/task/Task.java | 4 +++ 5 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java create mode 100644 src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java new file mode 100644 index 00000000..46e6bab5 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java @@ -0,0 +1,6 @@ +package clap.server.adapter.inbound.web.dto.task; + +public record UpdateTaskLabelRequest( + Long labelId +) { +} 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 ab045008..f72aaf0d 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 @@ -31,6 +31,7 @@ public class ManagementTaskController { private final UpdateTaskUsecase updateTaskUsecase; private final UpdateTaskStatusUsecase updateTaskStatusUsecase; private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase; + private final UpdateTaskLabelUsecase updateTaskLabelUsecase; private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @@ -76,6 +77,16 @@ public ResponseEntity updateTaskProcessor( return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest)); } + @Operation(summary = "작업 구분 변경") + @Secured({"ROLE_MANAGER"}) + @PatchMapping("/label/{taskId}") + public ResponseEntity updateTaskLabel( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskLabelRequest updateTaskLabelRequest) { + return ResponseEntity.ok(updateTaskLabelUsecase.updateTaskLabel(taskId, userInfo.getUserId(), updateTaskLabelRequest)); + } + @Operation(summary = "작업 승인") @Secured({"ROLE_MANAGER"}) @PostMapping("/approval/{taskId}") diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index 372f2cba..d8163b6c 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -1,29 +1,26 @@ package clap.server.application.Task; -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.UpdateTaskStatusRequest; -import clap.server.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest; +import clap.server.adapter.inbound.web.dto.task.*; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.domain.TaskService; +import clap.server.application.port.inbound.task.UpdateTaskLabelUsecase; import clap.server.application.port.inbound.task.UpdateTaskProcessorUsecase; import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.application.port.outbound.task.CommandAttachmentPort; import clap.server.application.port.outbound.task.CommandTaskPort; import clap.server.application.port.outbound.task.LoadAttachmentPort; +import clap.server.application.port.outbound.task.LoadLabelPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.member.Member; -import clap.server.domain.model.task.Attachment; -import clap.server.domain.model.task.Category; -import clap.server.domain.model.task.FilePath; -import clap.server.domain.model.task.Task; +import clap.server.domain.model.task.*; import clap.server.exception.ApplicationException; +import clap.server.exception.code.LabelErrorCode; import clap.server.exception.code.MemberErrorCode; import clap.server.exception.code.TaskErrorCode; import lombok.RequiredArgsConstructor; @@ -34,17 +31,20 @@ import java.util.List; import java.util.Objects; +import static clap.server.exception.code.MemberErrorCode.ACTIVE_MEMBER_NOT_FOUND; + @ApplicationService @RequiredArgsConstructor @Slf4j -public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase { +public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase, UpdateTaskLabelUsecase { private final MemberService memberService; private final CategoryService categoryService; private final TaskService taskService; private final CommandTaskPort commandTaskPort; private final LoadAttachmentPort loadAttachmentPort; + private final LoadLabelPort loadLabelPort; private final CommandAttachmentPort commandAttachmentPort; private final S3UploadAdapter s3UploadAdapter; @@ -96,6 +96,21 @@ public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTa // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 } + @Transactional + @Override + public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request) { + Member reviewer = memberService.findActiveMember(userId); + if (!reviewer.isReviewer()) { + throw new ApplicationException(MemberErrorCode.NOT_A_REVIEWER); + } + Task task = taskService.findById(taskId); + Label label = loadLabelPort.findById(request.labelId()).orElseThrow(() -> new ApplicationException(LabelErrorCode.LABEL_NOT_FOUND)); + + task.updateLabel(label); + Task updatetask = commandTaskPort.save(task); + return TaskMapper.toUpdateTaskResponse(updatetask); + } + private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { List attachmentsToDelete = validateAndGetAttachments(attachmentIdsToDelete, task); attachmentsToDelete.forEach(Attachment::softDelete); diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java new file mode 100644 index 00000000..be5c66dc --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java @@ -0,0 +1,8 @@ +package clap.server.application.port.inbound.task; + +import clap.server.adapter.inbound.web.dto.task.UpdateTaskLabelRequest; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; + +public interface UpdateTaskLabelUsecase { + UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request); +} diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index fb17bcd0..3b0b2814 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -67,6 +67,10 @@ public void updateProcessor(Member processor) { this.processor = processor; } + public void updateLabel(Label label) { + this.label = label; + } + public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) { this.reviewer = reviewer; this.processor = processor; From 5d292a422721402da22cd4df7c2b96af19c7054d Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 17:20:29 +0900 Subject: [PATCH 4/9] =?UTF-8?q?CLAP-161=20Feat:=20label=20Error=20Code=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/exception/code/LabelErrorCode.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/clap/server/exception/code/LabelErrorCode.java diff --git a/src/main/java/clap/server/exception/code/LabelErrorCode.java b/src/main/java/clap/server/exception/code/LabelErrorCode.java new file mode 100644 index 00000000..1ba89e99 --- /dev/null +++ b/src/main/java/clap/server/exception/code/LabelErrorCode.java @@ -0,0 +1,16 @@ +package clap.server.exception.code; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor +public enum LabelErrorCode implements BaseErrorCode{ + LABEL_NOT_FOUND(HttpStatus.NOT_FOUND, "LABEL_001", "작업 구분을 찾을 수 없습니다."); + + + private final HttpStatus httpStatus; + private final String customCode; + private final String message; +} From 5b7f251de29b17da57519e53952543b4ba7503be Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 17:23:19 +0900 Subject: [PATCH 5/9] =?UTF-8?q?Revert=20"CLAP-159=20Feat:=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EA=B5=AC=EB=B6=84=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 31290b57afa3fafae42340d54f0b156e5bb25340. --- .../web/dto/task/UpdateTaskLabelRequest.java | 6 ---- .../web/task/ManagementTaskController.java | 11 ------- .../application/Task/UpdateTaskService.java | 33 +++++-------------- .../inbound/task/UpdateTaskLabelUsecase.java | 8 ----- .../clap/server/domain/model/task/Task.java | 4 --- 5 files changed, 9 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java delete mode 100644 src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java deleted file mode 100644 index 46e6bab5..00000000 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package clap.server.adapter.inbound.web.dto.task; - -public record UpdateTaskLabelRequest( - Long labelId -) { -} 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 f72aaf0d..ab045008 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 @@ -31,7 +31,6 @@ public class ManagementTaskController { private final UpdateTaskUsecase updateTaskUsecase; private final UpdateTaskStatusUsecase updateTaskStatusUsecase; private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase; - private final UpdateTaskLabelUsecase updateTaskLabelUsecase; private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @@ -77,16 +76,6 @@ public ResponseEntity updateTaskProcessor( return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest)); } - @Operation(summary = "작업 구분 변경") - @Secured({"ROLE_MANAGER"}) - @PatchMapping("/label/{taskId}") - public ResponseEntity updateTaskLabel( - @PathVariable Long taskId, - @AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody UpdateTaskLabelRequest updateTaskLabelRequest) { - return ResponseEntity.ok(updateTaskLabelUsecase.updateTaskLabel(taskId, userInfo.getUserId(), updateTaskLabelRequest)); - } - @Operation(summary = "작업 승인") @Secured({"ROLE_MANAGER"}) @PostMapping("/approval/{taskId}") diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index d8163b6c..372f2cba 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -1,26 +1,29 @@ package clap.server.application.Task; -import clap.server.adapter.inbound.web.dto.task.*; +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.UpdateTaskStatusRequest; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.domain.TaskService; -import clap.server.application.port.inbound.task.UpdateTaskLabelUsecase; import clap.server.application.port.inbound.task.UpdateTaskProcessorUsecase; import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.application.port.outbound.task.CommandAttachmentPort; import clap.server.application.port.outbound.task.CommandTaskPort; import clap.server.application.port.outbound.task.LoadAttachmentPort; -import clap.server.application.port.outbound.task.LoadLabelPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.member.Member; -import clap.server.domain.model.task.*; +import clap.server.domain.model.task.Attachment; +import clap.server.domain.model.task.Category; +import clap.server.domain.model.task.FilePath; +import clap.server.domain.model.task.Task; import clap.server.exception.ApplicationException; -import clap.server.exception.code.LabelErrorCode; import clap.server.exception.code.MemberErrorCode; import clap.server.exception.code.TaskErrorCode; import lombok.RequiredArgsConstructor; @@ -31,20 +34,17 @@ import java.util.List; import java.util.Objects; -import static clap.server.exception.code.MemberErrorCode.ACTIVE_MEMBER_NOT_FOUND; - @ApplicationService @RequiredArgsConstructor @Slf4j -public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase, UpdateTaskLabelUsecase { +public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase { private final MemberService memberService; private final CategoryService categoryService; private final TaskService taskService; private final CommandTaskPort commandTaskPort; private final LoadAttachmentPort loadAttachmentPort; - private final LoadLabelPort loadLabelPort; private final CommandAttachmentPort commandAttachmentPort; private final S3UploadAdapter s3UploadAdapter; @@ -96,21 +96,6 @@ public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTa // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 } - @Transactional - @Override - public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request) { - Member reviewer = memberService.findActiveMember(userId); - if (!reviewer.isReviewer()) { - throw new ApplicationException(MemberErrorCode.NOT_A_REVIEWER); - } - Task task = taskService.findById(taskId); - Label label = loadLabelPort.findById(request.labelId()).orElseThrow(() -> new ApplicationException(LabelErrorCode.LABEL_NOT_FOUND)); - - task.updateLabel(label); - Task updatetask = commandTaskPort.save(task); - return TaskMapper.toUpdateTaskResponse(updatetask); - } - private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { List attachmentsToDelete = validateAndGetAttachments(attachmentIdsToDelete, task); attachmentsToDelete.forEach(Attachment::softDelete); diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java deleted file mode 100644 index be5c66dc..00000000 --- a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java +++ /dev/null @@ -1,8 +0,0 @@ -package clap.server.application.port.inbound.task; - -import clap.server.adapter.inbound.web.dto.task.UpdateTaskLabelRequest; -import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; - -public interface UpdateTaskLabelUsecase { - UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request); -} diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index 3b0b2814..fb17bcd0 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -67,10 +67,6 @@ public void updateProcessor(Member processor) { this.processor = processor; } - public void updateLabel(Label label) { - this.label = label; - } - public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) { this.reviewer = reviewer; this.processor = processor; From c88faf69387091be46a43c7bc19aa58576a92d24 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 16:55:26 +0900 Subject: [PATCH 6/9] =?UTF-8?q?CLAP-159=20Feat:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/task/UpdateTaskLabelRequest.java | 6 ++++ .../web/task/ManagementTaskController.java | 11 +++++++ .../application/Task/UpdateTaskService.java | 33 ++++++++++++++----- .../inbound/task/UpdateTaskLabelUsecase.java | 8 +++++ .../clap/server/domain/model/task/Task.java | 4 +++ 5 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java create mode 100644 src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java new file mode 100644 index 00000000..46e6bab5 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskLabelRequest.java @@ -0,0 +1,6 @@ +package clap.server.adapter.inbound.web.dto.task; + +public record UpdateTaskLabelRequest( + Long labelId +) { +} 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 ab045008..f72aaf0d 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 @@ -31,6 +31,7 @@ public class ManagementTaskController { private final UpdateTaskUsecase updateTaskUsecase; private final UpdateTaskStatusUsecase updateTaskStatusUsecase; private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase; + private final UpdateTaskLabelUsecase updateTaskLabelUsecase; private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @@ -76,6 +77,16 @@ public ResponseEntity updateTaskProcessor( return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest)); } + @Operation(summary = "작업 구분 변경") + @Secured({"ROLE_MANAGER"}) + @PatchMapping("/label/{taskId}") + public ResponseEntity updateTaskLabel( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskLabelRequest updateTaskLabelRequest) { + return ResponseEntity.ok(updateTaskLabelUsecase.updateTaskLabel(taskId, userInfo.getUserId(), updateTaskLabelRequest)); + } + @Operation(summary = "작업 승인") @Secured({"ROLE_MANAGER"}) @PostMapping("/approval/{taskId}") diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index 372f2cba..d8163b6c 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -1,29 +1,26 @@ package clap.server.application.Task; -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.UpdateTaskStatusRequest; -import clap.server.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest; +import clap.server.adapter.inbound.web.dto.task.*; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.domain.TaskService; +import clap.server.application.port.inbound.task.UpdateTaskLabelUsecase; import clap.server.application.port.inbound.task.UpdateTaskProcessorUsecase; import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.application.port.outbound.task.CommandAttachmentPort; import clap.server.application.port.outbound.task.CommandTaskPort; import clap.server.application.port.outbound.task.LoadAttachmentPort; +import clap.server.application.port.outbound.task.LoadLabelPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.member.Member; -import clap.server.domain.model.task.Attachment; -import clap.server.domain.model.task.Category; -import clap.server.domain.model.task.FilePath; -import clap.server.domain.model.task.Task; +import clap.server.domain.model.task.*; import clap.server.exception.ApplicationException; +import clap.server.exception.code.LabelErrorCode; import clap.server.exception.code.MemberErrorCode; import clap.server.exception.code.TaskErrorCode; import lombok.RequiredArgsConstructor; @@ -34,17 +31,20 @@ import java.util.List; import java.util.Objects; +import static clap.server.exception.code.MemberErrorCode.ACTIVE_MEMBER_NOT_FOUND; + @ApplicationService @RequiredArgsConstructor @Slf4j -public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase { +public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase, UpdateTaskLabelUsecase { private final MemberService memberService; private final CategoryService categoryService; private final TaskService taskService; private final CommandTaskPort commandTaskPort; private final LoadAttachmentPort loadAttachmentPort; + private final LoadLabelPort loadLabelPort; private final CommandAttachmentPort commandAttachmentPort; private final S3UploadAdapter s3UploadAdapter; @@ -96,6 +96,21 @@ public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTa // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 } + @Transactional + @Override + public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request) { + Member reviewer = memberService.findActiveMember(userId); + if (!reviewer.isReviewer()) { + throw new ApplicationException(MemberErrorCode.NOT_A_REVIEWER); + } + Task task = taskService.findById(taskId); + Label label = loadLabelPort.findById(request.labelId()).orElseThrow(() -> new ApplicationException(LabelErrorCode.LABEL_NOT_FOUND)); + + task.updateLabel(label); + Task updatetask = commandTaskPort.save(task); + return TaskMapper.toUpdateTaskResponse(updatetask); + } + private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { List attachmentsToDelete = validateAndGetAttachments(attachmentIdsToDelete, task); attachmentsToDelete.forEach(Attachment::softDelete); diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java new file mode 100644 index 00000000..be5c66dc --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskLabelUsecase.java @@ -0,0 +1,8 @@ +package clap.server.application.port.inbound.task; + +import clap.server.adapter.inbound.web.dto.task.UpdateTaskLabelRequest; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; + +public interface UpdateTaskLabelUsecase { + UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request); +} diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index fb17bcd0..3b0b2814 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -67,6 +67,10 @@ public void updateProcessor(Member processor) { this.processor = processor; } + public void updateLabel(Label label) { + this.label = label; + } + public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) { this.reviewer = reviewer; this.processor = processor; From f74f68face9094b3ab2285464194e557a28cb909 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 29 Jan 2025 04:49:26 +0900 Subject: [PATCH 7/9] =?UTF-8?q?CLAP-165=20Fix:=20Task=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=A4=91=20=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EB=B3=84=20=EB=B6=84=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/task/ChangeTaskController.java | 73 +++++++++++++++++++ .../web/task/ManagementTaskController.java | 46 ------------ 2 files changed, 73 insertions(+), 46 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java new file mode 100644 index 00000000..9ec8bd7a --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java @@ -0,0 +1,73 @@ +package clap.server.adapter.inbound.web.task; + +import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.task.*; +import clap.server.application.port.inbound.task.ApprovalTaskUsecase; +import clap.server.application.port.inbound.task.UpdateTaskLabelUsecase; +import clap.server.application.port.inbound.task.UpdateTaskProcessorUsecase; +import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; +import clap.server.common.annotation.architecture.WebAdapter; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +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.*; + + +@Tag(name = "02. Task[검토자]") +@WebAdapter +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/tasks") +public class ChangeTaskController { + + private final UpdateTaskStatusUsecase updateTaskStatusUsecase; + private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase; + private final UpdateTaskLabelUsecase updateTaskLabelUsecase; + private final ApprovalTaskUsecase approvalTaskUsecase; + + @Operation(summary = "작업 상태 변경") + @Secured({"ROLE_MANGER"}) + @PatchMapping("/state/{taskId}") + public ResponseEntity updateTaskState( + @PathVariable @NotNull Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskStatusRequest updateTaskStatusRequest) { + + return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskState(userInfo.getUserId(), taskId, updateTaskStatusRequest)); + } + + @Operation(summary = "작업 처리자 변경") + @Secured({"ROLE_MANAGER"}) + @PatchMapping("/processor/{taskId}") + public ResponseEntity updateTaskProcessor( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskProcessorRequest updateTaskProcessorRequest) { + return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest)); + } + + @Operation(summary = "작업 구분 변경") + @Secured({"ROLE_MANAGER"}) + @PatchMapping("/label/{taskId}") + public ResponseEntity updateTaskLabel( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskLabelRequest updateTaskLabelRequest) { + return ResponseEntity.ok(updateTaskLabelUsecase.updateTaskLabel(taskId, userInfo.getUserId(), updateTaskLabelRequest)); + } + + @Operation(summary = "작업 승인") + @Secured({"ROLE_MANAGER"}) + @PostMapping("/approval/{taskId}") + public ResponseEntity approvalTask( + @RequestBody @Valid ApprovalTaskRequest approvalTaskRequest, + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo){ + return ResponseEntity.ok(approvalTaskUsecase.approvalTaskByReviewer(userInfo.getUserId(), taskId, approvalTaskRequest)); + } +} 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 f72aaf0d..b45238b1 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 @@ -2,7 +2,6 @@ import clap.server.adapter.inbound.security.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.task.*; -import clap.server.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest; import clap.server.application.port.inbound.task.*; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; @@ -29,10 +28,6 @@ public class ManagementTaskController { private final CreateTaskUsecase createTaskUsecase; private final UpdateTaskUsecase updateTaskUsecase; - private final UpdateTaskStatusUsecase updateTaskStatusUsecase; - private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase; - private final UpdateTaskLabelUsecase updateTaskLabelUsecase; - private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) @@ -55,45 +50,4 @@ public ResponseEntity updateTask( @AuthenticationPrincipal SecurityUserDetails userInfo){ return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), taskId, updateTaskRequest, attachments)); } - - @Operation(summary = "작업 상태 변경") - @Secured({"ROLE_MANGER"}) - @PatchMapping("/state/{taskId}") - public ResponseEntity updateTaskState( - @PathVariable @NotNull Long taskId, - @AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody UpdateTaskStatusRequest updateTaskStatusRequest) { - - return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskState(userInfo.getUserId(), taskId, updateTaskStatusRequest)); - } - - @Operation(summary = "작업 처리자 변경") - @Secured({"ROLE_MANAGER"}) - @PatchMapping("/processor/{taskId}") - public ResponseEntity updateTaskProcessor( - @PathVariable Long taskId, - @AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody UpdateTaskProcessorRequest updateTaskProcessorRequest) { - return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest)); - } - - @Operation(summary = "작업 구분 변경") - @Secured({"ROLE_MANAGER"}) - @PatchMapping("/label/{taskId}") - public ResponseEntity updateTaskLabel( - @PathVariable Long taskId, - @AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody UpdateTaskLabelRequest updateTaskLabelRequest) { - return ResponseEntity.ok(updateTaskLabelUsecase.updateTaskLabel(taskId, userInfo.getUserId(), updateTaskLabelRequest)); - } - - @Operation(summary = "작업 승인") - @Secured({"ROLE_MANAGER"}) - @PostMapping("/approval/{taskId}") - public ResponseEntity approvalTask( - @RequestBody @Valid ApprovalTaskRequest approvalTaskRequest, - @PathVariable Long taskId, - @AuthenticationPrincipal SecurityUserDetails userInfo){ - return ResponseEntity.ok(approvalTaskUsecase.approvalTaskByReviewer(userInfo.getUserId(), taskId, approvalTaskRequest)); - } } From 6c665b912f11dd8046aa40c60cf3e0400eb2ae5e Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 29 Jan 2025 04:50:59 +0900 Subject: [PATCH 8/9] =?UTF-8?q?CLAP-165=20Feat:=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=EC=9A=A9=20=EA=B5=AC=EB=B6=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/admin/FindLabelAdminController.java | 34 ++++++++++++++ .../web/dto/label/FindLabelListResponse.java | 10 ++++ .../persistense/LabelPersistenceAdapter.java | 33 ++++++++++++- .../repository/task/LabelRepository.java | 8 ++++ .../application/mapper/LabelMapper.java | 31 +++++++++++++ .../inbound/label/FindLabelListUsecase.java | 13 ++++++ .../port/outbound/task/LoadLabelPort.java | 14 +++++- .../service/label/FindLabelListService.java | 46 +++++++++++++++++++ 8 files changed, 186 insertions(+), 3 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/admin/FindLabelAdminController.java create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/label/FindLabelListResponse.java create mode 100644 src/main/java/clap/server/application/mapper/LabelMapper.java create mode 100644 src/main/java/clap/server/application/port/inbound/label/FindLabelListUsecase.java create mode 100644 src/main/java/clap/server/application/service/label/FindLabelListService.java diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindLabelAdminController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindLabelAdminController.java new file mode 100644 index 00000000..a0079492 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindLabelAdminController.java @@ -0,0 +1,34 @@ +package clap.server.adapter.inbound.web.admin; + +import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.common.SliceResponse; +import clap.server.adapter.inbound.web.dto.label.FindLabelListResponse; +import clap.server.application.port.inbound.label.FindLabelListUsecase; +import clap.server.common.annotation.architecture.WebAdapter; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Tag(name = "05. Admin") +@WebAdapter +@RequiredArgsConstructor +@RequestMapping("/api/managements/label") +public class FindLabelAdminController { + + private final FindLabelListUsecase findLabelListUsecase; + + @Operation(summary = "구분 목록 조회 API") + @Secured({"ROLE_ADMIN"}) + @GetMapping + public ResponseEntity> findLabelList( + @AuthenticationPrincipal SecurityUserDetails userInfo) { + return ResponseEntity.ok(findLabelListUsecase.findLabelListAdmin(userInfo.getUserId())); + } +} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/label/FindLabelListResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/label/FindLabelListResponse.java new file mode 100644 index 00000000..4bb0024f --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/label/FindLabelListResponse.java @@ -0,0 +1,10 @@ +package clap.server.adapter.inbound.web.dto.label; + +import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; + +public record FindLabelListResponse( + Long labelId, + String labelName, + LabelColor labelColor +) { +} diff --git a/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java index dd09e12a..5a26a3d7 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java @@ -1,14 +1,24 @@ package clap.server.adapter.outbound.persistense; +import clap.server.adapter.inbound.web.dto.common.SliceResponse; +import clap.server.adapter.inbound.web.dto.label.FindLabelListResponse; +import clap.server.adapter.inbound.web.dto.notification.FindNotificationListResponse; import clap.server.adapter.outbound.persistense.entity.task.LabelEntity; import clap.server.adapter.outbound.persistense.mapper.LabelPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.task.LabelRepository; +import clap.server.application.mapper.LabelMapper; +import clap.server.application.mapper.NotificationMapper; import clap.server.application.port.outbound.task.LoadLabelPort; import clap.server.common.annotation.architecture.PersistenceAdapter; +import clap.server.domain.model.notification.Notification; import clap.server.domain.model.task.Label; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @PersistenceAdapter @RequiredArgsConstructor @@ -18,8 +28,27 @@ public class LabelPersistenceAdapter implements LoadLabelPort { private final LabelPersistenceMapper labelPersistenceMapper; @Override - public Optional