11package com .backend .domain .analysis .controller ;
22
3+ import com .backend .domain .analysis .dto .request .AnalysisRequest ;
34import com .backend .domain .analysis .dto .response .AnalysisResultResponseDto ;
45import com .backend .domain .analysis .dto .response .HistoryResponseDto ;
5- import com .backend .domain .analysis .dto .request .AnalysisRequest ;
66import com .backend .domain .analysis .entity .AnalysisResult ;
7- import com .backend .domain .analysis .entity .Score ;
87import com .backend .domain .analysis .service .AnalysisService ;
8+ import com .backend .domain .repository .dto .response .RepositoryResponse ;
99import com .backend .domain .repository .entity .Repositories ;
1010import com .backend .domain .repository .service .RepositoryService ;
11+ import com .backend .global .exception .BusinessException ;
12+ import com .backend .global .exception .ErrorCode ;
1113import com .backend .global .response .ApiResponse ;
1214import lombok .RequiredArgsConstructor ;
1315import org .springframework .http .ResponseEntity ;
1618
1719import java .util .ArrayList ;
1820import java .util .List ;
19- import java .util .Optional ;
2021
2122@ RestController
2223@ RequiredArgsConstructor
@@ -25,54 +26,90 @@ public class AnalysisController {
2526 private final AnalysisService analysisService ;
2627 private final RepositoryService repositoryService ;
2728
29+ // POST: 분석 요청
2830 @ PostMapping
2931 public ResponseEntity <ApiResponse <Void >> analyzeRepository (@ RequestBody AnalysisRequest request ) {
32+ if (request == null ) {
33+ throw new BusinessException (ErrorCode .INVALID_INPUT_VALUE );
34+ }
35+
3036 analysisService .analyze (request .githubUrl ());
3137 return ResponseEntity .ok (ApiResponse .success ());
3238 }
3339
34- @ GetMapping ("/user/repository/{memberId}" )
40+ // GET: 사용자의 모든 Repository 목록 조회
41+ @ GetMapping ("/{memberId}/repositories" )
42+ @ Transactional (readOnly = true )
43+ public ResponseEntity <List <RepositoryResponse >> getMemberHistory (
44+ @ PathVariable Long memberId
45+ ){
46+ if (memberId == null ) {
47+ throw new BusinessException (ErrorCode .INVALID_INPUT_VALUE );
48+ }
49+
50+ List <RepositoryResponse > repositories = repositoryService
51+ .findRepositoryByMember (memberId )
52+ .stream ()
53+ .map (RepositoryResponse ::new )
54+ .toList ();
55+
56+ return ResponseEntity .ok (repositories );
57+ }
58+
59+ // GET: 특정 Repository의 분석 히스토리 조회, 모든 분석 결과 조회
60+ @ GetMapping ("/{memberId}/repositories/{repositoriesId}" )
3561 @ Transactional (readOnly = true )
36- public ResponseEntity <List <HistoryResponseDto >> getMemberHistory (@ PathVariable Long memberId ){
37- List <Repositories > repositories = repositoryService .findRepositoryByMember (memberId );
38- List <HistoryResponseDto > historyList = new ArrayList <>();
62+ public ResponseEntity <HistoryResponseDto > getAnalysisByRepositoriesId (
63+ @ PathVariable ("memberId" ) Long memberId ,
64+ @ PathVariable ("repositoriesId" ) Long repoId
65+ ){
66+ // TODO: 추후 인증/인가 기능 완성 후 소유권 검증 로직 추가
67+
68+ // 1. Repository 정보 조회
69+ Repositories repository = repositoryService .findById (repoId )
70+ .orElseThrow (() -> new BusinessException (ErrorCode .GITHUB_REPO_NOT_FOUND ));
3971
40- for (Repositories repo : repositories ) {
41- Optional <AnalysisResult > optionalAnalysis = analysisService .findByRepositoryId (repo .getId ());
72+ RepositoryResponse repositoryResponse = new RepositoryResponse (repository );
4273
43- if ( optionalAnalysis . isPresent ()) { // 존재하는지 확인
44- AnalysisResult analysisResult = optionalAnalysis . get ();
45- Score score = analysisResult . getScore ( );
74+ // 2. 분석 결과 목록 조회 (최신순 정렬)
75+ List < AnalysisResult > analysisResults =
76+ analysisService . getAnalysisResultList ( repoId );
4677
47- List <String > languages = repositoryService .findLanguagesByRepisotryId (repo .getId ())
48- .stream ()
49- .map (Enum ::name ) // RepositoryLanguage -> Language enum
50- .toList ();
78+ // 3. 버전 DTO 생성 (최신이 가장 큰 번호)
79+ List <HistoryResponseDto .AnalysisVersionDto > versions = new ArrayList <>();
80+ int versionNumber = analysisResults .size ();
5181
52- HistoryResponseDto dto = new HistoryResponseDto ( repo , analysisResult , score , languages );
53- historyList .add (dto );
54- }
82+ for ( AnalysisResult analysis : analysisResults ) {
83+ versions .add (HistoryResponseDto . AnalysisVersionDto . from ( analysis , versionNumber ) );
84+ versionNumber --;
5585 }
5686
57- // 최신순 정렬
58- historyList . sort (( a , b ) -> b . createDate (). compareTo ( a . createDate ()) );
87+ // 4. 응답 조합
88+ HistoryResponseDto response = HistoryResponseDto . of ( repositoryResponse , versions );
5989
60- return ResponseEntity .ok (historyList );
90+ return ResponseEntity .ok (response );
6191 }
6292
63- @ GetMapping ("repository/{repositoriesId}" )
93+ // GET: 특정 분석 결과 상세 조회
94+ @ GetMapping ("/{memberId}/repositories/{repositoryId}/results/{analysisId}" )
6495 @ Transactional (readOnly = true )
65- public ResponseEntity <List <AnalysisResultResponseDto >> getAnalysisByRepositoriesId (@ PathVariable ("repositoriesId" ) Long repoId ){
66- List <AnalysisResult > optionalResult = analysisService .getAnalysisResultList (repoId );
67- List <AnalysisResultResponseDto > resultList = new ArrayList <>();
96+ public ResponseEntity <AnalysisResultResponseDto > getAnalysisDetail (
97+ @ PathVariable Long memberId ,
98+ @ PathVariable Long repositoryId ,
99+ @ PathVariable Long analysisId
100+ ) {
101+ // TODO: 추후 인증/인가 검증
68102
103+ // 분석 결과 조회
104+ AnalysisResult analysisResult = analysisService .getAnalysisById (analysisId );
69105
70- for (AnalysisResult result : optionalResult ){
71- Score score = result .getScore ();
72- AnalysisResultResponseDto dto = new AnalysisResultResponseDto (result , score );
73- resultList .add (dto );
106+ if (!analysisResult .getRepositories ().getId ().equals (repositoryId )) {
107+ throw new BusinessException (ErrorCode .INVALID_INPUT_VALUE );
74108 }
75109
76- return ResponseEntity .ok (resultList );
110+ AnalysisResultResponseDto response =
111+ new AnalysisResultResponseDto (analysisResult , analysisResult .getScore ());
112+
113+ return ResponseEntity .ok (response );
77114 }
78115}
0 commit comments