diff --git a/.github/workflows/dev-ci.yml b/.github/workflows/dev-ci.yml index 66e94e52..22dd4a9f 100644 --- a/.github/workflows/dev-ci.yml +++ b/.github/workflows/dev-ci.yml @@ -21,7 +21,8 @@ jobs: with: java-version: '17' distribution: 'temurin' # https://github.com/actions/setup-java - - run: echo "${{ secrets.S3_PROPERTIES }}" >> ./src/test/resources/application.yml + - run: touch ./src/test/resources/application.yml + - run: echo "${{ secrets.S3_PROPERTIES }}" > ./src/test/resources/application.yml # gradle caching - 빌드 시간 향상 - name: Gradle Caching diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java new file mode 100644 index 00000000..82126fff --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/admin/DeleteCategoryController.java @@ -0,0 +1,28 @@ +package clap.server.adapter.inbound.web.admin; + +import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.application.port.inbound.admin.DeleteCategoryUsecase; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@Tag(name = "05. Admin") +@WebAdapter +@RequiredArgsConstructor +@RequestMapping("/api/management") +public class DeleteCategoryController { + private final DeleteCategoryUsecase deleteCategoryUsecase; + + @Operation(summary = "카테고리 삭제") + @DeleteMapping("/categories/{categoryId}") + @Secured("ROLE_ADMIN") + public void deleteCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long categoryId) { + deleteCategoryUsecase.deleteCategory(userInfo.getUserId(), categoryId); + } +} diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java index 0a690b6f..9ccc7731 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/UpdateCategoryController.java @@ -10,10 +10,11 @@ import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@Tag(name = "카테고리 수정") +@Tag(name = "05. Admin") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/management") @@ -21,9 +22,9 @@ public class UpdateCategoryController { private final UpdateCategoryUsecase updateCategoryUsecase; @Operation(summary = "카테고리 수정") - @PatchMapping("/categories/categoryId") + @PatchMapping("/categories/{categoryId}") @Secured("ROLE_ADMIN") - public void updateCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, Long categoryId, + public void updateCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long categoryId, @RequestBody UpdateCategoryRequest updateCategoryRequest) { updateCategoryUsecase.updateCategory(userInfo.getUserId(), categoryId, updateCategoryRequest.name(), updateCategoryRequest.code()); } diff --git a/src/main/java/clap/server/application/port/inbound/admin/DeleteCategoryUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/DeleteCategoryUsecase.java new file mode 100644 index 00000000..da73fb80 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/DeleteCategoryUsecase.java @@ -0,0 +1,5 @@ +package clap.server.application.port.inbound.admin; + +public interface DeleteCategoryUsecase { + void deleteCategory(Long adminId, Long categoryId); +} diff --git a/src/main/java/clap/server/application/service/admin/DeleteCategoryService.java b/src/main/java/clap/server/application/service/admin/DeleteCategoryService.java new file mode 100644 index 00000000..bbff33d4 --- /dev/null +++ b/src/main/java/clap/server/application/service/admin/DeleteCategoryService.java @@ -0,0 +1,29 @@ +package clap.server.application.service.admin; + +import clap.server.application.port.inbound.admin.DeleteCategoryUsecase; +import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.application.port.outbound.task.LoadCategoryPort; +import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.member.Member; +import clap.server.exception.ApplicationException; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +import static clap.server.exception.code.MemberErrorCode.ACTIVE_MEMBER_NOT_FOUND; +import static clap.server.exception.code.TaskErrorCode.CATEGORY_NOT_FOUND; + +@ApplicationService +@RequiredArgsConstructor +public class DeleteCategoryService implements DeleteCategoryUsecase { + private final LoadCategoryPort loadCategoryPort; + private final LoadMemberPort loadMemberPort; + + @Override + @Transactional + public void deleteCategory(Long adminId, Long categoryId) { + Member admin = loadMemberPort.findActiveMemberById(adminId).orElseThrow(() -> new ApplicationException(ACTIVE_MEMBER_NOT_FOUND)); + loadCategoryPort.findById(categoryId) + .orElseThrow(() -> new ApplicationException(CATEGORY_NOT_FOUND)) + .deleteCategory(admin); + } +} diff --git a/src/main/java/clap/server/domain/model/task/Category.java b/src/main/java/clap/server/domain/model/task/Category.java index fd6018c5..f2c046ba 100644 --- a/src/main/java/clap/server/domain/model/task/Category.java +++ b/src/main/java/clap/server/domain/model/task/Category.java @@ -45,5 +45,10 @@ public void updateCategory(Member admin, String code, String name){ this.code = code; this.name = name; } + + public void deleteCategory(Member admin) { + this.admin = admin; + this.isDeleted = true; + } }