Skip to content

Commit 38b32c4

Browse files
authored
Merge pull request #143 from CommitField/feat/#81
feat : ์—ฐ์† ์ปค๋ฐ‹ ์ถ•ํ•˜ ์•Œ๋ฆผ ๊ตฌํ˜„
2 parents f1fd342 + 6d55568 commit 38b32c4

File tree

6 files changed

+99
-41
lines changed

6 files changed

+99
-41
lines changed

โ€Žsrc/main/java/cmf/commitField/domain/commit/scheduler/CommitScheduler.javaโ€Ž

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package cmf.commitField.domain.commit.scheduler;
22

33
import cmf.commitField.domain.commit.totalCommit.service.TotalCommitService;
4+
import cmf.commitField.domain.noti.noti.entity.NotiDetailType;
5+
import cmf.commitField.domain.noti.noti.entity.NotiType;
6+
import cmf.commitField.domain.noti.noti.event.NotiEvent;
7+
import cmf.commitField.domain.noti.noti.service.CommitSteakNotiService;
8+
import cmf.commitField.domain.noti.noti.service.NotiService;
49
import cmf.commitField.domain.user.entity.User;
510
import cmf.commitField.domain.user.repository.UserRepository;
611
import lombok.RequiredArgsConstructor;
@@ -25,6 +30,8 @@ public class CommitScheduler {
2530
private final StringRedisTemplate redisTemplate;
2631
private final AtomicInteger counter = new AtomicInteger(0);
2732
private final SimpMessagingTemplate messagingTemplate;
33+
private final NotiService notiService;
34+
private final CommitSteakNotiService commitSteakNotiService;
2835

2936
private final ApplicationEventPublisher eventPublisher;
3037

@@ -86,6 +93,7 @@ private void processUserCommit(String username) {
8693
updateTotalCommit = totalCommitService.getTotalCommitCount(
8794
username
8895
).getTotalCommitContributions();
96+
int currentStreakCommit = totalCommitService.getTotalCommitCount(username).getCurrentStreakDays();
8997

9098
newCommitCount = updateTotalCommit - currentCommit; // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ปค๋ฐ‹ ์ˆ˜
9199

@@ -101,6 +109,9 @@ private void processUserCommit(String username) {
101109

102110
CommitUpdateEvent event = new CommitUpdateEvent(this, username, newCommitCount);
103111
eventPublisher.publishEvent(event); // ์ด๋ฒคํŠธ ๋ฐœ์ƒ
112+
113+
commitSteakNotiService.checkAndCreateSteakNoti(user, currentStreakCommit);
114+
104115
System.out.println("CommitCreatedEvent published for user: " + username);
105116
} else if(newCommitCount < 0) {
106117
// newCommitCount์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฌธ์ œ ์ƒํ™ฉ / ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ํ•„์š”. db ๊ฐฑ์‹ .
Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,39 @@
11
package cmf.commitField.domain.noti.noti.entity;
22

3+
import java.text.MessageFormat;
4+
import java.util.Arrays;
5+
36
public enum NotiDetailType {
4-
// ์—…์ 
5-
RANK_UP, // ๋žญํ‚น ์ƒ์Šน
6-
ACHIEVEMENT_COMPLETED, // ์—…์  ๋‹ฌ์„ฑ
7+
ACHIEVEMENT_COMPLETED("๐ŸŽ‰ {0}๋‹˜์ด [{1}] ์—…์ ์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค!", new String[]{"nickname", "achievementName"}),
8+
STREAK_CONTINUED("๐Ÿ”ฅ {0}๋‹˜์˜ ์—ฐ์† ์ปค๋ฐ‹์ด {1}์ผ์งธ ์ด์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!", new String[]{"nickname", "days"}),
9+
STREAK_BROKEN("๐Ÿ˜ข {0}๋‹˜์˜ ์—ฐ์† ์ปค๋ฐ‹ ๊ธฐ๋ก์ด ๋Š๊ฒผ์Šต๋‹ˆ๋‹ค.", new String[]{"nickname"}),
10+
SEASON_START("๐Ÿš€ ์ƒˆ๋กœ์šด [{0}] ์‹œ์ฆŒ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๋žญํ‚น ๊ฒฝ์Ÿ์„ ์ค€๋น„ํ•˜์„ธ์š”!", new String[]{"seasonName"}),
11+
RANK_UP("๐Ÿ“ˆ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! {0}๋‹˜์˜ ๋žญํ‚น์ด {1}(์œผ)๋กœ ์ƒ์Šนํ–ˆ์Šต๋‹ˆ๋‹ค! ๐ŸŽŠ", new String[]{"nickname", "tier"}),
12+
NOTICE_CREATED("๐Ÿ“ข ๊ณต์ง€์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค: {0}", new String[]{"noticeTitle"});
13+
14+
private final String template;
15+
private final String[] paramNames;
16+
17+
NotiDetailType(String template, String[] paramNames) {
18+
this.template = template;
19+
this.paramNames = paramNames;
20+
}
721

8-
// ์—ฐ์†
9-
STREAK_CONTINUED, // ์—ฐ์† ์ปค๋ฐ‹ ์ด์–ด์ง
10-
STREAK_BROKEN, // ์—ฐ์† ์ปค๋ฐ‹ ๋Š๊น€
22+
public String getTemplate() {
23+
return template;
24+
}
1125

12-
NOTICE_CREATED, // ์‹œ์ฆŒ
13-
SEASON_START // ์‹œ์ฆŒ ์‹œ์ž‘
26+
public String[] getParamNames() {
27+
return paramNames;
28+
}
29+
30+
public String formatMessage(Object... params) {
31+
if (paramNames.length != params.length) {
32+
throw new IllegalArgumentException("๐Ÿšจ ์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜! ํ•„์š”: " +
33+
Arrays.toString(paramNames) + ", ์ œ๊ณต๋จ: " + Arrays.toString(params));
34+
}
35+
return MessageFormat.format(template, params);
36+
}
1437
}
38+
39+

โ€Žsrc/main/java/cmf/commitField/domain/noti/noti/entity/NotiMessageTemplates.javaโ€Ž

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

โ€Žsrc/main/java/cmf/commitField/domain/noti/noti/repository/NotiRepository.javaโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@ public interface NotiRepository extends JpaRepository<Noti, Long> {
2424

2525
// ์ตœ๊ทผ 10์ผ ๋‚ด ๋™์ผํ•œ ์ปค๋ฐ‹ ๋ถ€์žฌ ์•Œ๋ฆผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
2626
boolean existsByReceiverAndTypeCodeAndType2CodeAndCreatedAtAfter(User receiver, NotiType type, NotiDetailType detailType, LocalDateTime after);
27+
28+
boolean existsByReceiverAndType2CodeAndCreatedAtAfter(User receiver, NotiDetailType notiDetailType, LocalDateTime todayStart);
2729
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,65 @@
11
package cmf.commitField.domain.noti.noti.service;
22

3+
import cmf.commitField.domain.commit.totalCommit.service.TotalCommitService;
4+
import cmf.commitField.domain.noti.noti.entity.NotiDetailType;
5+
import cmf.commitField.domain.noti.noti.entity.NotiType;
6+
import cmf.commitField.domain.noti.noti.repository.NotiRepository;
7+
import cmf.commitField.domain.user.entity.User;
8+
import cmf.commitField.domain.user.repository.UserRepository;
9+
import cmf.commitField.domain.user.service.UserService;
10+
import cmf.commitField.global.error.ErrorCode;
11+
import cmf.commitField.global.exception.CustomException;
312
import lombok.RequiredArgsConstructor;
413
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.scheduling.annotation.Scheduled;
15+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
16+
import org.springframework.security.oauth2.core.user.OAuth2User;
517
import org.springframework.stereotype.Service;
18+
import org.springframework.transaction.annotation.Transactional;
19+
20+
import java.time.LocalDate;
21+
import java.time.LocalDateTime;
22+
import java.util.List;
623

724
@Service
825
@RequiredArgsConstructor
926
@Slf4j
1027
public class CommitSteakNotiService {
28+
private final UserRepository userRepository;
29+
private final TotalCommitService totalCommitService;
1130
private final NotiService notiService;
31+
private final NotiRepository notiRepository;
32+
33+
// ๋งค์ผ 10์‹œ ์‹คํ–‰
34+
@Scheduled(cron = "0 0 10 * * *")
35+
@Transactional
36+
public void sendCommitSteakNoti() {
37+
List<User> users = userRepository.findAll();
38+
39+
for (User user : users) {
40+
int currentStreakCommit = totalCommitService.getTotalCommitCount(user.getUsername()).getCurrentStreakDays();
41+
checkAndCreateSteakNoti(user, currentStreakCommit);
42+
}
43+
}
44+
45+
public void checkAndCreateSteakNoti(User user, int currentStreakCommit) {
46+
boolean alreadyNotified = notiRepository.existsByReceiverAndType2CodeAndCreatedAtAfter(
47+
user, NotiDetailType.STREAK_CONTINUED, LocalDate.now().atStartOfDay()
48+
);
49+
50+
log.info("์•Œ๋ฆผ ์ƒ์„ธ ํƒ€์ž…: {}", NotiDetailType.STREAK_CONTINUED.name());
51+
52+
if (shouldNotify(currentStreakCommit) && !alreadyNotified) {
53+
log.info("๐Ÿ” ์—ฐ์† ์ปค๋ฐ‹ ์ถ•ํ•˜ ์•Œ๋ฆผ User: {}, Streak: {}", user.getUsername(), currentStreakCommit);
54+
notiService.createStreakCommitNoti(user, String.valueOf(currentStreakCommit));
55+
}
56+
}
57+
1258

59+
/**
60+
* ํŠน์ • ์—ฐ์† ์ปค๋ฐ‹ ํšŸ์ˆ˜์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ํ™•์ธ
61+
*/
62+
public boolean shouldNotify(int streak) {
63+
return streak == 3 || (streak % 10 == 0);
64+
}
1365
}

โ€Žsrc/main/java/cmf/commitField/domain/noti/noti/service/NotiService.javaโ€Ž

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,11 @@
33
import cmf.commitField.domain.noti.noti.dto.NotiDto;
44
import cmf.commitField.domain.noti.noti.entity.Noti;
55
import cmf.commitField.domain.noti.noti.entity.NotiDetailType;
6-
import cmf.commitField.domain.noti.noti.entity.NotiMessageTemplates;
76
import cmf.commitField.domain.noti.noti.entity.NotiType;
87
import cmf.commitField.domain.noti.noti.event.NotiEvent;
98
import cmf.commitField.domain.noti.noti.repository.NotiRepository;
10-
import cmf.commitField.domain.season.entity.Rank;
119
import cmf.commitField.domain.season.entity.Season;
1210
import cmf.commitField.domain.user.entity.User;
13-
import cmf.commitField.domain.user.repository.UserRepository;
1411
import cmf.commitField.global.error.ErrorCode;
1512
import cmf.commitField.global.exception.CustomException;
1613
import lombok.RequiredArgsConstructor;
@@ -19,7 +16,6 @@
1916
import org.springframework.stereotype.Service;
2017
import org.springframework.transaction.annotation.Transactional;
2118

22-
import java.text.MessageFormat;
2319
import java.util.ArrayList;
2420
import java.util.List;
2521

@@ -29,21 +25,13 @@
2925
@Slf4j
3026
public class NotiService {
3127
private final NotiRepository notiRepository;
32-
private final UserRepository userRepository;
3328
private final ApplicationEventPublisher eventPublisher;
3429

35-
// ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ
36-
public static String generateMessage(NotiDetailType type, Object... params) {
37-
String template = NotiMessageTemplates.getTemplate(type);
38-
String message = MessageFormat.format(template, params); // params ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ
39-
return message;
40-
}
41-
4230
// ์•Œ๋ฆผ ์ƒ์„ฑ
4331
@Transactional
4432
public void createNoti(User receiver, NotiType notiType, NotiDetailType notiDetailType, Long relId, String relTypeCode, Object... params) {
4533
// ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ
46-
String message = NotiService.generateMessage(notiDetailType, params);
34+
String message = notiDetailType.formatMessage(params);
4735

4836
// ์•Œ๋ฆผ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ
4937
Noti noti = Noti.builder()

0 commit comments

Comments
ย (0)