Skip to content

Commit 2a9eed4

Browse files
committed
CLAP-111 Refactor : 통계 조회 API 주소 통합, 리팩토링, 예외처리
<footer> - 관련: #74
1 parent 0ec9b91 commit 2a9eed4

File tree

11 files changed

+150
-51
lines changed

11 files changed

+150
-51
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package clap.server.adapter.inbound.web.dto.statistics;
2+
3+
import clap.server.exception.StatisticsException;
4+
import com.fasterxml.jackson.annotation.JsonCreator;
5+
import lombok.Getter;
6+
import lombok.RequiredArgsConstructor;
7+
8+
import static clap.server.exception.code.StatisticsErrorCode.STATISTICS_BAD_REQUEST;
9+
10+
@Getter
11+
@RequiredArgsConstructor
12+
public enum PeriodType {
13+
DAY("day"),
14+
WEEK("week"),
15+
MONTH("month");
16+
17+
private final String type;
18+
19+
@JsonCreator
20+
public static PeriodType from(String input) {
21+
for (PeriodType periodType : PeriodType.values()) {
22+
if (periodType.getType().equals(input)) {
23+
return periodType;
24+
}
25+
}
26+
throw new StatisticsException(STATISTICS_BAD_REQUEST);
27+
}
28+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package clap.server.adapter.inbound.web.dto.statistics;
2+
3+
public record StatisticsResponse(String key, long count) {
4+
5+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package clap.server.adapter.inbound.web.dto.statistics;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
7+
8+
@Getter
9+
@RequiredArgsConstructor
10+
public enum StatisticsType {
11+
REQUEST_BY_PERIOD("request-by-period"),
12+
PROCESS_BY_PERIOD("process-by-period"),
13+
REQUEST_BY_CATEGORY("request-by-category"),
14+
PROCESS_BY_MANAGER("process-by-manager");
15+
16+
private final String type;
17+
18+
@JsonCreator
19+
public static StatisticsType from(String input) {
20+
for (StatisticsType statisticsType : StatisticsType.values()) {
21+
if (statisticsType.getType().equals(input)) {
22+
return statisticsType;
23+
}
24+
}
25+
return null;
26+
}
27+
}
Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
package clap.server.adapter.inbound.web.statistics;
22

3+
import clap.server.adapter.inbound.web.dto.statistics.PeriodType;
4+
import clap.server.adapter.inbound.web.dto.statistics.StatisticsResponse;
5+
import clap.server.adapter.inbound.web.dto.statistics.StatisticsType;
36
import clap.server.application.port.inbound.statistics.*;
47
import clap.server.common.annotation.architecture.WebAdapter;
8+
import clap.server.exception.StatisticsException;
59
import io.swagger.v3.oas.annotations.tags.Tag;
610
import lombok.RequiredArgsConstructor;
711
import org.springframework.http.ResponseEntity;
812
import org.springframework.web.bind.annotation.GetMapping;
913
import org.springframework.web.bind.annotation.RequestMapping;
1014
import org.springframework.web.bind.annotation.RequestParam;
1115

12-
import java.util.Map;
16+
import java.util.List;
17+
18+
import static clap.server.exception.code.StatisticsErrorCode.STATISTICS_BAD_REQUEST;
1319

1420
@Tag(name = "작업 관련 통계")
1521
@WebAdapter
@@ -20,30 +26,49 @@ public class FindStatisticsController {
2026
private final FindPeriodTaskProcessUsecase findPeriodTaskProcessUsecase;
2127
private final FindCategoryTaskRequestUsecase findCategoryTaskRequestUsecase;
2228
private final FindSubCategoryTaskRequestUsecase findSubCategoryTaskRequestUsecase;
23-
private final ManagerTaskProcessUsecase managerTaskProcessUsecase;
24-
25-
@GetMapping(value = "/task-requests-by-period")
26-
public ResponseEntity<Map<String, Long>> aggregatePeriodTaskRequest(@RequestParam String period) {
27-
return ResponseEntity.ok(findPeriodTaskRequestUsecase.aggregatePeriodTaskRequest(period));
28-
}
29-
30-
@GetMapping("/task-processed-by-period")
31-
public ResponseEntity<Map<String, Long>> aggregatePeriodTaskProcess(@RequestParam String period) {
32-
return ResponseEntity.ok(findPeriodTaskProcessUsecase.aggregatePeriodTaskProcess(period));
33-
}
34-
35-
@GetMapping("/task-requests-by-category")
36-
public ResponseEntity<Map<String, Long>> aggregateCategoryTaskRequest(@RequestParam String period) {
37-
return ResponseEntity.ok(findCategoryTaskRequestUsecase.aggregateCategoryTaskRequest(period));
38-
}
29+
private final FindManagerTaskProcessUsecase findManagerTaskProcessUsecase;
3930

40-
@GetMapping("/task-requests-by-subcategory")
41-
public ResponseEntity<Map<String, Long>> aggregateSubCategoryTaskRequest(@RequestParam String period, @RequestParam String mainCategory) {
42-
return ResponseEntity.ok(findSubCategoryTaskRequestUsecase.aggregateSubCategoryTaskRequest(period, mainCategory));
31+
@GetMapping
32+
public ResponseEntity<List<StatisticsResponse>> aggregateTaskStatistics(@RequestParam PeriodType periodType, @RequestParam StatisticsType statisticsType) {
33+
switch (statisticsType) {
34+
case REQUEST_BY_PERIOD ->
35+
ResponseEntity.ok(findPeriodTaskRequestUsecase
36+
.aggregatePeriodTaskRequest(periodType.getType())
37+
.entrySet()
38+
.stream()
39+
.map(result -> new StatisticsResponse(result.getKey(), result.getValue()))
40+
.toList());
41+
case PROCESS_BY_PERIOD ->
42+
ResponseEntity.ok(findPeriodTaskProcessUsecase
43+
.aggregatePeriodTaskProcess(periodType.getType())
44+
.entrySet()
45+
.stream()
46+
.map(result -> new StatisticsResponse(result.getKey(), result.getValue()))
47+
.toList());
48+
case REQUEST_BY_CATEGORY ->
49+
ResponseEntity.ok(findCategoryTaskRequestUsecase.aggregateCategoryTaskRequest(periodType.getType())
50+
.entrySet()
51+
.stream()
52+
.map(result -> new StatisticsResponse(result.getKey(), result.getValue()))
53+
.toList());
54+
case PROCESS_BY_MANAGER ->
55+
ResponseEntity.ok(findManagerTaskProcessUsecase
56+
.aggregateManagerTaskProcess(periodType.getType())
57+
.entrySet()
58+
.stream()
59+
.map(result -> new StatisticsResponse(result.getKey(), result.getValue()))
60+
.toList());
61+
}
62+
throw new StatisticsException(STATISTICS_BAD_REQUEST);
4363
}
4464

45-
@GetMapping("/tasks-processed-by-manager")
46-
public ResponseEntity<Map<String, Long>> aggregateSubCategoryTaskRequest(@RequestParam String period) {
47-
return ResponseEntity.ok(managerTaskProcessUsecase.aggregateManagerTaskProcess(period));
65+
@GetMapping("/subcategory")
66+
public ResponseEntity<List<StatisticsResponse>> aggregateSubCategoryTaskRequest(@RequestParam String period, @RequestParam String mainCategory) {
67+
return ResponseEntity.ok(findSubCategoryTaskRequestUsecase
68+
.aggregateSubCategoryTaskRequest(period, mainCategory)
69+
.entrySet()
70+
.stream()
71+
.map(result -> new StatisticsResponse(result.getKey(), result.getValue()))
72+
.toList());
4873
}
4974
}

src/main/java/clap/server/adapter/outbound/infrastructure/elastic/PeriodConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ public long getDaysToSubtract() {
2727
return daysToSubtract;
2828
}
2929

30-
}
30+
}

src/main/java/clap/server/adapter/outbound/infrastructure/elastic/TaskDocumentAdapter.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,6 @@ public Map<String, Long> findManagerTaskProcessByPeriod(String period) {
6969
return getNonPeriodTaskResults(executeQuery(query), "manager_task");
7070
}
7171

72-
@Override
73-
public Map<String, Long> findManagerTaskProcessByPeriod(String period) {
74-
PeriodConfig periodConfig = PeriodConfig.valueOf(period.toUpperCase());
75-
76-
NativeQuery query = buildManagerTaskProcessQuery(periodConfig);
77-
return getManagerTaskResults(executeQuery(query));
78-
}
79-
8072
private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) {
8173
return NativeQuery.builder()
8274
.withQuery(q -> q
@@ -211,20 +203,4 @@ private Map<String, Long> getNonPeriodTaskResults(ElasticsearchAggregations aggr
211203
))
212204
);
213205
}
214-
215-
private Map<String, Long> getManagerTaskResults(ElasticsearchAggregations aggregations) {
216-
return new TreeMap<>(
217-
aggregations.get("manager_task")
218-
.aggregation()
219-
.getAggregate()
220-
.sterms()
221-
.buckets()
222-
.array()
223-
.stream()
224-
.collect(Collectors.toMap(
225-
bucket -> bucket.key().stringValue(),
226-
MultiBucketBase::docCount
227-
))
228-
);
229-
}
230206
}

