Skip to content

Commit 0e38ea5

Browse files
authored
feat: 알람 고도화 작업
# 변경점 👍 close: #56 알람 고도화 작업을 완료했습니다. 1. 구독을 추가할 경우 구독 대상에게 알림 2. 구독한 사람이 다이어리를 올릴 경우 알림 (PRIVATE DIARY는 제외) 3. AlarmResponse에 알람생성일자 추가 4. diaryId기반 조회 api 추가
1 parent 8266787 commit 0e38ea5

18 files changed

Lines changed: 193 additions & 16 deletions

src/main/java/apptive/team5/alarm/dto/AlarmResponse.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,23 @@
33

44
import apptive.team5.alarm.entity.Alarm;
55

6+
import java.time.LocalDateTime;
7+
68
public record AlarmResponse(
79
Long alarmId,
810
String title,
911
String content,
10-
String deepLink
12+
String deepLink,
13+
LocalDateTime createDate
1114
) {
1215

1316
public AlarmResponse(Alarm alarm) {
1417
this(
1518
alarm.getId(),
1619
alarm.getTitle(),
1720
alarm.getContent(),
18-
alarm.getDeepLink()
21+
alarm.getDeepLink(),
22+
alarm.getCreateDateTime()
1923
);
2024
}
2125
}

src/main/java/apptive/team5/alarm/dto/AlarmSendRequest.java renamed to src/main/java/apptive/team5/alarm/dto/DiaryCreateAlarmSendRequest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package apptive.team5.alarm.dto;
22

