From e6c5338380e2f17ce5052d800de284401299e656 Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 30 Jan 2025 02:04:04 +0900 Subject: [PATCH 1/3] =?UTF-8?q?CLAP-175=20Feat:=20=EA=B5=AC=EB=B6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=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/UpdateLabelController.java | 20 ++++++++--- ...quest.java => AddAndEditLabelRequest.java} | 2 +- .../port/inbound/admin/AddLabelUsecase.java | 4 +-- .../inbound/admin/UpdateLabelUsecase.java | 7 ++++ .../service/label/AddLabelService.java | 4 +-- .../service/label/UpdateLabelService.java | 34 +++++++++++++++++++ .../clap/server/domain/model/task/Label.java | 10 ++++-- 7 files changed, 68 insertions(+), 13 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/dto/label/{AddLabelRequest.java => AddAndEditLabelRequest.java} (83%) create mode 100644 src/main/java/clap/server/application/port/inbound/admin/UpdateLabelUsecase.java create mode 100644 src/main/java/clap/server/application/service/label/UpdateLabelService.java diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java index 3f6abefa..6e4784b8 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java @@ -1,17 +1,16 @@ package clap.server.adapter.inbound.web.admin; import clap.server.adapter.inbound.security.SecurityUserDetails; -import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; +import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; import clap.server.application.port.inbound.admin.AddLabelUsecase; +import clap.server.application.port.inbound.admin.UpdateLabelUsecase; 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.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; @Tag(name = "05. Admin") @WebAdapter @@ -20,12 +19,23 @@ public class UpdateLabelController { private final AddLabelUsecase addLabelUsecase; + private final UpdateLabelUsecase updateLabelUsecase; @Operation(summary = "구분(label) 추가 API") @PostMapping @Secured({"ROLE_ADMIN"}) public void addLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody AddLabelRequest request) { + @RequestBody AddAndEditLabelRequest request) { addLabelUsecase.addLabel(userInfo.getUserId(), request); } + + @Operation(summary = "구분(label) 수정 API") + @PatchMapping("/{labelId}") + @Secured({"ROLE_ADMIN"}) + public void updateLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, + @PathVariable Long labelId, + @RequestBody AddAndEditLabelRequest request) { + updateLabelUsecase.editLabel(userInfo.getUserId(), labelId, request); + + } } diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java similarity index 83% rename from src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java rename to src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java index 4652e7ec..97dd919d 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java @@ -2,7 +2,7 @@ import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; -public record AddLabelRequest( +public record AddAndEditLabelRequest( String labelName, LabelColor labelColor diff --git a/src/main/java/clap/server/application/port/inbound/admin/AddLabelUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/AddLabelUsecase.java index a8e05c4a..23543723 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/AddLabelUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/AddLabelUsecase.java @@ -1,10 +1,10 @@ package clap.server.application.port.inbound.admin; -import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; +import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; public interface AddLabelUsecase { - void addLabel(Long adminId, AddLabelRequest request); + void addLabel(Long adminId, AddAndEditLabelRequest request); } diff --git a/src/main/java/clap/server/application/port/inbound/admin/UpdateLabelUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/UpdateLabelUsecase.java new file mode 100644 index 00000000..ca156b8b --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/UpdateLabelUsecase.java @@ -0,0 +1,7 @@ +package clap.server.application.port.inbound.admin; + +import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; + +public interface UpdateLabelUsecase { + void editLabel(Long adminId, Long labelId, AddAndEditLabelRequest request); +} diff --git a/src/main/java/clap/server/application/service/label/AddLabelService.java b/src/main/java/clap/server/application/service/label/AddLabelService.java index 1c6272d2..85cb8579 100644 --- a/src/main/java/clap/server/application/service/label/AddLabelService.java +++ b/src/main/java/clap/server/application/service/label/AddLabelService.java @@ -1,6 +1,6 @@ package clap.server.application.service.label; -import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; +import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; import clap.server.application.port.inbound.admin.AddLabelUsecase; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.outbound.task.CommandLabelPort; @@ -19,7 +19,7 @@ public class AddLabelService implements AddLabelUsecase { @Transactional @Override - public void addLabel(Long adminId, AddLabelRequest request) { + public void addLabel(Long adminId, AddAndEditLabelRequest request) { Member admin = memberService.findActiveMember(adminId); Label label = Label.addLabel(admin, request); commandLabelPort.save(label); diff --git a/src/main/java/clap/server/application/service/label/UpdateLabelService.java b/src/main/java/clap/server/application/service/label/UpdateLabelService.java new file mode 100644 index 00000000..ec52dea1 --- /dev/null +++ b/src/main/java/clap/server/application/service/label/UpdateLabelService.java @@ -0,0 +1,34 @@ +package clap.server.application.service.label; + +import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; +import clap.server.application.port.inbound.admin.UpdateLabelUsecase; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.outbound.task.CommandLabelPort; +import clap.server.application.port.outbound.task.LoadLabelPort; +import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.task.Label; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.LabelErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@ApplicationService +@RequiredArgsConstructor +public class UpdateLabelService implements UpdateLabelUsecase { + + private final MemberService memberService; + private final LoadLabelPort loadLabelPort; + private final CommandLabelPort commandLabelPort; + + @Transactional + @Override + public void editLabel(Long adminId, Long labelId, AddAndEditLabelRequest request) { + memberService.findActiveMember(adminId); + + Label label = loadLabelPort.findById(labelId) + .orElseThrow(() -> new ApplicationException(LabelErrorCode.LABEL_NOT_FOUND)); + + label.updateLabel(request); + commandLabelPort.save(label); + } +} diff --git a/src/main/java/clap/server/domain/model/task/Label.java b/src/main/java/clap/server/domain/model/task/Label.java index 2e2be36d..8d7d1db0 100644 --- a/src/main/java/clap/server/domain/model/task/Label.java +++ b/src/main/java/clap/server/domain/model/task/Label.java @@ -1,8 +1,7 @@ package clap.server.domain.model.task; -import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; +import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; -import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.domain.model.common.BaseTime; import clap.server.domain.model.member.Member; import lombok.AccessLevel; @@ -20,7 +19,7 @@ public class Label extends BaseTime { private LabelColor labelColor; private boolean isDeleted; - public static Label addLabel(Member admin, AddLabelRequest request) { + public static Label addLabel(Member admin, AddAndEditLabelRequest request) { return Label.builder() .admin(admin) .labelName(request.labelName()) @@ -28,4 +27,9 @@ public static Label addLabel(Member admin, AddLabelRequest request) { .isDeleted(false) .build(); } + + public void updateLabel(AddAndEditLabelRequest request) { + this.labelName = request.labelName(); + this.labelColor = request.labelColor(); + } } From 2ee702a113a988959c0838f2501ba48b14df4199 Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 30 Jan 2025 02:20:25 +0900 Subject: [PATCH 2/3] =?UTF-8?q?CLAP-175=20Feat:=20=EA=B5=AC=EB=B6=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...oller.java => ManagementLabelController.java} | 12 +++++++++++- .../port/inbound/admin/DeleteLabelUsecase.java | 5 +++++ ...LabelService.java => ManageLabelService.java} | 16 +++++++++++++++- .../clap/server/domain/model/task/Label.java | 4 ++++ 4 files changed, 35 insertions(+), 2 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/admin/{UpdateLabelController.java => ManagementLabelController.java} (76%) create mode 100644 src/main/java/clap/server/application/port/inbound/admin/DeleteLabelUsecase.java rename src/main/java/clap/server/application/service/label/{UpdateLabelService.java => ManageLabelService.java} (71%) diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java similarity index 76% rename from src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java rename to src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java index 6e4784b8..ee988181 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java @@ -3,6 +3,7 @@ import clap.server.adapter.inbound.security.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; import clap.server.application.port.inbound.admin.AddLabelUsecase; +import clap.server.application.port.inbound.admin.DeleteLabelUsecase; import clap.server.application.port.inbound.admin.UpdateLabelUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; @@ -16,10 +17,11 @@ @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/management/label") -public class UpdateLabelController { +public class ManagementLabelController { private final AddLabelUsecase addLabelUsecase; private final UpdateLabelUsecase updateLabelUsecase; + private final DeleteLabelUsecase deleteLabelUsecase; @Operation(summary = "구분(label) 추가 API") @PostMapping @@ -38,4 +40,12 @@ public void updateLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, updateLabelUsecase.editLabel(userInfo.getUserId(), labelId, request); } + + @Operation(summary = "구분(label) 삭제 API") + @DeleteMapping("/{labelId}") + @Secured({"ROLE_ADMIN"}) + public void deleteLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, + @PathVariable Long labelId) { + deleteLabelUsecase.deleteLabel(userInfo.getUserId(), labelId); + } } diff --git a/src/main/java/clap/server/application/port/inbound/admin/DeleteLabelUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/DeleteLabelUsecase.java new file mode 100644 index 00000000..4d019eda --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/DeleteLabelUsecase.java @@ -0,0 +1,5 @@ +package clap.server.application.port.inbound.admin; + +public interface DeleteLabelUsecase { + void deleteLabel(Long adminId, Long labelId); +} diff --git a/src/main/java/clap/server/application/service/label/UpdateLabelService.java b/src/main/java/clap/server/application/service/label/ManageLabelService.java similarity index 71% rename from src/main/java/clap/server/application/service/label/UpdateLabelService.java rename to src/main/java/clap/server/application/service/label/ManageLabelService.java index ec52dea1..69bcf062 100644 --- a/src/main/java/clap/server/application/service/label/UpdateLabelService.java +++ b/src/main/java/clap/server/application/service/label/ManageLabelService.java @@ -1,6 +1,7 @@ package clap.server.application.service.label; import clap.server.adapter.inbound.web.dto.label.AddAndEditLabelRequest; +import clap.server.application.port.inbound.admin.DeleteLabelUsecase; import clap.server.application.port.inbound.admin.UpdateLabelUsecase; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.outbound.task.CommandLabelPort; @@ -14,7 +15,7 @@ @ApplicationService @RequiredArgsConstructor -public class UpdateLabelService implements UpdateLabelUsecase { +public class ManageLabelService implements UpdateLabelUsecase, DeleteLabelUsecase { private final MemberService memberService; private final LoadLabelPort loadLabelPort; @@ -31,4 +32,17 @@ public void editLabel(Long adminId, Long labelId, AddAndEditLabelRequest request label.updateLabel(request); commandLabelPort.save(label); } + + + @Transactional + @Override + public void deleteLabel(Long adminId, Long labelId) { + memberService.findActiveMember(adminId); + + Label label = loadLabelPort.findById(labelId) + .orElseThrow(() -> new ApplicationException(LabelErrorCode.LABEL_NOT_FOUND)); + + label.deleteLabel(); + commandLabelPort.save(label); + } } diff --git a/src/main/java/clap/server/domain/model/task/Label.java b/src/main/java/clap/server/domain/model/task/Label.java index 8d7d1db0..48e8a8ae 100644 --- a/src/main/java/clap/server/domain/model/task/Label.java +++ b/src/main/java/clap/server/domain/model/task/Label.java @@ -32,4 +32,8 @@ public void updateLabel(AddAndEditLabelRequest request) { this.labelName = request.labelName(); this.labelColor = request.labelColor(); } + + public void deleteLabel() { + this.isDeleted = true; + } } From 00160fc53353700734311bd7313d7e042fddf244 Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 30 Jan 2025 02:28:21 +0900 Subject: [PATCH 3/3] =?UTF-8?q?CLAP-175=20Docs:=20Swagger=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/inbound/web/admin/ManagementLabelController.java | 4 ++++ .../adapter/inbound/web/dto/label/AddAndEditLabelRequest.java | 4 ++++ .../adapter/inbound/web/dto/label/FindLabelListResponse.java | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java index ee988181..7e4e4427 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java @@ -7,6 +7,8 @@ import clap.server.application.port.inbound.admin.UpdateLabelUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.access.annotation.Secured; @@ -32,6 +34,7 @@ public void addLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, } @Operation(summary = "구분(label) 수정 API") + @Parameter(name = "labelId", description = "구분(label) 고유 ID", required = true, in = ParameterIn.PATH) @PatchMapping("/{labelId}") @Secured({"ROLE_ADMIN"}) public void updateLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, @@ -42,6 +45,7 @@ public void updateLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, } @Operation(summary = "구분(label) 삭제 API") + @Parameter(name = "labelId", description = "구분(label) 고유 ID", required = true, in = ParameterIn.PATH) @DeleteMapping("/{labelId}") @Secured({"ROLE_ADMIN"}) public void deleteLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java index 97dd919d..005235e3 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java @@ -1,9 +1,13 @@ package clap.server.adapter.inbound.web.dto.label; +import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; +import io.swagger.v3.oas.annotations.media.Schema; public record AddAndEditLabelRequest( + @Schema(description = "구분(label) 이름") String labelName, + @Schema(description = "구분(label) 색상") LabelColor labelColor ) {} 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 index 4bb0024f..829657ab 100644 --- 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 @@ -1,10 +1,14 @@ package clap.server.adapter.inbound.web.dto.label; import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; +import io.swagger.v3.oas.annotations.media.Schema; public record FindLabelListResponse( + @Schema(description = "구분(label) 고유 ID") Long labelId, + @Schema(description = "구분(label) 이름") String labelName, + @Schema(description = "구분(label) 색상") LabelColor labelColor ) { }