diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java index 584726c4..d1ad5fd5 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java @@ -3,7 +3,8 @@ import clap.server.adapter.inbound.security.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.admin.AddMainCategoryRequest; import clap.server.adapter.inbound.web.dto.admin.AddSubCategoryRequest; -import clap.server.application.port.inbound.admin.AddCategoryUsecase; +import clap.server.application.port.inbound.admin.AddMainCategoryUsecase; +import clap.server.application.port.inbound.admin.AddSubCategoryUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -20,20 +21,21 @@ @RequiredArgsConstructor @RequestMapping("/api/managements") public class AddCategoryController { - private final AddCategoryUsecase addCategoryUsecase; + private final AddMainCategoryUsecase addMainCategoryUsecase; + private final AddSubCategoryUsecase addSubCategoryUsecase; @Operation(summary = "1차 카테고리 추가") @PostMapping("/main-category") @Secured("ROLE_ADMIN") public void addMainCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @Valid @RequestBody AddMainCategoryRequest addMainCategoryRequest) { - addCategoryUsecase.addMainCategory(userInfo.getUserId(), addMainCategoryRequest.code(), addMainCategoryRequest.name()); + addMainCategoryUsecase.addMainCategory(userInfo.getUserId(), addMainCategoryRequest.code(), addMainCategoryRequest.name()); } @Operation(summary = "2차 카테고리 추가") @PostMapping("/sub-category") @Secured("ROLE_ADMIN") public void addSubCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @Valid @RequestBody AddSubCategoryRequest addCategoryRequest) { - addCategoryUsecase.addSubCategory(userInfo.getUserId(), addCategoryRequest.mainCategoryId(), addCategoryRequest.code(), addCategoryRequest.name()); + addSubCategoryUsecase.addSubCategory(userInfo.getUserId(), addCategoryRequest.mainCategoryId(), addCategoryRequest.code(), addCategoryRequest.name()); } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java index bc2ed571..16b74c08 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindCategoryController.java @@ -16,7 +16,7 @@ import java.util.List; -@Tag(name = "카테고리 조회") +@Tag(name = "02. Task [카테고리]", description = "카테고리 조회 API") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api") 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 9ec32397..0f3d877a 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 @@ -6,6 +6,7 @@ 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 lombok.RequiredArgsConstructor; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -25,7 +26,7 @@ public class UpdateCategoryController { @PatchMapping("/categories/{categoryId}") @Secured("ROLE_ADMIN") public void updateCategory(@AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long categoryId, - @RequestBody UpdateCategoryRequest updateCategoryRequest) { + @Valid @RequestBody UpdateCategoryRequest updateCategoryRequest) { updateCategoryUsecase.updateCategory(userInfo.getUserId(), categoryId, updateCategoryRequest.name(), updateCategoryRequest.code()); } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/inbound/web/statistics/FindStatisticsController.java b/src/main/java/clap/server/adapter/inbound/web/statistics/FindStatisticsController.java index e84c0c75..dfa2b023 100644 --- a/src/main/java/clap/server/adapter/inbound/web/statistics/FindStatisticsController.java +++ b/src/main/java/clap/server/adapter/inbound/web/statistics/FindStatisticsController.java @@ -3,7 +3,8 @@ import clap.server.adapter.inbound.web.dto.statistics.PeriodType; import clap.server.adapter.inbound.web.dto.statistics.StatisticsResponse; import clap.server.adapter.inbound.web.dto.statistics.StatisticsType; -import clap.server.application.port.inbound.statistics.*; +import clap.server.application.port.inbound.statistics.FindSubCategoryTaskRequestUsecase; +import clap.server.application.port.inbound.statistics.FindTaskProcessUsecase; import clap.server.common.annotation.architecture.WebAdapter; import clap.server.exception.StatisticsException; import io.swagger.v3.oas.annotations.Operation; @@ -11,6 +12,7 @@ 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.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -20,7 +22,7 @@ import static clap.server.exception.code.StatisticsErrorCode.STATISTICS_BAD_REQUEST; import static io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY; -@Tag(name = "02. Task [담당자]", description = "작업 통계 API") +@Tag(name = "02. Task [통계]", description = "작업 통계 API") @WebAdapter @RequiredArgsConstructor @RequestMapping("/api/tasks/statistics") @@ -33,6 +35,7 @@ public class FindStatisticsController { @Parameter(name = "periodType", description = "day, week, month", required = true, in = QUERY) @Parameter(name = "statisticsType", description = "request-by-period, process-by-period, request-by-category, process-by-manager", required = true, in = QUERY) @GetMapping + @Secured("ROLE_MANAGER") public ResponseEntity> aggregateTaskStatistics(@RequestParam PeriodType periodType, @RequestParam StatisticsType statisticsType) { switch (statisticsType) { case REQUEST_BY_PERIOD -> @@ -51,6 +54,7 @@ public ResponseEntity> aggregateTaskStatistics(@Request @Parameter(name = "periodType", description = "day, week, month", required = true, in = QUERY) @Parameter(name = "mainCategory", description = "1차 카테고리 이름", required = true, in = QUERY) @GetMapping("/subcategory") + @Secured("ROLE_MANAGER") public ResponseEntity> aggregateSubCategoryTaskRequest(@RequestParam PeriodType periodType, @RequestParam String mainCategory) { return ResponseEntity.ok(findSubCategoryTaskRequestUsecase .aggregateSubCategoryTaskRequest(periodType.getType(), mainCategory)); diff --git a/src/main/java/clap/server/application/port/inbound/admin/AddMainCategoryUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/AddMainCategoryUsecase.java new file mode 100644 index 00000000..382c7f57 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/admin/AddMainCategoryUsecase.java @@ -0,0 +1,5 @@ +package clap.server.application.port.inbound.admin; + +public interface AddMainCategoryUsecase { + void addMainCategory(Long adminId, String code, String name); +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/inbound/admin/AddCategoryUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java similarity index 56% rename from src/main/java/clap/server/application/port/inbound/admin/AddCategoryUsecase.java rename to src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java index b49bc41b..26df3d7b 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/AddCategoryUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/AddSubCategoryUsecase.java @@ -1,6 +1,5 @@ package clap.server.application.port.inbound.admin; -public interface AddCategoryUsecase { - void addMainCategory(Long adminId, String code, String name); +public interface AddSubCategoryUsecase { void addSubCategory(Long adminId, Long mainCategoryId, String code, String name); -} \ No newline at end of file +} diff --git a/src/main/java/clap/server/application/service/admin/AddCategoryService.java b/src/main/java/clap/server/application/service/admin/AddCategoryService.java index e759577e..cd401450 100644 --- a/src/main/java/clap/server/application/service/admin/AddCategoryService.java +++ b/src/main/java/clap/server/application/service/admin/AddCategoryService.java @@ -1,6 +1,7 @@ package clap.server.application.service.admin; -import clap.server.application.port.inbound.admin.AddCategoryUsecase; +import clap.server.application.port.inbound.admin.AddMainCategoryUsecase; +import clap.server.application.port.inbound.admin.AddSubCategoryUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.application.port.outbound.task.CommandCategoryPort; import clap.server.application.port.outbound.task.LoadCategoryPort; @@ -17,7 +18,7 @@ @ApplicationService @RequiredArgsConstructor -public class AddCategoryService implements AddCategoryUsecase { +public class AddCategoryService implements AddMainCategoryUsecase, AddSubCategoryUsecase { private final CommandCategoryPort commandCategoryPort; private final LoadCategoryPort loadCategoryPort; private final LoadMemberPort loadMemberPort; diff --git a/src/main/java/clap/server/common/utils/StringToPeriodTypeConverter.java b/src/main/java/clap/server/common/utils/StringToPeriodTypeConverter.java new file mode 100644 index 00000000..ae462adf --- /dev/null +++ b/src/main/java/clap/server/common/utils/StringToPeriodTypeConverter.java @@ -0,0 +1,13 @@ +package clap.server.common.utils; + +import clap.server.adapter.inbound.web.dto.statistics.PeriodType; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class StringToPeriodTypeConverter implements Converter { + @Override + public PeriodType convert(String source) { + return PeriodType.from(source); + } +} diff --git a/src/main/java/clap/server/common/utils/StringToStatisticsTypeConverter.java b/src/main/java/clap/server/common/utils/StringToStatisticsTypeConverter.java new file mode 100644 index 00000000..6828d711 --- /dev/null +++ b/src/main/java/clap/server/common/utils/StringToStatisticsTypeConverter.java @@ -0,0 +1,13 @@ +package clap.server.common.utils; + +import clap.server.adapter.inbound.web.dto.statistics.StatisticsType; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class StringToStatisticsTypeConverter implements Converter { + @Override + public StatisticsType convert(String source) { + return StatisticsType.from(source); + } +} diff --git a/src/main/java/clap/server/config/web/WebConfig.java b/src/main/java/clap/server/config/web/WebConfig.java new file mode 100644 index 00000000..ac2294c6 --- /dev/null +++ b/src/main/java/clap/server/config/web/WebConfig.java @@ -0,0 +1,23 @@ +package clap.server.config.web; + +import clap.server.common.utils.StringToPeriodTypeConverter; +import clap.server.common.utils.StringToStatisticsTypeConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ConversionServiceFactoryBean; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.Set; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Bean + public ConversionServiceFactoryBean conversionService() { + ConversionServiceFactoryBean conversionService = new ConversionServiceFactoryBean(); + conversionService.setConverters(Set.of( + new StringToStatisticsTypeConverter(), + new StringToPeriodTypeConverter() + )); + return conversionService; + } +}