Skip to content

Commit d415e90

Browse files
committed
CLAP-328 Fix : 통계 엘라스틱서치에 저장, 시간대 설정 오류, 응답 양식 수정
<footer> - 관련: #411
1 parent 921bfa3 commit d415e90

File tree

10 files changed

+60
-38
lines changed

10 files changed

+60
-38
lines changed

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
@@ -10,7 +10,7 @@
1010
@Getter
1111
@RequiredArgsConstructor
1212
public enum PeriodConfig {
13-
DAY(1, CalendarInterval.Hour, 11, 16),
13+
DAY(1, CalendarInterval.Hour, 11, 13),
1414
WEEK(7, CalendarInterval.Day, 0, 10),
1515
MONTH(-1, CalendarInterval.Day, 0, 10);
1616

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

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
public class TaskDocumentAdapter implements TaskDocumentPort {
2424
private final TaskElasticRepository taskElasticRepository;
2525
private final ElasticsearchOperations elasticsearchOperations;
26+
private static final String TIME_ZONE = "Asia/Seoul";
2627

2728
@Override
2829
public void saveStatistics(List<Task> statistics) {
@@ -75,9 +76,12 @@ private NativeQuery buildPeriodTaskRequestQuery(PeriodConfig config) {
7576
.range(r -> r
7677
.date(d -> d
7778
.field("created_at")
78-
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
79+
.timeZone(TIME_ZONE)
80+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))
81+
.lt(String.valueOf(LocalDate.now())))))
7982
.withAggregation("period_task", AggregationBuilders.dateHistogram()
8083
.field("created_at")
84+
.timeZone(TIME_ZONE)
8185
.calendarInterval(config.getCalendarInterval())
8286
.build()._toAggregation())
8387
.withMaxResults(0)
@@ -90,12 +94,16 @@ private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
9094
.range(r -> r
9195
.date(d -> d
9296
.field("created_at")
93-
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))))).build();
97+
.timeZone(TIME_ZONE)
98+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))
99+
.lt(String.valueOf(LocalDate.now())))))
100+
.build();
94101
NativeQuery statusQuery = NativeQuery.builder()
95102
.withQuery(q -> q
96103
.term(v -> v
97104
.field("status")
98-
.value("completed"))).build();
105+
.value("completed")))
106+
.build();
99107

100108
return NativeQuery.builder()
101109
.withQuery(q -> q
@@ -104,6 +112,7 @@ private NativeQuery buildPeriodTaskProcessQuery(PeriodConfig config) {
104112
)
105113
.withAggregation("period_task", AggregationBuilders.dateHistogram()
106114
.field("created_at")
115+
.timeZone(TIME_ZONE)
107116
.calendarInterval(config.getCalendarInterval())
108117
.build()._toAggregation())
109118
.withMaxResults(0)
@@ -116,7 +125,9 @@ private NativeQuery buildCategoryTaskRequestQuery(PeriodConfig config) {
116125
.range(r -> r
117126
.date(d -> d
118127
.field("created_at")
119-
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
128+
.timeZone(TIME_ZONE)
129+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))
130+
.lt(String.valueOf(LocalDate.now())))))
120131
.withAggregation("category_task", AggregationBuilders.terms()
121132
.field("main_category")
122133
.build()._toAggregation())
@@ -130,7 +141,10 @@ private NativeQuery buildSubCategoryTaskRequestQuery(PeriodConfig config, String
130141
.range(r -> r
131142
.date(d -> d
132143
.field("created_at")
133-
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))))).build();
144+
.timeZone(TIME_ZONE)
145+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))
146+
.lt(String.valueOf(LocalDate.now())))))
147+
.build();
134148
NativeQuery categoryQuery = NativeQuery.builder()
135149
.withQuery(q -> q
136150
.term(v -> v
@@ -155,7 +169,9 @@ private NativeQuery buildManagerTaskProcessQuery(PeriodConfig config) {
155169
.range(r -> r
156170
.date(d -> d
157171
.field("created_at")
158-
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract()))))))
172+
.timeZone(TIME_ZONE)
173+
.gte(String.valueOf(LocalDate.now().minusDays(config.getDaysToSubtract())))
174+
.lt(String.valueOf(LocalDate.now())))))
159175
.withAggregation("manager_task", AggregationBuilders.terms()
160176
.field("processor")
161177
.build()._toAggregation())

