Skip to content

Commit 1344bc3

Browse files
authored
feat(repository, global): BaseInitData 추가, GitHubApiClient 추가, Repository 관련 로직 수정
feat(repository, global): BaseInitData 추가, GitHubApiClient 추가, Repository 관련 로직 수정
2 parents baf1c00 + 627e37f commit 1344bc3

23 files changed

+689
-118
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.backend.domain.analysis.repository;
2+
3+
import com.backend.domain.analysis.entity.Score;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface ScoreRepository extends JpaRepository<Score, Long> {
7+
}

backend/src/main/java/com/backend/domain/analysis/service/AnalysisService.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.backend.domain.analysis.service;
22

3+
import com.backend.domain.repository.dto.response.RepositoryData;
34
import com.backend.domain.analysis.entity.AnalysisResult;
45
import com.backend.domain.analysis.repository.AnalysisResultRepository;
56
import com.backend.domain.repository.service.RepositoryService;
67
import com.backend.global.exception.BusinessException;
78
import com.backend.global.exception.ErrorCode;
89
import lombok.RequiredArgsConstructor;
10+
import lombok.extern.slf4j.Slf4j;
911
import org.springframework.stereotype.Service;
1012
import org.springframework.transaction.annotation.Transactional;
11-
1213
import java.util.Optional;
1314

