Skip to content

Commit 62cbbdb

Browse files
authored
Merge pull request #99 from Capstone-OpenStep/feature/#89-xp-api
Refactor: 사용자 맞춤 이슈 추천 조건 완화 및 로그 개선
2 parents c4a83ed + abb1ca1 commit 62cbbdb

2 files changed

Lines changed: 22 additions & 10 deletions

File tree

src/main/java/com/chungang/capstone/openstep/domain/Issue/service/IssueQueryService.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,13 @@ public List<Issue> getSuggestedIssues(Member member) {
8484
issueCacheService.evict(memberId);
8585
issueCacheService.evictInterestHash(memberId);
8686

87+
//List<Repo> suggestedRepos = repoQueryService.getSuggestedReposBySplitQuery(memberId);
8788
List<Repo> suggestedRepos = repoQueryService.getSuggestedRepos(memberId);
8889
log.info("[ISSUE_RECOMMEND] Suggested repos count = {}", suggestedRepos.size());
8990

9091
List<Issue> collectedIssues = new ArrayList<>();
9192
List<Issue> fallbackIssues = new ArrayList<>();
92-
OffsetDateTime threeMonthsAgo = OffsetDateTime.now().minusMonths(3);
93+
OffsetDateTime threeMonthsAgo = OffsetDateTime.now().minusMonths(9);
9394

9495
for (Repo repo : suggestedRepos) {
9596
String owner = repo.getOwnerName();
@@ -104,6 +105,9 @@ public List<Issue> getSuggestedIssues(Member member) {
104105

105106
List<GitHubIssueResponse.IssueNode> nodes = response.getData().getRepository().getIssues().getNodes();
106107

108+
int repoCollected = 0;
109+
int repoFallback = 0;
110+
107111
for (GitHubIssueResponse.IssueNode node : nodes) {
108112
OffsetDateTime updatedAt = OffsetDateTime.parse(node.getUpdatedAt());
109113
if (updatedAt.isBefore(threeMonthsAgo)) continue;
@@ -144,14 +148,18 @@ public List<Issue> getSuggestedIssues(Member member) {
144148
);
145149
if (isBeginnerLabel) {
146150
collectedIssues.add(issue);
151+
repoCollected++;
147152
} else {
148153
fallbackIssues.add(issue);
154+
repoFallback++;
149155
}
150156
if (collectedIssues.size() >= 50) break;
151157
}
158+
log.info("[ISSUE_RECOMMEND] Repo: {} -> Collected: {}, Fallback: {}", name, repoCollected, repoFallback);
152159
if (collectedIssues.size() >= 50) break;
153160
}
154161

162+
// 상위 추천 20개로 구성
155163
int need = 20;
156164
List<Issue> top20 = collectedIssues.stream()
157165
.sorted(Comparator.comparing(Issue::getUpdatedAt).reversed())
@@ -168,6 +176,7 @@ public List<Issue> getSuggestedIssues(Member member) {
168176
}
169177

170178
// 요약 + 저장 (중복 방지 포함)
179+
log.info("[ISSUE_RECOMMEND] Recommended Issues:");
171180
List<Issue> summarized = top20.stream()
172181
.map(issue -> {
173182
String summary;
@@ -179,18 +188,21 @@ public List<Issue> getSuggestedIssues(Member member) {
179188
summary = "요약을 생성할 수 없습니다.";
180189
}
181190
issue.setSummary(summary);
191+
log.info(" - [{}] {} ({})", issue.getIssueId(), issue.getTitle(), issue.getGithubUrl());
192+
182193
// 중복 저장 방지
183194
return issueRepository.findByGithubUrl(issue.getGithubUrl())
184195
.orElseGet(() -> issueRepository.save(issue));
185196
})
186197
.toList();
187198

188-
issueCacheService.saveRecommendedIssues(memberId, summarized);
189-
log.info("[ISSUE_RECOMMEND] Final recommended issues count = {}", summarized.size());
190-
191-
// 저장
199+
// 캐시 저장
192200
issueCacheService.saveRecommendedIssues(memberId, summarized);
193201
issueCacheService.saveInterestHash(memberId, currentHash);
202+
log.info("[ISSUE_RECOMMEND] Final recommended issues count = {}", summarized.size());
203+
if (summarized.size() < 20) {
204+
log.warn("[ISSUE_RECOMMEND] WARNING: Recommended issue count below target ({} / 20)", summarized.size());
205+
}
194206
return summarized;
195207
}
196208

src/main/java/com/chungang/capstone/openstep/domain/Repo/service/RepoQueryService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public List<Repo> getSuggestedRepos(Long memberId) {
119119

120120
String query = GitHubQueryBuilder.buildSearchQuery(List.of(lang), List.of(domain));
121121
GitHubRepoResponse response = gitHubGraphQLService.searchRepositories(query);
122-
List<Repo> parsed = parseResponseAndSave(response).stream().limit(10).toList();
122+
List<Repo> parsed = parseResponseAndSave(response).stream().limit(30).toList();
123123

124124
repoCacheService.saveReposByLanguageAndDomain(lang, domain, parsed);
125125
parsed.forEach(repo -> repoMap.putIfAbsent(repo.getGithubUrl(), repo));
@@ -135,7 +135,7 @@ public List<Repo> getSuggestedRepos(Long memberId) {
135135

136136
List<Repo> sorted = repoMap.values().stream()
137137
.sorted(Comparator.comparingInt(r -> -1 * (r.getStars() + r.getBeginnerIssueCount())))
138-
.limit(20)
138+
.limit(30)
139139
.toList();
140140

141141
repoCacheService.saveRecommendedRepos(memberId, sorted);
@@ -163,7 +163,7 @@ private List<Repo> parseResponseAndSave(GitHubRepoResponse response) {
163163

164164
List<Repo> strictFiltered = allNodes.stream()
165165
.filter(node -> node.getBeginnerIssueCount() >= 1)
166-
.filter(node -> node.getOpenIssuesCount() > 0)
166+
//.filter(node -> node.getOpenIssuesCount() > 0)
167167
//.filter(node -> node.getStargazerCount() < 100000)
168168
.filter(node -> isUpdatedWithin36Months(node.getUpdatedAt()))
169169
.map(this::saveIfNotExists)
@@ -173,10 +173,10 @@ private List<Repo> parseResponseAndSave(GitHubRepoResponse response) {
173173

174174
return allNodes.stream()
175175
.filter(node -> node.getBeginnerIssueCount() >= 0)
176-
.filter(node -> node.getOpenIssuesCount() > 0)
176+
//.filter(node -> node.getOpenIssuesCount() > 0)
177177
.filter(node -> isUpdatedWithin36Months(node.getUpdatedAt()))
178178
.map(this::saveIfNotExists)
179-
.limit(10)
179+
.limit(30)
180180
.collect(Collectors.toList());
181181
}
182182

0 commit comments

Comments
 (0)