src/main/java/clap/server/adapter/outbound/infrastructure/elastic/document/TaskDocument.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public TaskDocument(Task taskEntity) {
3434
this.mainCategory = taskEntity.getCategory().getMainCategory().getName();
3535
this.subCategory = taskEntity.getCategory().getName();
3636
this.status = taskEntity.getTaskStatus().name().toLowerCase();
37-
this.processor = taskEntity.getProcessor().getMemberInfo().getNickname();
37+
this.processor = taskEntity.getProcessor() != null ? taskEntity.getProcessor().getMemberInfo().getNickname() : "";
3838
this.createdAt = taskEntity.getCreatedAt();
3939
}
4040
}

src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package clap.server.adapter.outbound.persistense;
22

3-
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest;
43
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskBoardRequest;
4+
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest;
55
import clap.server.adapter.inbound.web.dto.task.request.FilterTeamStatusRequest;
66
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskResponse;
77
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
@@ -12,19 +12,14 @@
1212
import clap.server.application.port.outbound.task.LoadTaskPort;
1313
import clap.server.common.annotation.architecture.PersistenceAdapter;
1414
import clap.server.domain.model.task.Task;
15-
import clap.server.exception.ApplicationException;
16-
import clap.server.exception.code.NotificationErrorCode;
17-
import com.fasterxml.jackson.core.JsonProcessingException;
18-
import com.fasterxml.jackson.databind.JsonNode;
19-
import com.fasterxml.jackson.databind.ObjectMapper;
2015
import lombok.RequiredArgsConstructor;
2116
import lombok.extern.slf4j.Slf4j;
2217
import org.springframework.data.domain.Page;
2318
import org.springframework.data.domain.Pageable;
24-
import org.springframework.data.domain.Slice;
25-
import org.springframework.data.domain.SliceImpl;
2619

20+
import java.time.LocalDate;
2721
import java.time.LocalDateTime;
22+
import java.time.LocalTime;
2823
import java.util.List;
2924
import java.util.Optional;
3025

