Skip to content

Commit 1108c71

Browse files
authored
feat: 유의미한 회고를 주기적으로 작성하는 사용자의 비율 조회 구현 (#384)
* feat: 유의미한 회고를 주기적으로 작성하는 사용자의 비율 조회 구현 * chore: 쿼리 사용 단순하게 변경
1 parent be17baf commit 1108c71

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed

layer-admin/src/main/java/org/layer/admin/retrospect/controller/AdminRetrospectController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.time.LocalDateTime;
44
import java.util.List;
55

6+
import org.layer.admin.retrospect.controller.dto.MeaningfulRetrospectMemberResponse;
67
import org.layer.admin.retrospect.controller.dto.RetrospectStayTimeResponse;
78
import org.layer.admin.retrospect.service.AdminRetrospectService;
89
import org.springframework.http.ResponseEntity;
@@ -28,4 +29,17 @@ public ResponseEntity<List<RetrospectStayTimeResponse>> getAllRetrospectStayTime
2829

2930
return ResponseEntity.ok().body(responses);
3031
}
32+
33+
@GetMapping("/admin/retrospect/meaningful")
34+
public ResponseEntity<MeaningfulRetrospectMemberResponse> getAllMeaningfulRetrospect(
35+
@RequestParam(name = "startDate") LocalDateTime startDate,
36+
@RequestParam(name = "endDate") LocalDateTime endDate,
37+
@RequestParam(name = "retrospectLength") int retrospectLength,
38+
@RequestParam(name = "retrospectCount") int retrospectCount) {
39+
40+
MeaningfulRetrospectMemberResponse response = adminRetrospectService.getAllMeaningfulRetrospect(
41+
startDate, endDate, retrospectLength, retrospectCount);
42+
43+
return ResponseEntity.ok().body(response);
44+
}
3145
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.layer.admin.retrospect.controller.dto;
2+
3+
public record MeaningfulRetrospectMemberResponse(
4+
long meaningfulMemberCount,
5+
long totalMemberCount
6+
) {
7+
}

layer-admin/src/main/java/org/layer/admin/retrospect/repository/AdminRetrospectRepository.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,30 @@
66

77
import org.layer.admin.retrospect.entity.AdminRetrospectAnswerHistory;
88
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
910
import org.springframework.data.repository.query.Param;
1011

1112
public interface AdminRetrospectRepository extends JpaRepository<AdminRetrospectAnswerHistory, Long> {
1213

1314
Optional<AdminRetrospectAnswerHistory> findTopByMemberIdAndSpaceIdAndRetrospectIdOrderByAnswerStartTimeDesc(
1415
Long memberId, Long spaceId, Long retrospectId);
1516

16-
List<AdminRetrospectAnswerHistory> findAllByEventTimeBetween(
17+
@Query("""
18+
SELECT a.memberId
19+
FROM AdminRetrospectAnswerHistory a
20+
WHERE LENGTH(a.answerContent) >= :minLength
21+
AND a.eventTime BETWEEN :start AND :end
22+
GROUP BY a.memberId
23+
HAVING COUNT(a) >= :minCount
24+
""")
25+
List<Long> findMeaningfulMemberIds(
26+
@Param("start") LocalDateTime start,
27+
@Param("end") LocalDateTime end,
28+
@Param("minLength") int minLength,
29+
@Param("minCount") int minCount);
30+
31+
// 엣지 케이스로 답변 종료시간이 없는 경우도 있을 수 있기에 필터링한다.
32+
List<AdminRetrospectAnswerHistory> findAllByEventTimeBetweenAndAnswerEndTimeIsNotNull(
1733
LocalDateTime startTime, LocalDateTime endTime);
1834

1935
void deleteByMemberIdAndSpaceIdAndRetrospectId(

layer-admin/src/main/java/org/layer/admin/retrospect/service/AdminRetrospectService.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import java.util.List;
99
import java.util.Map;
1010

11+
import org.layer.admin.member.repository.AdminMemberRepository;
12+
import org.layer.admin.retrospect.controller.dto.MeaningfulRetrospectMemberResponse;
1113
import org.layer.admin.retrospect.controller.dto.RetrospectStayTimeResponse;
1214
import org.layer.admin.retrospect.entity.AdminRetrospectAnswerHistory;
1315
import org.layer.admin.retrospect.enums.AnswerTimeRange;
@@ -25,10 +27,21 @@
2527
public class AdminRetrospectService {
2628

2729
private final AdminRetrospectRepository adminRetrospectRepository;
30+
private final AdminMemberRepository adminMemberRepository;
31+
32+
public MeaningfulRetrospectMemberResponse getAllMeaningfulRetrospect(
33+
LocalDateTime startTime, LocalDateTime endTime, int retrospectLength, int retrospectCount) {
34+
List<Long> meaningfulMemberIds = adminRetrospectRepository.findMeaningfulMemberIds(
35+
startTime, endTime, retrospectLength, retrospectCount);
36+
37+
long totalMemberCount = adminMemberRepository.count();
38+
39+
return new MeaningfulRetrospectMemberResponse(meaningfulMemberIds.size(), totalMemberCount);
40+
}
2841

2942
public List<RetrospectStayTimeResponse> getAllRetrospectStayTime(
3043
LocalDateTime startTime, LocalDateTime endTime) {
31-
List<AdminRetrospectAnswerHistory> retrospectAnswerHistories = adminRetrospectRepository.findAllByEventTimeBetween(
44+
List<AdminRetrospectAnswerHistory> retrospectAnswerHistories = adminRetrospectRepository.findAllByEventTimeBetweenAndAnswerEndTimeIsNotNull(
3245
startTime, endTime);
3346

3447
Map<AnswerTimeRange, Long> countMap = new HashMap<>();

0 commit comments

Comments
 (0)