Skip to content

Commit 496f03a

Browse files
authored
feat: 방치율 조회 기능 (#433)
* chore: 이름 변경으로 인한 삭제 * feat: 노출수, 클릭수 엔티티 분리 * refactor: 노출수, 클릭수 엔티티 분리에 따른 이벤트 추가 * feat: 노출수, 클릭수 저장로직 구현 * feat: 진행중인 회고 관련 CTR 조회 기능 구현 * feat: 진행중인 스페이스 관련 CTR 조회 기능 구현 * feat: 기존에 사용했던 엔티티들 어드민 모듈에 하드카피 * feat: dto 정의 * feat: 방치율 조회 기능 구현 * chore: 기존에 있는 테이블 조회를 위한 수정
1 parent 40b99c7 commit 496f03a

File tree

38 files changed

+760
-66
lines changed

38 files changed

+760
-66
lines changed

layer-admin/src/main/java/org/layer/admin/common/CommonController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import org.layer.admin.member.repository.AdminMemberRepository;
44
import org.layer.admin.retrospect.repository.AdminRetrospectAnswerRepository;
5-
import org.layer.admin.retrospect.repository.AdminRetrospectRepository;
5+
import org.layer.admin.retrospect.repository.AdminRetrospectHistoryRepository;
66
import org.layer.admin.space.repository.AdminSpaceRepository;
77
import org.springframework.http.ResponseEntity;
88
import org.springframework.web.bind.annotation.GetMapping;
@@ -17,7 +17,7 @@ public class CommonController {
1717
// 간단한 기능이기에 바로 repository를 사용합니다.
1818
private final AdminMemberRepository adminMemberRepository;
1919
private final AdminSpaceRepository adminSpaceRepository;
20-
private final AdminRetrospectRepository adminRetrospectRepository;
20+
private final AdminRetrospectHistoryRepository adminRetrospectHistoryRepository;
2121
private final AdminRetrospectAnswerRepository adminRetrospectAnswerRepository;
2222

2323

@@ -28,7 +28,7 @@ public ResponseEntity<OutlineResponse> getOutline() {
2828
new OutlineResponse(
2929
adminMemberRepository.count(),
3030
adminSpaceRepository.count(),
31-
adminRetrospectRepository.count(),
31+
adminRetrospectHistoryRepository.count(),
3232
adminRetrospectAnswerRepository.count()
3333
)
3434
);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.layer.admin.retrospect.controller.dto.RetrospectRetentionResponse;
1010
import org.layer.admin.retrospect.controller.dto.RetrospectStayTimeResponse;
1111
import org.layer.admin.retrospect.service.AdminRetrospectService;
12+
import org.layer.admin.retrospect.controller.dto.ProceedingRetrospectCTRAverageResponse;
1213
import org.springframework.http.ResponseEntity;
1314
import org.springframework.web.bind.annotation.GetMapping;
1415
import org.springframework.web.bind.annotation.RequestParam;
@@ -74,4 +75,13 @@ public ResponseEntity<RetrospectCompletionRateResponse> getRetrospectCompletionR
7475
endDate);
7576
return ResponseEntity.ok().body(response);
7677
}
78+
79+
@GetMapping("/admin/retrospect/ctr/proceeding")
80+
public ResponseEntity<ProceedingRetrospectCTRAverageResponse> getProceedingCTR(
81+
@RequestParam(name = "startDate") LocalDateTime startDate,
82+
@RequestParam(name = "endDate") LocalDateTime endDate) {
83+
84+
ProceedingRetrospectCTRAverageResponse response = adminRetrospectService.getProceedingRetrospectCTR(startDate, endDate);
85+
return ResponseEntity.ok().body(response);
86+
}
7787
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.layer.admin.retrospect.controller.dto;
2+
3+
public record ProceedingRetrospectCTRAverageResponse(
4+
double averageCTR
5+
) {}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.layer.admin.retrospect.entity;
2+
3+
import java.time.LocalDateTime;
4+
5+
import org.layer.admin.retrospect.enums.AdminAnalysisStatus;
6+
import org.layer.admin.retrospect.enums.AdminRetrospectStatus;
7+
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.EnumType;
10+
import jakarta.persistence.Enumerated;
11+
import jakarta.persistence.GeneratedValue;
12+
import jakarta.persistence.GenerationType;
13+
import jakarta.persistence.Id;
14+
import jakarta.persistence.Table;
15+
import jakarta.validation.constraints.NotNull;
16+
import lombok.AccessLevel;
17+
import lombok.Builder;
18+
import lombok.Getter;
19+
import lombok.NoArgsConstructor;
20+
21+
@Getter
22+
@Entity
23+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
24+
@Table(name = "retrospect")
25+
public class AdminRetrospect {
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
private Long id;
29+
30+
private LocalDateTime createdAt;
31+
32+
private LocalDateTime updatedAt;
33+
34+
@NotNull
35+
private Long spaceId;
36+
37+
@NotNull
38+
private String title;
39+
40+
@NotNull
41+
private String introduction;
42+
43+
@NotNull
44+
@Enumerated(EnumType.STRING)
45+
private AdminRetrospectStatus retrospectStatus;
46+
47+
@NotNull
48+
@Enumerated(EnumType.STRING)
49+
private AdminAnalysisStatus analysisStatus;
50+
51+
private LocalDateTime deadline;
52+
53+
@Builder
54+
public AdminRetrospect(Long spaceId, String title, String introduction, AdminRetrospectStatus retrospectStatus,
55+
AdminAnalysisStatus analysisStatus, LocalDateTime deadline) {
56+
this.spaceId = spaceId;
57+
this.title = title;
58+
this.introduction = introduction;
59+
this.retrospectStatus = retrospectStatus;
60+
this.analysisStatus = analysisStatus;
61+
this.deadline = deadline;
62+
}
63+
}

