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 new file mode 100644 index 00000000..7e4e4427 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/admin/ManagementLabelController.java @@ -0,0 +1,55 @@ +package clap.server.adapter.inbound.web.admin; + +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; +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; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "05. Admin") +@WebAdapter +@RequiredArgsConstructor +@RequestMapping("/api/management/label") +public class ManagementLabelController { + + private final AddLabelUsecase addLabelUsecase; + private final UpdateLabelUsecase updateLabelUsecase; + private final DeleteLabelUsecase deleteLabelUsecase; + + @Operation(summary = "구분(label) 추가 API") + @PostMapping + @Secured({"ROLE_ADMIN"}) + public void addLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody AddAndEditLabelRequest request) { + addLabelUsecase.addLabel(userInfo.getUserId(), request); + } + + @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, + @PathVariable Long labelId, + @RequestBody AddAndEditLabelRequest request) { + updateLabelUsecase.editLabel(userInfo.getUserId(), labelId, request); + + } + + @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, + @PathVariable Long labelId) { + deleteLabelUsecase.deleteLabel(userInfo.getUserId(), labelId); + } +} 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 deleted file mode 100644 index 3f6abefa..00000000 --- a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java +++ /dev/null @@ -1,31 +0,0 @@ -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.application.port.inbound.admin.AddLabelUsecase; -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; - -@Tag(name = "05. Admin") -@WebAdapter -@RequiredArgsConstructor -@RequestMapping("/api/management/label") -public class UpdateLabelController { - - private final AddLabelUsecase addLabelUsecase; - - @Operation(summary = "구분(label) 추가 API") - @PostMapping - @Secured({"ROLE_ADMIN"}) - public void addLabel(@AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody AddLabelRequest request) { - addLabelUsecase.addLabel(userInfo.getUserId(), request); - } -} 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 new file mode 100644 index 00000000..005235e3 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddAndEditLabelRequest.java @@ -0,0 +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/AddLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java deleted file mode 100644 index 4652e7ec..00000000 --- a/src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package clap.server.adapter.inbound.web.dto.label; - -import clap.server.adapter.outbound.persistense.entity.task.constant.LabelColor; - -public record AddLabelRequest( - - String labelName, - 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 ) { } 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/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/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/ManageLabelService.java b/src/main/java/clap/server/application/service/label/ManageLabelService.java new file mode 100644 index 00000000..69bcf062 --- /dev/null +++ b/src/main/java/clap/server/application/service/label/ManageLabelService.java @@ -0,0 +1,48 @@ +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; +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 ManageLabelService implements UpdateLabelUsecase, DeleteLabelUsecase { + + 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); + } + + + @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 2e2be36d..48e8a8ae 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,13 @@ public static Label addLabel(Member admin, AddLabelRequest request) { .isDeleted(false) .build(); } + + public void updateLabel(AddAndEditLabelRequest request) { + this.labelName = request.labelName(); + this.labelColor = request.labelColor(); + } + + public void deleteLabel() { + this.isDeleted = true; + } }