Skip to content

Commit 8a568e1

Browse files
authored
Merge branch 'dev' into feat/#65
2 parents 6a6ea7d + ff309e5 commit 8a568e1

File tree

12 files changed

+147
-71
lines changed

12 files changed

+147
-71
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 & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +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.FetchType;
7-
import jakarta.persistence.JoinColumn;
6+
import jakarta.persistence.EnumType;
7+
import jakarta.persistence.Enumerated;
88
import jakarta.persistence.ManyToOne;
99
import lombok.AllArgsConstructor;
1010
import lombok.Getter;
1111
import lombok.NoArgsConstructor;
1212
import lombok.Setter;
1313
import lombok.experimental.SuperBuilder;
14+
import org.hibernate.annotations.ColumnDefault;
1415

1516
import static lombok.AccessLevel.PROTECTED;
1617

@@ -21,18 +22,17 @@
2122
@Getter
2223
@Setter
2324
public class Noti extends BaseEntity {
25+
@Enumerated(EnumType.STRING)
26+
private NotiType typeCode; // ์•Œ๋ฆผ ํƒ€์ž…
27+
private NotiDetailType type2Code; // ์•Œ๋ฆผ ์„ธ๋ถ€ ํƒ€์ž…
28+
@ManyToOne
29+
private User receiver; // ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ์‚ฌ๋žŒ
30+
@ColumnDefault("false")
31+
private boolean isRead; // ์ฝ์Œ ์ƒํƒœ
32+
private String message; // ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€
2433

25-
@ManyToOne(fetch = FetchType.LAZY)
26-
@JoinColumn(name = "actor_id", nullable = false)
27-
private User actor;
34+
// TODO: ์•Œ๋ฆผ์ด ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ณ ๋ฏผ ํ•„์š”.
35+
// private String relTypeCode; // ์•Œ๋ฆผ์ด ์—ฐ๊ฒฐ๋œ ์‹ค์ œ ๊ฐ์ฒด ์œ ํ˜•
36+
// private long relId; // ์•Œ๋ฆผ ๊ฐ์ฒด์˜ Id
2837

29-
@ManyToOne(fetch = FetchType.LAZY)
30-
@JoinColumn(name = "receiver_id", nullable = false)
31-
private User receiver;
32-
33-
private String relTypeCode;
34-
private long relId;
35-
private String typeCode;
36-
private String type2Code;
37-
private boolean read;
3838
}
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)