3-
import apptive.team5.user.domain.UserEntity;
4-
5-
public record AlarmSendRequest(
3+
public record DiaryCreateAlarmSendRequest(
64
Long diaryId,
75
Long actorId
86
) {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package apptive.team5.alarm.dto;
2+
3+
public record DiaryLikeAlarmSendRequest(
4+
Long diaryId,
5+
Long actorId
6+
) {
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package apptive.team5.alarm.dto;
2+
3+
public record SubscribeAlarmSendRequest(
4+
Long subscribedToUserId,
5+
Long subscriberId
6+
) {
7+
}

src/main/java/apptive/team5/alarm/entity/AlarmMessage.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
@Getter
66
public enum AlarmMessage {
77

8-
LIKE_ALARM("킬링파트에 좋아요가 도착했어요");
8+
LIKE_ALARM("킬링파트에 좋아요가 도착했어요"),
9+
SUBSCRIBE_ALARM("새로운 구독자가 생겼어요"),
10+
DIARY_ALARM("새로운 킬링파트 등록됐어요");
911

1012
private final String message;
1113

src/main/java/apptive/team5/alarm/service/AlarmDispatchService.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package apptive.team5.alarm.service;
22

3-
import apptive.team5.alarm.dto.AlarmSendRequest;
3+
import apptive.team5.alarm.dto.DiaryCreateAlarmSendRequest;
4+
import apptive.team5.alarm.dto.DiaryLikeAlarmSendRequest;
5+
import apptive.team5.alarm.dto.SubscribeAlarmSendRequest;
46
import apptive.team5.alarm.entity.Alarm;
57
import apptive.team5.alarm.entity.AlarmMessage;
68
import apptive.team5.alarm.event.AlarmCreatedEvent;
79
import apptive.team5.diary.domain.DiaryEntity;
810
import apptive.team5.diary.service.DiaryLowService;
11+
import apptive.team5.subscribe.domain.Subscribe;
12+
import apptive.team5.subscribe.service.SubscribeLowService;
913
import apptive.team5.user.domain.UserEntity;
1014
import apptive.team5.user.service.UserLowService;
1115
import lombok.RequiredArgsConstructor;
@@ -14,20 +18,24 @@
1418
import org.springframework.stereotype.Service;
1519
import org.springframework.transaction.annotation.Transactional;
1620

21+
import java.util.List;
22+
1723
@Service
1824
@Transactional
1925
@RequiredArgsConstructor
2026
public class AlarmDispatchService {
2127

22-
private static final String DIARY_DEEP_LINK_FORMAT = "/diaries/%d";
28+
private static final String DIARY_DEEP_LINK_FORMAT = "/api/diaries/%d";
29+
private static final String SUBSCRIBE_DEEP_LINK_FORMAT = "/api/subscribes/%d/fans";
2330

2431
private final AlarmLowService alarmLowService;
2532
private final DiaryLowService diaryLowService;
2633
private final UserLowService userLowService;
2734
private final ApplicationEventPublisher eventPublisher;
35+
private final SubscribeLowService subscribeLowService;
2836

2937
@Async("sendAlarm")
30-
public void saveAndDispatchForLike(AlarmSendRequest request) {
38+
public void saveAndDispatchForLike(DiaryLikeAlarmSendRequest request) {
3139

3240
Long actorId = request.actorId();
3341
UserEntity actor = userLowService.findById(actorId);
@@ -38,6 +46,37 @@ public void saveAndDispatchForLike(AlarmSendRequest request) {
3846
String content = actor.getUsername() + "님이 회원님의 킬링파트를 좋아합니다.";
3947
String deepLink = DIARY_DEEP_LINK_FORMAT.formatted(diary.getId());
4048

49+
saveAndPublish(receiver, title, content, deepLink);
50+
}
51+
52+
@Async("sendAlarm")
53+
public void saveAndDispatchForSubscribe(SubscribeAlarmSendRequest request) {
54+
UserEntity subscriber = userLowService.findById(request.subscriberId());
55+
UserEntity receiver = userLowService.findById(request.subscribedToUserId());
56+
57+
String title = AlarmMessage.SUBSCRIBE_ALARM.getMessage();
58+
String content = subscriber.getUsername() + "님이 회원님을 픽했어요.";
59+
String deepLink = SUBSCRIBE_DEEP_LINK_FORMAT.formatted(receiver.getId());
60+
61+
saveAndPublish(receiver, title, content, deepLink);
62+
}
63+
64+
@Async("sendAlarm")
65+
public void saveAndDispatchForDiaryCreate(DiaryCreateAlarmSendRequest request) {
66+
UserEntity actor = userLowService.findById(request.actorId());
67+
List<Subscribe> subscribers = subscribeLowService.findBySubscribedToId(actor.getId());
68+
69+
70+
String title = AlarmMessage.DIARY_ALARM.getMessage();
71+
String content = actor.getUsername() + "님이 새 킬링파트를 등록했어요.";
72+
String deepLink = DIARY_DEEP_LINK_FORMAT.formatted(request.diaryId());
73+
74+
75+
subscribers.forEach(subscriber ->
76+
saveAndPublish(subscriber.getSubscriber(), title, content, deepLink));
77+
}
78+
79+
private void saveAndPublish(UserEntity receiver, String title, String content, String deepLink) {
4180
alarmLowService.save(new Alarm(
4281
title,
4382
content,

src/main/java/apptive/team5/diary/controller/DiaryController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package apptive.team5.diary.controller;
22

3+
import apptive.team5.alarm.dto.DiaryCreateAlarmSendRequest;
4+
import apptive.team5.alarm.service.AlarmDispatchService;
35
import apptive.team5.diary.domain.DiaryEntity;
6+
import apptive.team5.diary.domain.DiaryScope;
47
import apptive.team5.diary.dto.*;
58
import apptive.team5.diary.service.DiaryService;
69
import jakarta.validation.Valid;
@@ -23,6 +26,7 @@
2326
public class DiaryController {
2427

2528
private final DiaryService diaryService;
29+
private final AlarmDispatchService alarmDispatchService;
2630

2731
@GetMapping("/my")
2832
public ResponseEntity<Page<MyDiaryResponseDto>> getMyMusicDiary(
@@ -69,6 +73,17 @@ public ResponseEntity<Page<UserDiaryResponseDto>> getUserDiaries(
6973
return ResponseEntity.status(HttpStatus.OK).body(response);
7074
}
7175

76+
@GetMapping("/{diaryId}")
77+
public ResponseEntity<UserDiaryResponseDto> getDiary(
78+
@PathVariable
79+
Long diaryId,
80+
@AuthenticationPrincipal
81+
Long userId
82+
) {
83+
UserDiaryResponseDto response = diaryService.getDiary(diaryId, userId);
84+
return ResponseEntity.status(HttpStatus.OK).body(response);
85+
}
86+
7287
@GetMapping("/my/calendar")
7388
public ResponseEntity<List<CalendarDiaryResponseDto>> getMyDiariesByPeriod(
7489
@AuthenticationPrincipal
@@ -86,6 +101,8 @@ public ResponseEntity<List<CalendarDiaryResponseDto>> getMyDiariesByPeriod(
86101
public ResponseEntity<Void> createDiary(@AuthenticationPrincipal Long userId, @Valid @RequestBody DiaryCreateRequest diaryRequest) {
87102
DiaryEntity diary = diaryService.createDiary(userId, diaryRequest);
88103

104+
if(!diary.getScope().equals(DiaryScope.PRIVATE)) alarmDispatchService.saveAndDispatchForDiaryCreate(new DiaryCreateAlarmSendRequest(diary.getId(), userId));
105+
89106
return ResponseEntity.status(HttpStatus.CREATED).location(URI.create("/api/diaries/" + diary.getId())).build();
90107
}
91108

src/main/java/apptive/team5/diary/controller/DiaryLikeController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package apptive.team5.diary.controller;
22

3-
import apptive.team5.alarm.dto.AlarmSendRequest;
4-
import apptive.team5.alarm.entity.AlarmMessage;
3+
import apptive.team5.alarm.dto.DiaryLikeAlarmSendRequest;
54
import apptive.team5.alarm.service.AlarmDispatchService;
65
import apptive.team5.diary.dto.DiaryLikeResponseDto;
76
import apptive.team5.diary.service.DiaryLikeService;
@@ -31,7 +30,7 @@ public ResponseEntity<DiaryLikeResponseDto> toggleDiaryLike(
3130
) {
3231
DiaryLikeResponseDto responseDto = diaryLikeService.toggleDiaryLike(userId, diaryId);
3332

34-
if (responseDto.isLiked()) alarmDispatchService.saveAndDispatchForLike(new AlarmSendRequest(
33+
if (responseDto.isLiked()) alarmDispatchService.saveAndDispatchForLike(new DiaryLikeAlarmSendRequest(
3534
diaryId,
3635
userId
3736
));

src/main/java/apptive/team5/diary/service/DiaryLikeService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package apptive.team5.diary.service;
22

3-
import apptive.team5.alarm.dto.AlarmSendRequest;
4-
import apptive.team5.alarm.service.AlarmDispatchService;
53
import apptive.team5.diary.domain.DiaryEntity;
64
import apptive.team5.diary.domain.DiaryLikeEntity;
75
import apptive.team5.diary.dto.DiaryLikeResponseDto;

src/main/java/apptive/team5/diary/service/DiaryService.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ public Page<UserDiaryResponseDto> getUserDiaries(Long targetUserId, Long current
8080
return getDiaryResponseDtoPage(currentUserId, diaryPage, UserDiaryResponseDto::from);
8181
}
8282

83+
@Transactional(readOnly = true)
84+
public UserDiaryResponseDto getDiary(Long diaryId, Long currentUserId) {
85+
DiaryEntity foundDiary = diaryLowService.findDiaryById(diaryId);
86+
return getDiaryResponseDto(currentUserId, foundDiary, UserDiaryResponseDto::from);
87+
}
88+
8389
@Transactional(readOnly = true)
8490
public List<CalendarDiaryResponseDto> getMyDiariesByPeriod(Long userId, LocalDate startDate, LocalDate endDate) {
8591
LocalDateTime startDateTime = startDate.atStartOfDay();
@@ -194,6 +200,21 @@ private <T extends DiaryResponseDto> List<T> getDiaryResponseDtoList(Long userId
194200
);
195201
}
196202

203+
private <T extends DiaryResponseDto> T getDiaryResponseDto(Long userId, DiaryEntity diary, DiaryResponseMapper.DiaryResponseDtoMapper<T> mapper) {
204+
Long diaryId = diary.getId();
205+
Set<Long> likedDiaryIds = diaryLikeLowService.findLikedDiaryIdsByUser(userId, List.of(diaryId));
206+
Map<Long, Long> likeCountsMap = diaryLikeLowService.findLikeCountsByDiaryIds(List.of(diaryId));
207+
Set<Long> storedDiaryIds = diaryStoreLowService.findStoredDiaryIdsByUser(userId, List.of(diaryId));
208+
209+
return mapper.map(
210+
diary,
211+
likedDiaryIds.contains(diaryId),
212+
storedDiaryIds.contains(diaryId),
213+
likeCountsMap.getOrDefault(diaryId, 0L),
214+
userId
215+
);
216+
}
217+
197218
private Page<DiaryEntity> getSortedDiaries(Pageable pageable, Optional<DiaryOrderEntity> optionalDiaryOrder, UserEntity foundUser) {
198219
Page<DiaryEntity> diaryPage;
199220

0 commit comments

Comments
 (0)