layer-admin/src/main/java/org/layer/admin/retrospect/entity/AdminRetrospectImpressionClick.java renamed to layer-admin/src/main/java/org/layer/admin/retrospect/entity/AdminRetrospectClick.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
@Entity
2424
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2525
@Getter
26-
public class AdminRetrospectImpressionClick {
26+
public class AdminRetrospectClick {
2727
@Id
2828
@GeneratedValue(strategy = GenerationType.IDENTITY)
2929
private Long id;
@@ -48,7 +48,7 @@ public class AdminRetrospectImpressionClick {
4848
private AdminRetrospectStatus retrospectStatus;
4949

5050
@Builder
51-
private AdminRetrospectImpressionClick(
51+
private AdminRetrospectClick(
5252
LocalDateTime eventTime,
5353
Long memberId,
5454
String eventId,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.layer.admin.retrospect.entity;
2+
3+
import java.time.LocalDateTime;
4+
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import jakarta.validation.constraints.NotNull;
10+
import lombok.AccessLevel;
11+
import lombok.Builder;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@Entity
16+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
17+
@Getter
18+
public class AdminRetrospectImpression {
19+
@Id
20+
@GeneratedValue(strategy = GenerationType.IDENTITY)
21+
private Long id;
22+
23+
@NotNull
24+
private LocalDateTime eventTime;
25+
26+
@NotNull
27+
private Long memberId;
28+
29+
@NotNull
30+
private String eventId;
31+
32+
@Builder
33+
private AdminRetrospectImpression(
34+
LocalDateTime eventTime,
35+
Long memberId,
36+
String eventId
37+
) {
38+
this.eventTime = eventTime;
39+
this.memberId = memberId;
40+
this.eventId = eventId;
41+
}
42+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.layer.admin.retrospect.enums;
2+
3+
public enum AdminAnalysisStatus {
4+
PROCEEDING, DONE
5+
}

layer-admin/src/main/java/org/layer/admin/retrospect/listener/RetrospectClickEventListener.java renamed to layer-admin/src/main/java/org/layer/admin/retrospect/listener/RetrospectImpressionClickEventListener.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,26 @@
33
import org.layer.admin.common.UserOnlyEventListener;
44
import org.layer.admin.retrospect.service.AdminRetrospectService;
55
import org.layer.event.retrospect.ClickRetrospectEvent;
6+
import org.layer.event.retrospect.ImpressionRetrospectEvent;
67
import org.springframework.context.event.EventListener;
78
import org.springframework.stereotype.Component;
89

910
import lombok.RequiredArgsConstructor;
1011

1112
@Component
1213
@RequiredArgsConstructor
13-
public class RetrospectClickEventListener {
14+
public class RetrospectImpressionClickEventListener {
1415
private final AdminRetrospectService adminRetrospectService;
1516

17+
@UserOnlyEventListener
18+
@EventListener
19+
public void handleImpressionRetrospectEvent(ImpressionRetrospectEvent event) {
20+
adminRetrospectService.saveRetrospectImpression(event);
21+
}
22+
1623
@UserOnlyEventListener
1724
@EventListener
1825
public void handleClickRetrospectEvent(ClickRetrospectEvent event) {
19-
adminRetrospectService.saveRetrospectImpressionClick(event);
26+
adminRetrospectService.saveRetrospectClick(event);
2027
}
2128
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.layer.admin.retrospect.repository;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.List;
5+
6+
import org.layer.admin.retrospect.entity.AdminRetrospectClick;
7+
import org.layer.admin.retrospect.repository.dto.ProceedingRetrospectClickDto;
8+
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
10+
import org.springframework.data.repository.query.Param;
11+
12+
public interface AdminRetrospectClickRepository extends JpaRepository<AdminRetrospectClick, Long> {
13+
14+
@Query("""
15+
SELECT new org.layer.admin.retrospect.repository.dto.ProceedingRetrospectClickDto(
16+
a.memberId,
17+
COUNT(a),
18+
SUM(CASE WHEN a.retrospectStatus = 'PROCEEDING' THEN 1 ELSE 0 END)
19+
)
20+
FROM AdminRetrospectClick a
21+
WHERE a.eventTime BETWEEN :startDate AND :endDate
22+
GROUP BY a.memberId
23+
""")
24+
List<ProceedingRetrospectClickDto> findProceedingRetrospectCTRGroupByMember(
25+
@Param("startDate") LocalDateTime startDate,
26+
@Param("endDate") LocalDateTime endDate);
27+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.layer.admin.retrospect.repository;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.List;
5+
6+
import org.layer.admin.retrospect.entity.AdminRetrospectHistory;
7+
import org.layer.admin.retrospect.repository.dto.SpaceRetrospectCountDto;
8+
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
10+
import org.springframework.data.repository.query.Param;
11+
12+
public interface AdminRetrospectHistoryRepository extends JpaRepository<AdminRetrospectHistory, Long> {
13+
List<AdminRetrospectHistory> findAllByEventTimeBetween(LocalDateTime startTime, LocalDateTime endTime);
14+
15+
List<AdminRetrospectHistory> findAllByEventTimeBefore(LocalDateTime time);
16+
17+
@Query("SELECT new org.layer.admin.retrospect.repository.dto.SpaceRetrospectCountDto(m.spaceId, COUNT(m)) " +
18+
"FROM AdminRetrospectHistory m " +
19+
"WHERE m.eventTime BETWEEN :startTime AND :endTime " +
20+
"GROUP BY m.spaceId ")
21+
List<SpaceRetrospectCountDto> findRetrospectCountGroupedBySpaceWithPeriod(
22+
@Param("startTime") LocalDateTime startTime,
23+
@Param("endTime") LocalDateTime endTime
24+
);
25+
26+
27+
28+
}

0 commit comments

Comments
 (0)