@@ -34,7 +29,6 @@
3429
public class TaskPersistenceAdapter implements CommandTaskPort, LoadTaskPort {
3530
private final TaskRepository taskRepository;
3631
private final TaskPersistenceMapper taskPersistenceMapper;
37-
private final ObjectMapper objectMapper;
3832

3933
@Override
4034
public Task save(Task task) {
@@ -74,7 +68,8 @@ public Optional<Task> findByIdAndStatus(Long id, TaskStatus status) {
7468
}
7569

7670
@Override
77-
public List<Task> findYesterdayTaskByDate(LocalDateTime now) {
71+
public List<Task> findYesterdayTaskByDate() {
72+
LocalDateTime now = LocalDateTime.of(LocalDate.now(), LocalTime.of(0, 0, 0, 0));
7873
return taskRepository.findYesterdayTaskByUpdatedAtIsBetween(now.minusDays(1), now)
7974
.stream().map(taskPersistenceMapper::toDomain).toList();
8075
}

src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
public interface LoadTaskPort {
1717
Optional<Task> findById(Long id);
1818

19-
List<Task> findYesterdayTaskByDate(LocalDateTime now);
19+
List<Task> findYesterdayTaskByDate();
2020

2121
Page<Task> findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest);
2222

src/main/java/clap/server/application/service/statistics/FindTaskProcessService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ public List<StatisticsResponse> aggregateManagerTaskProcess(String period) {
3131
@Override
3232
public List<StatisticsResponse> aggregatePeriodTaskProcess(String period) {
3333
if (period.equals("week") || period.equals("month")) {
34-
return FindTaskStatisticsMapper.toStatisticsResponse( taskStatisticsPolicy.filterAndFormatWeekdayStatistics(taskDocumentPort.findPeriodTaskProcessByPeriod(period)));
34+
return FindTaskStatisticsMapper.toStatisticsResponse(taskStatisticsPolicy.formatStatistics(taskDocumentPort.findPeriodTaskProcessByPeriod(period)));
3535
}
36-
return FindTaskStatisticsMapper.toStatisticsResponse(taskDocumentPort.findPeriodTaskProcessByPeriod(period));
36+
return FindTaskStatisticsMapper.toStatisticsResponse(taskStatisticsPolicy.formatDayStatistics(taskDocumentPort.findPeriodTaskProcessByPeriod(period)));
3737
}
3838

3939
@Override
4040
public List<StatisticsResponse> aggregatePeriodTaskRequest(String period) {
4141
if (period.equals("week") || period.equals("month")) {
42-
return FindTaskStatisticsMapper.toStatisticsResponse(taskStatisticsPolicy.filterAndFormatWeekdayStatistics(taskDocumentPort.findPeriodTaskRequestByPeriod(period)));
42+
return FindTaskStatisticsMapper.toStatisticsResponse(taskStatisticsPolicy.formatStatistics(taskDocumentPort.findPeriodTaskRequestByPeriod(period)));
4343
}
44-
return FindTaskStatisticsMapper.toStatisticsResponse(taskDocumentPort.findPeriodTaskRequestByPeriod(period));
44+
return FindTaskStatisticsMapper.toStatisticsResponse(taskStatisticsPolicy.formatDayStatistics(taskDocumentPort.findPeriodTaskRequestByPeriod(period)));
4545
}
4646
}

src/main/java/clap/server/application/service/statistics/StatisticsIndexingService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import org.springframework.scheduling.annotation.Scheduled;
88
import org.springframework.transaction.annotation.Transactional;
99

10-
import java.time.LocalDateTime;
11-
1210
@ApplicationService
1311
@RequiredArgsConstructor
1412
public class StatisticsIndexingService {
@@ -19,7 +17,7 @@ public class StatisticsIndexingService {
1917
@Transactional
2018
public void IndexStatistics() {
2119
taskDocumentPort.saveStatistics(
22-
loadTaskPort.findYesterdayTaskByDate(LocalDateTime.now().withNano(0))
20+
loadTaskPort.findYesterdayTaskByDate()
2321
);
2422
}
2523
}

src/main/java/clap/server/domain/policy/task/TaskStatisticsPolicy.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import clap.server.common.annotation.architecture.Policy;
44

5-
import java.time.DayOfWeek;
65
import java.time.LocalDate;
76
import java.time.format.DateTimeFormatter;
7+
import java.util.LinkedHashMap;
88
import java.util.Map;
99
import java.util.Map.Entry;
1010
import java.util.TreeMap;
@@ -14,9 +14,8 @@
1414
public class TaskStatisticsPolicy {
1515
private static final String DISPLAY_FORMAT = "M월 d일";
1616

17-
public Map<String, Long> filterAndFormatWeekdayStatistics(Map<String, Long> statistics) {
17+
public Map<String, Long> formatStatistics(Map<String, Long> statistics) {
1818
return statistics.entrySet().stream()
19-
.filter(this::isWeekday)
2019
.collect(Collectors.toMap(
2120
entry -> formatDate(entry.getKey()),
2221
Entry::getValue,
@@ -25,13 +24,20 @@ public Map<String, Long> filterAndFormatWeekdayStatistics(Map<String, Long> stat
2524
));
2625
}
2726

28-
private boolean isWeekday(Entry<String, Long> entry) {
29-
LocalDate date = LocalDate.parse(entry.getKey());
30-
return !(date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY);
31-
}
32-
3327
private String formatDate(String dateString) {
3428
LocalDate date = LocalDate.parse(dateString);
3529
return date.format(DateTimeFormatter.ofPattern(DISPLAY_FORMAT));
3630
}
31+
32+
public Map<String, Long> formatDayStatistics(Map<String, Long> statistics) {
33+
for (int i = 0; i <= 23; i++) statistics.putIfAbsent(String.valueOf(i), 0L);
34+
35+
return statistics.entrySet().stream()
36+
.collect(Collectors.toMap(
37+
entry -> Integer.parseInt(entry.getKey()) + "시",
38+
Entry::getValue,
39+
(v1, v2) -> v1,
40+
LinkedHashMap::new
41+
));
42+
}
3743
}

src/test/java/clap/server/application/statistics/FindTaskProcessServiceTest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,10 @@ void aggregatePeriodTaskProcess() {
8686
when(taskDocumentPort.findPeriodTaskProcessByPeriod(eq("week"))).thenReturn(statistics);
8787

8888
Map<String, Long> formattedStatistics = new TreeMap<>();
89+
formattedStatistics.put("2월 1일", 8L);
8990
formattedStatistics.put("1월 30일", 7L);
9091
formattedStatistics.put("1월 31일", 6L);
91-
when(taskStatisticsPolicy.filterAndFormatWeekdayStatistics(statistics)).thenReturn(formattedStatistics);
92+
when(taskStatisticsPolicy.formatStatistics(statistics)).thenReturn(formattedStatistics);
9293

9394
//when
9495
List<StatisticsResponse> week = findTaskProcessService.aggregatePeriodTaskProcess("week");
@@ -98,6 +99,8 @@ void aggregatePeriodTaskProcess() {
9899
assertThat(week.get(0).count()).isEqualTo(7L);
99100
assertThat(week.get(1).key()).isEqualTo("1월 31일");
100101
assertThat(week.get(1).count()).isEqualTo(6L);
102+
assertThat(week.get(2).key()).isEqualTo("2월 1일");
103+
assertThat(week.get(2).count()).isEqualTo(8L);
101104
}
102105

103106
@Test
@@ -112,9 +115,10 @@ void aggregatePeriodTaskRequest() {
112115
when(taskDocumentPort.findPeriodTaskRequestByPeriod(eq("week"))).thenReturn(statistics);
113116

114117
Map<String, Long> formattedStatistics = new TreeMap<>();
118+
formattedStatistics.put("2월 1일", 8L);
115119
formattedStatistics.put("1월 30일", 7L);
116120
formattedStatistics.put("1월 31일", 6L);
117-
when(taskStatisticsPolicy.filterAndFormatWeekdayStatistics(statistics)).thenReturn(formattedStatistics);
121+
when(taskStatisticsPolicy.formatStatistics(statistics)).thenReturn(formattedStatistics);
118122

119123
//when
120124
List<StatisticsResponse> week = findTaskProcessService.aggregatePeriodTaskRequest("week");
@@ -124,5 +128,7 @@ void aggregatePeriodTaskRequest() {
124128
assertThat(week.get(0).count()).isEqualTo(7L);
125129
assertThat(week.get(1).key()).isEqualTo("1월 31일");
126130
assertThat(week.get(1).count()).isEqualTo(6L);
131+
assertThat(week.get(2).key()).isEqualTo("2월 1일");
132+
assertThat(week.get(2).count()).isEqualTo(8L);
127133
}
128134
}

src/test/java/clap/server/domain/policy/task/TaskStatisticsPolicyTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,20 @@ class TaskStatisticsPolicyTest {
1111
private final TaskStatisticsPolicy taskStatisticsPolicy = new TaskStatisticsPolicy();
1212

1313
@Test
14-
void filterAndFormatWeekdayStatistics() {
14+
void formatStatistics() {
1515
//given
1616
Map<String, Long> statistics = new TreeMap<>();
1717
statistics.put("2025-02-01", 8L);
1818
statistics.put("2025-01-30", 7L);
1919
statistics.put("2025-01-31", 6L);
2020

2121
Map<String, Long> formattedStatistics = new TreeMap<>();
22+
formattedStatistics.put("2월 1일", 8L);
2223
formattedStatistics.put("1월 30일", 7L);
2324
formattedStatistics.put("1월 31일", 6L);
2425

2526
//when
26-
Map<String, Long> weekdayStatistics = taskStatisticsPolicy.filterAndFormatWeekdayStatistics(statistics);
27+
Map<String, Long> weekdayStatistics = taskStatisticsPolicy.formatStatistics(statistics);
2728

2829
//then
2930
assertThat(weekdayStatistics).isEqualTo(formattedStatistics);

0 commit comments

Comments
 (0)