Skip to content

Commit 6e1f934

Browse files
authored
Merge pull request #434 from depromeet/develop
v1.4.1
2 parents b293aee + a532d55 commit 6e1f934

File tree

58 files changed

+1149
-142
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1149
-142
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+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.layer.admin.retrospect.entity;
2+
3+
import java.time.LocalDateTime;
4+
5+
import org.layer.admin.retrospect.enums.AdminRetrospectStatus;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.EnumType;
9+
import jakarta.persistence.Enumerated;
10+
import jakarta.persistence.GeneratedValue;
11+
import jakarta.persistence.GenerationType;
12+
import jakarta.persistence.Id;
13+
import jakarta.validation.constraints.NotNull;
14+
import lombok.AccessLevel;
15+
import lombok.Builder;
16+
import lombok.Getter;
17+
import lombok.NoArgsConstructor;
18+
19+
/*
20+
* 특정 회고의 클릭 이벤트를 저장하는 엔티티
21+
* 이 엔티티는 회고 클릭 이벤트를 기록하여, 나중에 회고의 클릭 이력을 추적할 수 있도록 합니다.
22+
*/
23+
@Entity
24+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
25+
@Getter
26+
public class AdminRetrospectClick {
27+
@Id
28+
@GeneratedValue(strategy = GenerationType.IDENTITY)
29+
private Long id;
30+
31+
@NotNull
32+
private LocalDateTime eventTime;
33+
34+
@NotNull
35+
private Long memberId;
36+
37+
@NotNull
38+
private String eventId;
39+
40+
@NotNull
41+
private Long spaceId;
42+
43+
@NotNull
44+
private Long retrospectId;
45+
46+
@NotNull
47+
@Enumerated(value = EnumType.STRING)
48+
private AdminRetrospectStatus retrospectStatus;
49+
50+
@Builder
51+
private AdminRetrospectClick(
52+
LocalDateTime eventTime,
53+
Long memberId,
54+
String eventId,
55+
Long spaceId,
56+
Long retrospectId,
57+
AdminRetrospectStatus retrospectStatus
58+
) {
59+
this.eventTime = eventTime;
60+
this.memberId = memberId;
61+
this.eventId = eventId;
62+
this.spaceId = spaceId;
63+
this.retrospectId = retrospectId;
64+
this.retrospectStatus = retrospectStatus;
65+
}
66+
}
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+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.layer.admin.retrospect.enums;
2+
3+
public enum AdminRetrospectStatus {
4+
PROCEEDING, DONE;
5+
6+
public static AdminRetrospectStatus from(String status) {
7+
return AdminRetrospectStatus.valueOf(status.toUpperCase());
8+
}
9+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.layer.admin.retrospect.listener;
2+
3+
import org.layer.admin.common.UserOnlyEventListener;
4+
import org.layer.admin.retrospect.service.AdminRetrospectService;
5+
import org.layer.event.retrospect.ClickRetrospectEvent;
6+
import org.layer.event.retrospect.ImpressionRetrospectEvent;
7+
import org.springframework.context.event.EventListener;
8+
import org.springframework.stereotype.Component;
9+
10+
import lombok.RequiredArgsConstructor;
11+
12+
@Component
13+
@RequiredArgsConstructor
14+
public class RetrospectImpressionClickEventListener {
15+
private final AdminRetrospectService adminRetrospectService;
16+
17+
@UserOnlyEventListener
18+
@EventListener
19+
public void handleImpressionRetrospectEvent(ImpressionRetrospectEvent event) {
20+
adminRetrospectService.saveRetrospectImpression(event);
21+
}
22+
23+
@UserOnlyEventListener
24+
@EventListener
25+
public void handleClickRetrospectEvent(ClickRetrospectEvent event) {
26+
adminRetrospectService.saveRetrospectClick(event);
27+
}
28+
}
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+
}

0 commit comments

Comments
 (0)