Skip to content

Commit 1418e3c

Browse files
committed
feat : 알림 템플릿, 알림 타입 추가 (#80)
1 parent 62bc9c6 commit 1418e3c

File tree

12 files changed

+147
-65
lines changed

12 files changed

+147
-65
lines changed

src/main/java/cmf/commitField/domain/commit/sinceCommit/entity/CommitHistory.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/main/java/cmf/commitField/domain/commit/sinceCommit/repositoty/CommitHistoryRepository.java

Lines changed: 0 additions & 13 deletions
This file was deleted.

src/main/java/cmf/commitField/domain/commit/sinceCommit/service/SinceCommitService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import cmf.commitField.domain.commit.sinceCommit.dto.CommitAnalysisResponseDto;
44
import cmf.commitField.domain.commit.sinceCommit.dto.SinceCommitResponseDto;
5-
import lombok.AllArgsConstructor;
6-
import lombok.NoArgsConstructor;
75
import lombok.RequiredArgsConstructor;
86
import lombok.extern.slf4j.Slf4j;
97
import org.springframework.beans.factory.annotation.Value;

src/main/java/cmf/commitField/domain/noti/noti/entity/Noti.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import cmf.commitField.domain.user.entity.User;
44
import cmf.commitField.global.jpa.BaseEntity;
55
import jakarta.persistence.Entity;
6+
import jakarta.persistence.EnumType;
7+
import jakarta.persistence.Enumerated;
68
import jakarta.persistence.ManyToOne;
79
import lombok.AllArgsConstructor;
810
import lombok.Getter;
911
import lombok.NoArgsConstructor;
1012
import lombok.Setter;
1113
import lombok.experimental.SuperBuilder;
14+
import org.hibernate.annotations.ColumnDefault;
1215

1316
import static lombok.AccessLevel.PROTECTED;
1417

@@ -19,13 +22,16 @@
1922
@Getter
2023
@Setter
2124
public class Noti extends BaseEntity {
25+
@Enumerated(EnumType.STRING)
26+
private NotiType typeCode; // 알림 타입
27+
private NotiDetailType type2Code; // 알림 세부 타입
2228
@ManyToOne
23-
private User actor;
24-
@ManyToOne
25-
private User receiver;
26-
private String relTypeCode;
27-
private long relId;
28-
private String typeCode;
29-
private String type2Code;
30-
private boolean read;
29+
private User receiver; // 알림을 받는 사람
30+
@ColumnDefault("false")
31+
private boolean isRead; // 읽음 상태
32+
private String message; // 알림 메시지
33+
34+
// TODO: 알림이 연결된 객체 어떻게 처리할지 고민 필요.
35+
// private String relTypeCode; // 알림이 연결된 실제 객체 유형
36+
// private long relId; // 알림 객체의 Id
3137
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cmf.commitField.domain.noti.noti.entity;
2+
3+
public enum NotiDetailType {
4+
// 업적
5+
ACHIEVEMENT_COMPLETED, // 업적 달성
6+
7+
// 연속
8+
STREAK_CONTINUED, // 연속 커밋 이어짐
9+
STREAK_BROKEN, // 연속 커밋 끊김
10+
11+
// 시즌
12+
SEASON_START // 시즌 시작
13+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cmf.commitField.domain.noti.noti.entity;
2+
3+
import java.util.Map;
4+
5+
public class NotiMessageTemplates {
6+
// 알림 메시지 템플릿을 저장하는 맵
7+
private static final Map<NotiDetailType, String> TEMPLATES = Map.of(
8+
NotiDetailType.ACHIEVEMENT_COMPLETED, "🎉 {0}님이 '{1}' 업적을 달성했습니다!",
9+
NotiDetailType.STREAK_CONTINUED, "🔥 {0}님의 연속 커밋이 {1}일째 이어지고 있습니다!",
10+
NotiDetailType.STREAK_BROKEN, "😢 {0}님의 연속 커밋 기록이 끊겼습니다. 다음번엔 더 오래 유지해봐요!",
11+
NotiDetailType.SEASON_START, "🚀 새로운 시즌 '{0}'이 시작되었습니다! 랭킹 경쟁을 준비하세요!"
12+
);
13+
14+
// 알림 메시지 템플릿을 반환하는 메서드
15+
public static String getTemplate(NotiDetailType type) {
16+
return TEMPLATES.getOrDefault(type, "알림 메시지가 없습니다.");
17+
}
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cmf.commitField.domain.noti.noti.entity;
2+
3+
public enum NotiType {
4+
RANK, // 랭킹
5+
ACHIEVEMENT, // 업적
6+
ABSENCE, // 부재
7+
STREAK, // 연속
8+
SEASON, // 시즌
9+
NOTICE // 공지
10+
}
Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
11
package cmf.commitField.domain.noti.noti.eventListener;
22

3+
import cmf.commitField.domain.noti.noti.entity.NotiDetailType;
4+
import cmf.commitField.domain.noti.noti.entity.NotiType;
35
import cmf.commitField.domain.noti.noti.service.NotiService;
6+
import cmf.commitField.global.chat.ChatMessageDto;
7+
import cmf.commitField.global.event.CommitHistoryEvent;
48
import lombok.RequiredArgsConstructor;
9+
import org.springframework.kafka.annotation.KafkaListener;
510
import org.springframework.stereotype.Component;
611

712
@Component
813
@RequiredArgsConstructor
914
public class NotiEventListener {
15+
// 이벤트가 호출될 때 실행되는 메서드
16+
// 메서드를 별도의 스레드에서 비동기적으로 실행하도록 만듦
1017
private final NotiService notiService;
1118

12-
// public void listenPost(PostCreatedEvent event){
13-
// notiService.postCreated(event.getPost());
14-
// }
15-
//
16-
// public void consume(ChatMessageDto message){
17-
// System.out.println("Consumed message: " + message);
18-
// }
19-
//
20-
// public void consumeChatRoom1DLT(byte[] in){
21-
// String message = new String(in);
22-
// System.out.println("Failed message: " + message);
23-
// }
19+
// 예시
20+
// CommitHistoryEvent 이벤트가 발생하면 notiService.createCommitStreak() 메서드를 실행
21+
public void listenCommitStreak(CommitHistoryEvent event){
22+
notiService.createCommitStreak(event.getUsername(), NotiType.STREAK, NotiDetailType.STREAK_CONTINUED);
23+
}
24+
25+
@KafkaListener(topics = "chat-room-1", groupId = "1")
26+
public void consume(ChatMessageDto message){
27+
System.out.println("Consumed message: " + message);
28+
}
29+
30+
@KafkaListener(topics = "chat-room-1-dlt", groupId = "1")
31+
public void consumeChatRoom1DLT(byte[] in){
32+
String message = new String(in);
33+
System.out.println("Failed message: " + message);
34+
}
2435
}

src/main/java/cmf/commitField/domain/noti/noti/service/NotiService.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,58 @@
11
package cmf.commitField.domain.noti.noti.service;
22

3+
import cmf.commitField.domain.noti.noti.entity.Noti;
4+
import cmf.commitField.domain.noti.noti.entity.NotiDetailType;
5+
import cmf.commitField.domain.noti.noti.entity.NotiMessageTemplates;
6+
import cmf.commitField.domain.noti.noti.entity.NotiType;
37
import cmf.commitField.domain.noti.noti.repository.NotiRepository;
8+
import cmf.commitField.domain.user.entity.User;
9+
import cmf.commitField.domain.user.repository.UserRepository;
10+
import cmf.commitField.global.error.ErrorCode;
11+
import cmf.commitField.global.exception.CustomException;
412
import lombok.RequiredArgsConstructor;
513
import lombok.extern.slf4j.Slf4j;
614
import org.springframework.stereotype.Service;
715
import org.springframework.transaction.annotation.Transactional;
816

17+
import java.text.MessageFormat;
18+
919
@Service
1020
@RequiredArgsConstructor
1121
@Transactional(readOnly = true)
1222
@Slf4j
1323
public class NotiService {
1424
private final NotiRepository notiRepository;
25+
private final UserRepository userRepository;
26+
27+
// 알림 메시지 생성
28+
public static String generateMessage(NotiDetailType type, Object... params) {
29+
String template = NotiMessageTemplates.getTemplate(type);
30+
return MessageFormat.format(template, params);
31+
}
32+
33+
// 연속 커밋 알림 생성
34+
@Transactional
35+
public Noti createCommitStreak(String username, NotiType type, NotiDetailType detailType, Object... params) {
36+
// 메시지 생성
37+
String message = NotiService.generateMessage(detailType, params);
1538

16-
public void sendCommitStreakNotification(String username, int streakCount) {
17-
log.info("🎉 {}님의 연속 커밋이 {}일로 증가했습니다!", username, streakCount);
18-
// 알림을 DB 저장 또는 웹소켓 / 이메일 / 푸시 알림 전송 가능
39+
// 사용자 조회 (없으면 예외 처리)
40+
User user = userRepository.findByUsername(username).orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
41+
42+
// 알림 객체 생성 후 저장
43+
Noti noti = Noti.builder()
44+
.typeCode(type)
45+
.type2Code(detailType)
46+
.receiver(user)
47+
.isRead(false)
48+
.message(message)
49+
.build();
50+
51+
return notiRepository.save(noti);
1952
}
2053

54+
55+
2156
// public CommitAnalysisResponseDto getCommitAnalysis(String owner, String repo, String username, LocalDateTime since, LocalDateTime until) {
2257
// List<SinceCommitResponseDto> commits = getSinceCommits(owner, repo, since, until);
2358
// StreakResult streakResult = calculateStreaks(commits);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cmf.commitField.global.chat;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@AllArgsConstructor
9+
@NoArgsConstructor
10+
public class ChatMessageDto {
11+
private String msg;
12+
}

0 commit comments

Comments
 (0)