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 new file mode 100644 index 00000000..3f6abefa --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateLabelController.java @@ -0,0 +1,31 @@ +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/AddLabelRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java new file mode 100644 index 00000000..4652e7ec --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/label/AddLabelRequest.java @@ -0,0 +1,9 @@ +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/outbound/persistense/LabelPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java index 5a26a3d7..520e522c 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/LabelPersistenceAdapter.java @@ -8,6 +8,7 @@ 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.CommandLabelPort; import clap.server.application.port.outbound.task.LoadLabelPort; import clap.server.common.annotation.architecture.PersistenceAdapter; import clap.server.domain.model.notification.Notification; @@ -22,7 +23,7 @@ @PersistenceAdapter @RequiredArgsConstructor -public class LabelPersistenceAdapter implements LoadLabelPort { +public class LabelPersistenceAdapter implements LoadLabelPort, CommandLabelPort { private final LabelRepository labelRepository; private final LabelPersistenceMapper labelPersistenceMapper; @@ -51,4 +52,10 @@ public SliceResponse findLabelListBySlice(Pageable pageab labelList.map(LabelMapper::toFindLabelListResponse) ); } + + @Override + public void save(Label label) { + LabelEntity labelEntity = labelPersistenceMapper.toEntity(label); + labelRepository.save(labelEntity); + } } 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 new file mode 100644 index 00000000..a8e05c4a --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/AddLabelUsecase.java @@ -0,0 +1,10 @@ +package clap.server.application.port.inbound.admin; + +import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; + +public interface AddLabelUsecase { + + void addLabel(Long adminId, AddLabelRequest request); + + +} diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandLabelPort.java b/src/main/java/clap/server/application/port/outbound/task/CommandLabelPort.java new file mode 100644 index 00000000..392c4f29 --- /dev/null +++ b/src/main/java/clap/server/application/port/outbound/task/CommandLabelPort.java @@ -0,0 +1,7 @@ +package clap.server.application.port.outbound.task; + +import clap.server.domain.model.task.Label; + +public interface CommandLabelPort { + void save(Label label); +} diff --git a/src/main/java/clap/server/application/service/label/AddLabelService.java b/src/main/java/clap/server/application/service/label/AddLabelService.java new file mode 100644 index 00000000..1c6272d2 --- /dev/null +++ b/src/main/java/clap/server/application/service/label/AddLabelService.java @@ -0,0 +1,27 @@ +package clap.server.application.service.label; + +import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; +import clap.server.application.port.inbound.admin.AddLabelUsecase; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.outbound.task.CommandLabelPort; +import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.member.Member; +import clap.server.domain.model.task.Label; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@ApplicationService +@RequiredArgsConstructor +public class AddLabelService implements AddLabelUsecase { + + private final MemberService memberService; + private final CommandLabelPort commandLabelPort; + + @Transactional + @Override + public void addLabel(Long adminId, AddLabelRequest request) { + Member admin = memberService.findActiveMember(adminId); + Label label = Label.addLabel(admin, 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 bcbcc9b7..2e2be36d 100644 --- a/src/main/java/clap/server/domain/model/task/Label.java +++ b/src/main/java/clap/server/domain/model/task/Label.java @@ -1,6 +1,8 @@ package clap.server.domain.model.task; +import clap.server.adapter.inbound.web.dto.label.AddLabelRequest; 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; @@ -17,4 +19,13 @@ public class Label extends BaseTime { private String labelName; private LabelColor labelColor; private boolean isDeleted; + + public static Label addLabel(Member admin, AddLabelRequest request) { + return Label.builder() + .admin(admin) + .labelName(request.labelName()) + .labelColor(request.labelColor()) + .isDeleted(false) + .build(); + } }