Skip to content

Commit 53633e0

Browse files
authored
Merge pull request #103 from Capstone-OpenStep/feature/#97-task-statistics
feat: 통계 로직 구현
2 parents 8e9039d + c47f31f commit 53633e0

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

src/main/java/com/chungang/capstone/openstep/domain/Task/controller/TaskController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public ApiResponse<List<TaskResponseDTO.RepoTaskGroupDTO>> getTaskList() {
6565

6666
//모든 테스크의 상태를 업데이트하고 상태가 변한 테스크를 반환하는 API
6767
@GetMapping("/update-status")
68+
@Operation(summary = "모든 테스크 상태 업데이트 API", description = "모든 기여(테스크)의 상태를 업데이트하고, 상태가 변경된 테스크 목록을 반환합니다.")
6869
public ApiResponse<List<TaskResponseDTO.TaskBrief>> updateTaskStatus() {
6970
Member member = SecurityUtils.getCurrentMember();
7071
List<Task> updatedTasks = taskQueryService.updateAllTaskStatus(member);
@@ -74,4 +75,13 @@ public ApiResponse<List<TaskResponseDTO.TaskBrief>> updateTaskStatus() {
7475
return ApiResponse.onSuccess(SuccessStatus.TASK_STATUS_UPDATE_OK, TaskConverter.taskToTaskBriefs(updatedTasks));
7576
}
7677

78+
@GetMapping("/statistics")
79+
@Operation(summary = "테스크 통계 조회 API", description = "사용자의 기여(테스크) 통계를 조회합니다. 라벨 별로 기여 수를 반환합니다.(feature, bug, refactor, goot first issue, chore 로 구분되고, 나머지 라벨은 other로 분류됩니다.)")
80+
public ApiResponse<Map<String, Long>> getTaskStatistics() {
81+
Member member = SecurityUtils.getCurrentMember();
82+
Map<String, Long> statistics = taskQueryService.getTaskStatistics(member);
83+
return ApiResponse.onSuccess(SuccessStatus.TASK_STATISTICS_GET_OK, statistics);
84+
}
85+
86+
7787
}

src/main/java/com/chungang/capstone/openstep/domain/Task/service/TaskQueryService.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,27 @@ public List<Task> updateAllTaskStatus(Member member) {
137137

138138
return updatedTasks;
139139
}
140+
141+
public Map<String, Long> getTaskStatistics(Member member) {
142+
List<Task> tasks = taskRepository.findAllByMember(member);
143+
144+
// 라벨 별로 기여 수를 세기
145+
Map<String, Long> statistics = tasks.stream()
146+
.flatMap(task -> task.getIssue().getLabels().stream())
147+
.collect(Collectors.groupingBy(label -> label, Collectors.counting()));
148+
149+
// 라벨을 feature, bug, refactor, good first issue, chore로 구분하고 나머지는 other로 분류
150+
Map<String, Long> categorizedStatistics = new LinkedHashMap<>();
151+
categorizedStatistics.put("feature", statistics.getOrDefault("feature", 0L));
152+
categorizedStatistics.put("bug", statistics.getOrDefault("bug", 0L));
153+
categorizedStatistics.put("refactor", statistics.getOrDefault("refactor", 0L));
154+
categorizedStatistics.put("good first issue", statistics.getOrDefault("good first issue", 0L));
155+
categorizedStatistics.put("chore", statistics.getOrDefault("chore", 0L));
156+
categorizedStatistics.put("other", statistics.entrySet().stream()
157+
.filter(entry -> !categorizedStatistics.containsKey(entry.getKey()))
158+
.map(Map.Entry::getValue)
159+
.reduce(0L, Long::sum));
160+
161+
return categorizedStatistics;
162+
}
140163
}

src/main/java/com/chungang/capstone/openstep/global/apiPayload/code/status/SuccessStatus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public enum SuccessStatus implements BaseCode {
5151
TASK_BRANCH_GET_OK(HttpStatus.OK,"TASK_4003" ,"테스크 브랜치 조회가 완료되었습니다." ),
5252
TASK_STATUS_GET_OK(HttpStatus.OK,"TASK_4004" ,"테스크 상태 조회가 완료되었습니다." ),
5353
TASK_STATUS_UPDATE_OK(HttpStatus.OK,"TASK_4005","사용자의 전체 테스크 상태 업데이트가 완료되었습니다." ),
54+
TASK_STATISTICS_GET_OK(HttpStatus.OK,"TASK_4006","테스크 통계 조회가 완료되었습니다." ),
5455
TASK_DELETE_OK(HttpStatus.OK,"TASK_4101","테스크 삭제가 완료되었습니다." ),
5556

5657
// Rank 관련 응답

0 commit comments

Comments
 (0)