Skip to content

Commit 2df28f8

Browse files
authored
Merge pull request #84 from CommitField/feat/#80
test : ์ปค๋ฐ‹ ์Šค์ผ€์ค„๋Ÿฌ ํ…Œ์ŠคํŠธ
2 parents c440d7b + 62bc9c6 commit 2df28f8

File tree

13 files changed

+196
-8
lines changed

13 files changed

+196
-8
lines changed

โ€Žsrc/main/java/cmf/commitField/CommitFieldApplication.javaโ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
67

78
@SpringBootApplication
89
@EnableJpaAuditing
10+
// ์Šค์ผ€์ฅด๋ง ํ™œ์„ฑํ™”
11+
// ํ…Œ์ŠคํŠธ์‹œ์—๋งŒ ์ฃผ์„ ํ’€๊ธฐ
12+
@EnableScheduling
913
public class CommitFieldApplication {
1014

1115
public static void main(String[] args) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@ public class CommitScheduler {
2323

2424
@Scheduled(fixedRate = 60000) // 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰
2525
public void updateUserCommits() {
26+
log.info("๐Ÿ” updateUserCommits ์‹คํ–‰์ค‘");
2627
List<User> activeUsers = userRepository.findAll(); // ๐Ÿ’ซ ๋ณ€๊ฒฝ ํ•„์š”, ์ฐจํ›„ active ์ƒํƒœ์ธ user๋งŒ ์ฐพ๊ฒŒ๋” ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ.
2728

29+
log.info("๐Ÿ” Active User Count: {}", activeUsers.size());
30+
2831
for (User user : activeUsers) {
2932
Integer cachedCount = commitCacheService.getCachedCommitCount(user.getUsername());
3033
int newCommitCount = githubService.getUserCommitCount(user.getUsername());
3134

35+
log.info("๐Ÿ” User: {}, Commit Count: {}", user.getUsername(), newCommitCount);
36+
3237
if (cachedCount == null || cachedCount != newCommitCount) { // ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ฒ˜๋ฆฌ
3338
commitCacheService.updateCachedCommitCount(user.getUsername(), newCommitCount);
3439
redpandaProducer.sendCommitUpdate(user.getUsername(), newCommitCount);
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cmf.commitField.domain.commit.sinceCommit.entity;
2+
3+
import cmf.commitField.global.jpa.BaseEntity;
4+
import jakarta.persistence.*;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.time.LocalDate;
10+
11+
@Entity
12+
@Table(name = "commit_history")
13+
@Getter
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class CommitHistory extends BaseEntity {
17+
18+
@Column(nullable = false)
19+
private String username; // GitHub ์‚ฌ์šฉ์ž๋ช…
20+
21+
@Column(nullable = false)
22+
private int streak; // ์—ฐ์† ์ปค๋ฐ‹ ์ˆ˜
23+
24+
@Column(nullable = false)
25+
private LocalDate commitDate; // ์ปค๋ฐ‹ํ•œ ๋‚ ์งœ
26+
}
27+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cmf.commitField.domain.commit.sinceCommit.repositoty;
2+
3+
import cmf.commitField.domain.commit.sinceCommit.entity.CommitHistory;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.Optional;
8+
9+
@Repository
10+
public interface CommitHistoryRepository extends JpaRepository<CommitHistory, Long> {
11+
// ํŠน์ • ์œ ์ €์˜ ์ตœ์‹  ์ปค๋ฐ‹ ๊ธฐ๋ก ์กฐํšŒ
12+
Optional<CommitHistory> findTopByUsernameOrderByCommitDateDesc(String username);
13+
}

โ€Žsrc/main/java/cmf/commitField/domain/commit/sinceCommit/service/CommitCacheService.javaโ€Ž

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ public class CommitCacheService {
1414
private final StringRedisTemplate redisTemplate;
1515

1616
public Integer getCachedCommitCount(String username) {
17-
String key = "commit:" + username;
18-
String value = redisTemplate.opsForValue().get(key);
19-
return value != null ? Integer.parseInt(value) : null;
17+
log.info("Redis Template: {}", redisTemplate);
18+
String key = "commit:" + username; // Redis ํ‚ค ์ƒ์„ฑ (ex: commit:hongildong)
19+
String value = redisTemplate.opsForValue().get(key); // Redis์—์„œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
20+
return value != null ? Integer.parseInt(value) : null; // ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ •์ˆ˜ ๋ณ€ํ™˜, ์—†์œผ๋ฉด null ๋ฐ˜ํ™˜
2021
}
2122

2223
public void updateCachedCommitCount(String username, int count) {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cmf.commitField.domain.noti.noti.entity;
2+
3+
import cmf.commitField.domain.user.entity.User;
4+
import cmf.commitField.global.jpa.BaseEntity;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.ManyToOne;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
import lombok.Setter;
11+
import lombok.experimental.SuperBuilder;
12+
13+
import static lombok.AccessLevel.PROTECTED;
14+
15+
@Entity
16+
@NoArgsConstructor(access = PROTECTED)
17+
@AllArgsConstructor(access = PROTECTED)
18+
@SuperBuilder
19+
@Getter
20+
@Setter
21+
public class Noti extends BaseEntity {
22+
@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;
31+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package cmf.commitField.domain.noti.noti.eventListener;
2+
3+
import cmf.commitField.domain.noti.noti.service.NotiService;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
@RequiredArgsConstructor
9+
public class NotiEventListener {
10+
private final NotiService notiService;
11+
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+
// }
24+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package cmf.commitField.domain.noti.noti.repository;
2+
3+
import cmf.commitField.domain.noti.noti.entity.Noti;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface NotiRepository extends JpaRepository<Noti, Long> {
9+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package cmf.commitField.domain.noti.noti.service;
2+
3+
import cmf.commitField.domain.noti.noti.repository.NotiRepository;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
9+
@Service
10+
@RequiredArgsConstructor
11+
@Transactional(readOnly = true)
12+
@Slf4j
13+
public class NotiService {
14+
private final NotiRepository notiRepository;
15+
16+
public void sendCommitStreakNotification(String username, int streakCount) {
17+
log.info("๐ŸŽ‰ {}๋‹˜์˜ ์—ฐ์† ์ปค๋ฐ‹์ด {}์ผ๋กœ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค!", username, streakCount);
18+
// ์•Œ๋ฆผ์„ DB ์ €์žฅ ๋˜๋Š” ์›น์†Œ์ผ“ / ์ด๋ฉ”์ผ / ํ‘ธ์‹œ ์•Œ๋ฆผ ์ „์†ก ๊ฐ€๋Šฅ
19+
}
20+
21+
// public CommitAnalysisResponseDto getCommitAnalysis(String owner, String repo, String username, LocalDateTime since, LocalDateTime until) {
22+
// List<SinceCommitResponseDto> commits = getSinceCommits(owner, repo, since, until);
23+
// StreakResult streakResult = calculateStreaks(commits);
24+
//
25+
// // ์—ฐ์† ์ปค๋ฐ‹ ์ˆ˜ Redis ์—…๋ฐ์ดํŠธ ๋ฐ ์•Œ๋ฆผ
26+
// streakService.updateStreak(username, streakResult.currentStreak, streakResult.maxStreak);
27+
//
28+
// return new CommitAnalysisResponseDto(commits, streakResult.currentStreak, streakResult.maxStreak);
29+
// }
30+
31+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package cmf.commitField.domain.noti.streak.service;
2+
3+
import cmf.commitField.domain.noti.noti.service.NotiService;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.data.redis.core.RedisTemplate;
6+
import org.springframework.stereotype.Service;
7+
8+
@Service
9+
@RequiredArgsConstructor
10+
public class StreakService {
11+
private final RedisTemplate<String, String> redisTemplate;
12+
13+
private final NotiService notiService;
14+
15+
public void updateStreak(String username, int newCurrentStreak, int newMaxStreak) {
16+
String currentStreakKey = "user:" + username + ":current_streak";
17+
String maxStreakKey = "user:" + username + ":max_streak";
18+
19+
int prevCurrentStreak = getStreak(currentStreakKey);
20+
int prevMaxStreak = getStreak(maxStreakKey);
21+
22+
// ์—ฐ์† ์ปค๋ฐ‹์ด ์ฆ๊ฐ€ํ–ˆ์œผ๋ฉด Redis ์—…๋ฐ์ดํŠธ ๋ฐ ์•Œ๋ฆผ ๋ฐœ์†ก
23+
if (newCurrentStreak > prevCurrentStreak) {
24+
// redis ์—…๋ฐ์ดํŠธ
25+
redisTemplate.opsForValue().set(currentStreakKey, String.valueOf(newCurrentStreak));
26+
27+
// ์•Œ๋ฆผ ๋ฐœ์†ก
28+
// notiService.sendCommitStreakNotification(username, newCurrentStreak);
29+
}
30+
}
31+
32+
private int getStreak(String key) {
33+
String value = redisTemplate.opsForValue().get(key);
34+
return (value != null) ? Integer.parseInt(value) : 0;
35+
}
36+
}

0 commit comments

Comments
ย (0)