src/main/java/clap/server/application/port/inbound/statistics/ManagerTaskProcessUsecase.java renamed to src/main/java/clap/server/application/port/inbound/statistics/FindManagerTaskProcessUsecase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
import java.util.Map;
44

5-
public interface ManagerTaskProcessUsecase {
5+
public interface FindManagerTaskProcessUsecase {
66
Map<String, Long> aggregateManagerTaskProcess(String period);
77
}

src/main/java/clap/server/application/statistics/ManagerTaskProcessService.java renamed to src/main/java/clap/server/application/statistics/FindManagerTaskProcessService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package clap.server.application.statistics;
22

3-
import clap.server.application.port.inbound.statistics.ManagerTaskProcessUsecase;
3+
import clap.server.application.port.inbound.statistics.FindManagerTaskProcessUsecase;
44
import clap.server.application.port.outbound.task.TaskDocumentPort;
55
import clap.server.common.annotation.architecture.ApplicationService;
66
import lombok.RequiredArgsConstructor;
@@ -9,7 +9,7 @@
99

1010
@ApplicationService
1111
@RequiredArgsConstructor
12-
public class ManagerTaskProcessService implements ManagerTaskProcessUsecase {
12+
public class FindManagerTaskProcessService implements FindManagerTaskProcessUsecase {
1313
private final TaskDocumentPort taskDocumentPort;
1414

1515
@Override

src/main/java/clap/server/exception/ExceptionAdvice.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import clap.server.exception.code.AuthErrorCode;
44
import clap.server.exception.code.BaseErrorCode;
55
import clap.server.exception.code.CommonErrorCode;
6+
import clap.server.exception.code.StatisticsErrorCode;
67
import jakarta.servlet.http.HttpServletRequest;
78
import jakarta.validation.ConstraintViolation;
89
import jakarta.validation.ConstraintViolationException;
@@ -170,4 +171,16 @@ public ResponseEntity<Object> handleAccessDeniedException(AccessDeniedException
170171
AuthErrorCode.FORBIDDEN.getMessage()
171172
);
172173
}
174+
175+
@ExceptionHandler(StatisticsException.class)
176+
public ResponseEntity<Object> handleAccessDeniedException(StatisticsException e, WebRequest request) {
177+
return handleExceptionInternalFalse(
178+
e,
179+
StatisticsErrorCode.STATISTICS_BAD_REQUEST,
180+
HttpHeaders.EMPTY,
181+
HttpStatus.BAD_REQUEST,
182+
request,
183+
StatisticsErrorCode.STATISTICS_BAD_REQUEST.getMessage()
184+
);
185+
}
173186
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package clap.server.exception;
2+
3+
import clap.server.exception.code.BaseErrorCode;
4+
5+
public class StatisticsException extends BaseException {
6+
7+
public StatisticsException(BaseErrorCode code) {
8+
super(code);
9+
}
10+
}

0 commit comments

Comments
 (0)