15+
@Slf4j
1416
@Service
1517
@RequiredArgsConstructor
1618
public class AnalysisService {
@@ -19,20 +21,38 @@ public class AnalysisService {
1921

2022
@Transactional
2123
public void analyze(String githubUrl) {
22-
if(githubUrl == null || !githubUrl.startsWith("https://github.com/")) {
24+
String[] repoInfo = parseGitHubUrl(githubUrl);
25+
String owner = repoInfo[0];
26+
String repo = repoInfo[1];
27+
28+
// Repository 데이터 수집
29+
RepositoryData repositoryData = repositoryService.fetchAndSaveRepository(owner, repo);
30+
31+
// TODO: AI 평가
32+
// EvaluationResult evaluation = evaluationService.evaluate(repositoryData);
33+
34+
// TODO: AI 평가 저장
35+
}
36+
37+
private String[] parseGitHubUrl(String githubUrl) {
38+
log.info("🚩 분석 요청 url: {}", githubUrl);
39+
40+
if (githubUrl == null || !githubUrl.startsWith("https://github.com/")) {
2341
throw new BusinessException(ErrorCode.INVALID_GITHUB_URL);
2442
}
2543

26-
String[] parts = githubUrl.replace("https://github.com/", "").split("/");
27-
if(parts.length < 2){
28-
throw new BusinessException(ErrorCode.INVALID_REPOSITORY_PATH);
44+
String path = githubUrl.replace("https://github.com/", "");
45+
if (path.endsWith("/")) {
46+
path = path.substring(0, path.length() - 1);
2947
}
3048

31-
String owner = parts[0];
32-
String repo = parts[1];
49+
String[] parts = path.split("/");
50+
if (parts.length < 2 || parts[0].trim().isEmpty() || parts[1].trim().isEmpty()) {
51+
throw new BusinessException(ErrorCode.INVALID_REPOSITORY_PATH);
52+
}
3353

34-
// GitHub API 호출
35-
repositoryService.fetchAndSaveRepository(owner, repo);
54+
log.info("🚩 파싱 완료 - owner: '{}', repo: '{}'", parts[0].trim(), parts[1].trim());
55+
return new String[]{parts[0].trim(), parts[1].trim()};
3656
}
3757

3858
// AnalysisRresult에서 repository id로 분석 결과 찾기
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
package com.backend.domain.repository.dto.response.github;
22

3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
35
// readme 응답용 DTO
4-
public record ReadmeResponse() {
6+
public record ReadmeResponse(
7+
String name,
8+
String path,
9+
String sha,
10+
Integer size,
11+
String url,
12+
@JsonProperty("html_url") String htmlUrl,
13+
@JsonProperty("download_url") String downloadUrl,
14+
String type,
15+
String content,
16+
String encoding
17+
) {
518
}

backend/src/main/java/com/backend/domain/repository/dto/response/github/RepoResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
public record RepoResponse(
88
String name,
99
@JsonProperty("full_name") String fullName,
10-
boolean _private,
10+
@JsonProperty("private") boolean _private,
1111
String description,
1212
@JsonProperty("html_url") String htmlUrl,
1313
String language,

backend/src/main/java/com/backend/domain/repository/entity/Repositories.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@ public class Repositories extends BaseEntity {
4444

4545
@Builder
4646
public Repositories(
47+
User user,
4748
String name,
4849
String description,
4950
String htmlUrl,
5051
boolean publicRepository,
5152
String mainBranch,
5253
List<RepositoryLanguage> languages
5354
) {
55+
this.user = user;
5456
this.name = name;
5557
this.description = description;
5658
this.htmlUrl = htmlUrl;
@@ -71,6 +73,9 @@ public void updateFrom(Repositories other) {
7173
this.name = other.name;
7274
this.description = other.description;
7375
this.mainBranch = other.mainBranch;
76+
}
77+
78+
public void updatePublicFrom(Repositories other) {
7479
this.publicRepository = other.publicRepository;
7580
}
7681
}

backend/src/main/java/com/backend/domain/repository/service/RepositoryService.java

Lines changed: 74 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@
55
import com.backend.domain.repository.entity.Language;
66
import com.backend.domain.repository.entity.Repositories;
77
import com.backend.domain.repository.repository.RepositoryJpaRepository;
8-
import com.backend.domain.repository.service.fetcher.FetcherRepository;
9-
import com.backend.domain.repository.service.mapper.MapperRepository;
8+
import com.backend.domain.repository.service.fetcher.GitHubDataFetcher;
9+
import com.backend.domain.repository.service.mapper.ReadmeInfoMapper;
10+
import com.backend.domain.repository.service.mapper.RepositoriesMapper;
11+
import com.backend.domain.repository.service.mapper.RepositoryInfoMapper;
12+
import com.backend.domain.user.entity.User;
13+
import com.backend.domain.user.repository.UserRepository;
14+
import com.backend.global.exception.BusinessException;
15+
import com.backend.global.exception.ErrorCode;
1016
import lombok.RequiredArgsConstructor;
1117
import lombok.extern.slf4j.Slf4j;
1218
import org.springframework.stereotype.Service;
@@ -19,27 +25,82 @@
1925
@RequiredArgsConstructor
2026
public class RepositoryService {
2127

22-
private final FetcherRepository fetcherRepository;
23-
private final MapperRepository mapperRepository;
28+
// 임시
29+
private final UserRepository userRepository;
30+
31+
private final GitHubDataFetcher gitHubDataFetcher;
32+
private final RepositoriesMapper repositoriesMapper;
33+
private final RepositoryInfoMapper repositoryInfoMapper;
34+
private final ReadmeInfoMapper readmeInfoMapper;
2435
private final RepositoryJpaRepository repositoryJpaRepository;
2536

2637
@Transactional
2738
public RepositoryData fetchAndSaveRepository(String owner, String repo) {
28-
RepoResponse response = fetcherRepository.fetchRepositoryInfo(owner, repo);
39+
try {
40+
return fetchCompleteRepositoryData(owner, repo);
41+
} catch (BusinessException e) {
42+
String errorCode = (e.getErrorCode() != null) ? e.getErrorCode().getCode() : "UNKNOWN";
43+
log.error("Repository analysis failed for {}/{}: {} - {}",
44+
owner, repo, errorCode, e.getMessage());
45+
throw e;
46+
} catch (Exception e) {
47+
log.error("Unexpected error during repository analysis for {}/{}: {}",
48+
owner, repo, e.getMessage(), e);
49+
throw new BusinessException(ErrorCode.INTERNAL_ERROR);
50+
}
51+
}
52+
53+
@Transactional
54+
public RepositoryData fetchCompleteRepositoryData(String owner, String repo) {
55+
RepositoryData data = new RepositoryData();
56+
57+
// 1. 기본 정보 수집 및 매핑 + Repositories 테이블 저장
58+
RepoResponse repoInfo = gitHubDataFetcher.fetchRepositoryInfo(owner, repo);
59+
repositoryInfoMapper.mapBasicInfo(data, repoInfo);
60+
61+
// TODO: 커밋 데이터 수집 및 매핑
62+
63+
64+
// TODO: README 데이터 수집 및 매핑
65+
String readmeInfo = gitHubDataFetcher.fetchReadmeContent(owner, repo);
66+
readmeInfoMapper.mapReadmeInfo(data, readmeInfo);
67+
68+
// TODO: 보안 관리 데이터 수집 및 매핑
69+
70+
71+
// TODO: 테스트 데이터 수집 및 매핑
2972

30-
Repositories entity = mapperRepository.toEntity(response);
31-
Repositories repositories = repositoryJpaRepository
73+
74+
// TODO: CI/CD 데이터 수집 및 매핑
75+
76+
77+
// TODO: 커뮤니티 활성도 데이터 수집 및 매핑
78+
79+
// Entity 저장 로직
80+
saveRepositoryEntity(repoInfo);
81+
82+
log.info("✅ RepositoryData: {}", data);
83+
return data;
84+
}
85+
86+
private void saveRepositoryEntity(RepoResponse repoInfo) {
87+
User defaultUser = userRepository.findAll().stream()
88+
.findFirst()
89+
.orElseThrow(() -> new BusinessException(ErrorCode.INTERNAL_ERROR));
90+
91+
Repositories entity = repositoriesMapper.toEntity(repoInfo, defaultUser);
92+
repositoryJpaRepository
3293
.findByHtmlUrl(entity.getHtmlUrl())
3394
.map(existing -> {
34-
existing.updateFrom(entity);
95+
existing.updateFrom(repositoriesMapper.toEntity(repoInfo, defaultUser));
3596
return existing;
3697
})
37-
.orElseGet(() -> repositoryJpaRepository.save(entity));
98+
.orElseGet(() -> {
99+
Repositories newEntity = repositoriesMapper.toEntity(repoInfo, defaultUser);
100+
return repositoryJpaRepository.save(newEntity);
101+
});
38102

39-
RepositoryData data = mapperRepository.toRepositoryData(response);
40-
log.info("RepositoryData 결과: {}", data);
41-
42-
return data;
103+
log.info("✅ Repositories: {}", entity);
43104
}
44105

45106
// Repository에서 member로 리포지토리 찾기

backend/src/main/java/com/backend/domain/repository/service/fetcher/FetcherCommit.java

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

backend/src/main/java/com/backend/domain/repository/service/fetcher/FetcherIssue.java

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

backend/src/main/java/com/backend/domain/repository/service/fetcher/FetcherPullRequest.java

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

backend/src/main/java/com/backend/domain/repository/service/fetcher/FetcherReadme.java

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

0 commit comments

Comments
 (0)