Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 미션 독려 알림 구현 #100

Merged
merged 6 commits into from
Nov 20, 2024
Merged

Conversation

kimyu0218
Copy link
Collaborator

Issue Number

close: #

작업 개요

(#84)
미션 완료 후 7일간 아무런 미션에 참여하지 않거나 생성하지 않은 경우, 스케줄러를 통해 독려 푸시 알림을 전송합니다.

작업 사항

  • MissionRetryPushJob을 만들고 15시에 실행하도록 만들었습니다. (다른 알림과 달리 언제 보내야 한다는 요구사항이 없어 15시로 작성했습니다)
  • MissionMember의 상태가 COMPLETED로 변경될 때, redis에 멤버의 디바이스 토큰을 ttl을 걸어 저장했습니다.
    • key: mission_retry_message:[PUSH_DATE]:[MEMBER_ID]
    • value: 디바이스 토큰
    • ttl: 8일 (7일 후 알림이므로 +1일 후 삭제하도록 구현)
  • 멤버가 미션에 join하는 경우, cancelRetryMessage를 통해 등록한 key-value쌍을 삭제합니다.

고민한 점들(필수 X)

여기에 작성하세요

스크린샷(필수 X)

여기에 작성하세요

@kimyu0218 kimyu0218 requested a review from songyi00 as a code owner November 19, 2024 15:28
Comment on lines +35 to +42
default long getDaysAfterMissionCompletion(final Long memberId) {
Optional<MissionMember> missionMember = findTop1ByMemberIdOrderByUpdatedAtDesc(memberId);
if (missionMember.isEmpty() || !missionMember.get().isCompleted()) {
return 0L;
}
Duration duration = Duration.between(LocalDateTime.now(), missionMember.get().getUpdatedAt());
return duration.toDays();
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금 사용하는 부분은 아닌데
저번 회의에서 미션 끝난 지 N일 째 같은 카운트가 있어서 만들어 봤습니당

Copy link
Member

@songyi00 songyi00 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레디스 TTL로 푸시 제어하는거 좋다 👍
고생많았오 !!

public void save(String memberId, String deviceToken, long ttl) {
LocalDate pushDate = computePushDate();
String key = makeKey(pushDate, memberId);
redisTemplate.opsForValue().set(key, deviceToken, Duration.ofMillis(ttl));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

7일 내에 디바이스 토큰이 변경될 일은 없을까?!

missionMembers.forEach(missionMember -> {
missionMember.updateMissionStatus(mission, memberCount);
Member member = missionMember.getMember();
if (missionMember.isCompleted() && member.getDeviceToken() != null) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missionMember.member.deviceToken 이렇게 접근하면 쿼리 �N+1 문제 있을 것 같아서 벌크로 조회한 후에 매핑해주는건 어때?
추가로 만약 알림 비활성화 여부 필드 생기면 디바이스 토큰 null 체크 조건문 변경 필요하겠습니당

@kimyu0218
Copy link
Collaborator Author

다른 PR에서 리뷰 내용 반영하도록 하겠습니다!!

@kimyu0218 kimyu0218 merged commit ba0c475 into develop Nov 20, 2024
1 check passed
@kimyu0218 kimyu0218 deleted the feat/#84-fcm-push-retry-message branch November 20, 2024 13:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants