Skip to content

Commit 40b99c7

Browse files
authored
[admin] feat: 회고 관련 CTR 저장 로직 구현 (#431)
* feat: 회고 관련 CTR 기능을 위한 엔티티 구현 * chore: 검증 도메인 로직 이름 수정 * chore: 검증 도메인 로직 이름 수정 * feat: 스페이스 관련 CTR 기능 구현 * feat: 회고 관련 CTR 기능 구현 * docs: 스웨거 태그 이름 수정 * feat: CTR 이벤트에 대한 저장 로직 구현
1 parent a408ead commit 40b99c7

File tree

21 files changed

+417
-19
lines changed

21 files changed

+417
-19
lines changed
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 AdminRetrospectImpressionClick {
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 AdminRetrospectImpressionClick(
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: 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: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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.springframework.context.event.EventListener;
7+
import org.springframework.stereotype.Component;
8+
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Component
12+
@RequiredArgsConstructor
13+
public class RetrospectClickEventListener {
14+
private final AdminRetrospectService adminRetrospectService;
15+
16+
@UserOnlyEventListener
17+
@EventListener
18+
public void handleClickRetrospectEvent(ClickRetrospectEvent event) {
19+
adminRetrospectService.saveRetrospectImpressionClick(event);
20+
}
21+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.layer.admin.retrospect.repository;
2+
3+
import org.layer.admin.retrospect.entity.AdminRetrospectImpressionClick;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface AdminRetrospectImpressionClickRepository extends JpaRepository<AdminRetrospectImpressionClick, Long> {
7+
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@
2323
import org.layer.admin.retrospect.controller.dto.RetrospectStayTimeResponse;
2424
import org.layer.admin.retrospect.entity.AdminRetrospectAnswerHistory;
2525
import org.layer.admin.retrospect.entity.AdminRetrospectHistory;
26+
import org.layer.admin.retrospect.entity.AdminRetrospectImpressionClick;
27+
import org.layer.admin.retrospect.enums.AdminRetrospectStatus;
2628
import org.layer.admin.retrospect.enums.AnswerTimeRange;
2729
import org.layer.admin.retrospect.repository.AdminRetrospectAnswerRepository;
30+
import org.layer.admin.retrospect.repository.AdminRetrospectImpressionClickRepository;
2831
import org.layer.admin.retrospect.repository.AdminRetrospectRepository;
2932
import org.layer.admin.retrospect.repository.dto.RetrospectAnswerCompletionDto;
3033
import org.layer.admin.retrospect.repository.dto.SpaceRetrospectCountDto;
3134
import org.layer.admin.space.repository.AdminSpaceRepository;
35+
import org.layer.event.retrospect.ClickRetrospectEvent;
3236
import org.layer.event.retrospect.CreateRetrospectEvent;
3337
import org.layer.event.retrospect.AnswerRetrospectEndEvent;
3438
import org.layer.event.retrospect.AnswerRetrospectStartEvent;
@@ -44,6 +48,7 @@ public class AdminRetrospectService {
4448

4549
private final AdminRetrospectRepository adminRetrospectRepository;
4650
private final AdminRetrospectAnswerRepository adminRetrospectAnswerRepository;
51+
private final AdminRetrospectImpressionClickRepository adminRetrospectImpressionClickRepository;
4752
private final AdminMemberRepository adminMemberRepository;
4853
private final AdminSpaceRepository adminSpaceRepository;
4954

@@ -266,4 +271,20 @@ public void saveRetrospectHistory(CreateRetrospectEvent event) {
266271

267272
adminRetrospectRepository.save(retrospectHistory);
268273
}
274+
275+
@Transactional(propagation = REQUIRES_NEW)
276+
@Async
277+
public void saveRetrospectImpressionClick(ClickRetrospectEvent event) {
278+
279+
AdminRetrospectImpressionClick clickEvent = AdminRetrospectImpressionClick.builder()
280+
.eventTime(event.eventTime())
281+
.memberId(event.memberId())
282+
.eventId(event.eventId())
283+
.spaceId(event.spaceId())
284+
.retrospectId(event.retrospectId())
285+
.retrospectStatus(AdminRetrospectStatus.from(event.retrospectStatus()))
286+
.build();
287+
288+
adminRetrospectImpressionClickRepository.save(clickEvent);
289+
}
269290
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.layer.admin.space.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 AdminSpaceImpressionClick {
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+
@Enumerated(value = EnumType.STRING)
45+
private AdminRetrospectStatus retrospectStatus;
46+
47+
@Builder
48+
private AdminSpaceImpressionClick(
49+
LocalDateTime eventTime,
50+
Long memberId,
51+
String eventId,
52+
Long spaceId,
53+
AdminRetrospectStatus retrospectStatus
54+
) {
55+
this.eventTime = eventTime;
56+
this.memberId = memberId;
57+
this.eventId = eventId;
58+
this.spaceId = spaceId;
59+
this.retrospectStatus = retrospectStatus;
60+
}
61+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.layer.admin.space.listener;
2+
3+
import org.layer.admin.common.UserOnlyEventListener;
4+
import org.layer.admin.space.service.AdminSpaceService;
5+
import org.layer.event.space.ClickSpaceEvent;
6+
import org.springframework.context.event.EventListener;
7+
import org.springframework.stereotype.Component;
8+
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Component
12+
@RequiredArgsConstructor
13+
public class SpaceClickEventListener {
14+
private final AdminSpaceService adminSpaceService;
15+
16+
@UserOnlyEventListener
17+
@EventListener
18+
public void handleClickSpaceEvent(ClickSpaceEvent event) {
19+
adminSpaceService.saveSpaceImpressionClick(event);
20+
}
21+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.layer.admin.space.repository;
2+
3+
import org.layer.admin.space.entity.AdminSpaceImpressionClick;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface AdminSpaceImpressionClickRepository extends JpaRepository<AdminSpaceImpressionClick, Long> {
7+
}

layer-admin/src/main/java/org/layer/admin/space/service/AdminSpaceService.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55
import java.time.LocalDateTime;
66
import java.util.List;
77

8+
import org.layer.admin.retrospect.enums.AdminRetrospectStatus;
89
import org.layer.admin.space.controller.dto.SpaceCountResponse;
910
import org.layer.admin.space.controller.dto.TeamSpaceRatioPerMemberDto;
1011
import org.layer.admin.space.controller.dto.TeamSpaceRatioResponse;
1112
import org.layer.admin.space.entity.AdminMemberSpaceHistory;
1213
import org.layer.admin.space.entity.AdminSpaceHistory;
14+
import org.layer.admin.space.entity.AdminSpaceImpressionClick;
1315
import org.layer.admin.space.enums.AdminSpaceCategory;
1416
import org.layer.admin.space.repository.AdminMemberSpaceRepository;
17+
import org.layer.admin.space.repository.AdminSpaceImpressionClickRepository;
1518
import org.layer.admin.space.repository.AdminSpaceRepository;
19+
import org.layer.event.space.ClickSpaceEvent;
1620
import org.layer.event.space.CreateSpaceEvent;
1721
import org.layer.event.space.JoinSpaceEvent;
1822
import org.layer.event.space.LeaveSpaceEvent;
@@ -30,6 +34,7 @@ public class AdminSpaceService {
3034

3135
private final AdminSpaceRepository adminSpaceRepository;
3236
private final AdminMemberSpaceRepository adminMemberSpaceRepository;
37+
private final AdminSpaceImpressionClickRepository adminSpaceImpressionClickRepository;
3338

3439
public List<SpaceCountResponse> getSpaceCount(LocalDateTime startDate, LocalDateTime endDate) {
3540
return adminSpaceRepository.findAllByCategory(startDate, endDate);
@@ -84,4 +89,18 @@ public void deleteMemberSpaceHistory(LeaveSpaceEvent event) {
8489
adminMemberSpaceRepository.deleteByMemberIdAndSpaceId(
8590
event.memberId(), event.spaceId());
8691
}
92+
93+
@Transactional(propagation = REQUIRES_NEW)
94+
@Async
95+
public void saveSpaceImpressionClick(ClickSpaceEvent event) {
96+
AdminSpaceImpressionClick impressionClick = AdminSpaceImpressionClick.builder()
97+
.eventId(event.eventId())
98+
.eventTime(event.eventTime())
99+
.memberId(event.memberId())
100+
.spaceId(event.spaceId())
101+
.retrospectStatus(AdminRetrospectStatus.from(event.retrospectStatus()))
102+
.build();
103+
104+
adminSpaceImpressionClickRepository.save(impressionClick);
105+
}
87106
}

layer-api/src/main/java/org/layer/domain/answer/service/AnswerService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ public TemporaryAnswerListResponse getTemporaryAnswer(Long spaceId, Long retrosp
175175
team.validateTeamMembership(memberId);
176176

177177
Retrospect retrospect = retrospectRepository.findByIdOrThrow(retrospectId);
178-
retrospect.isProceedingRetrospect();
178+
retrospect.validateProceedingRetrospect();
179179

180180
// 임시 답변을 했는지 검증
181181
Answers answers = new Answers(
@@ -233,7 +233,7 @@ public List<WrittenAnswerGetResponse> getWrittenAnswer(Long spaceId, Long retros
233233
team.validateTeamMembership(memberId);
234234

235235
Retrospect retrospect = retrospectRepository.findByIdOrThrow(retrospectId);
236-
retrospect.isProceedingRetrospect();
236+
retrospect.validateProceedingRetrospect();
237237

238238
// 완료된 답변 검증
239239
Answers answers = new Answers(

0 commit comments

Comments
 (0)