Skip to content

Commit 4362f1d

Browse files
committed
refactor: 병수님 코드랑 비교후 merge
2 parents 3e40d8f + de90ac1 commit 4362f1d

29 files changed

+625
-60
lines changed

backend/src/main/java/com/backend/domain/analysis/controller/AnalysisController.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,31 @@ public ResponseEntity<AnalysisResultResponseDto> getAnalysisDetail(
112112

113113
return ResponseEntity.ok(response);
114114
}
115+
116+
// Repository 삭제
117+
@DeleteMapping("/{memberId}/repositories/{repositoriesId}")
118+
public void deleteRepository(@PathVariable("repositoriesId") Long repositoriesId){
119+
analysisService.delete(repositoriesId);
120+
}
121+
122+
// 특정 AnalysisResult 삭제
123+
@DeleteMapping("/{memberId}/repositories/{repositoryId}/results/{analysisId}")
124+
public ResponseEntity<ApiResponse<Void>> deleteAnalysisResult(
125+
@PathVariable Long memberId,
126+
@PathVariable Long repositoryId,
127+
@PathVariable Long analysisId
128+
) {
129+
analysisService.deleteAnalysisResult(analysisId, memberId);
130+
return ResponseEntity.ok(ApiResponse.success());
131+
}
132+
133+
// 분석 결과 공개 여부 변경
134+
@PutMapping("/{memberId}/repositories/{repositoryId}/public")
135+
public ResponseEntity updatePublicStatus(
136+
@PathVariable Long memberId,
137+
@PathVariable Long repositoryId
138+
) {
139+
analysisService.updatePublicStatus(repositoryId, memberId);
140+
return ResponseEntity.ok(ApiResponse.success());
141+
}
115142
}

backend/src/main/java/com/backend/domain/analysis/entity/AnalysisResult.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.backend.domain.analysis.entity;
22

3+
import com.backend.domain.community.entity.Comment;
34
import com.backend.domain.repository.entity.Repositories;
45
import jakarta.persistence.*;
56
import lombok.*;
67

78
import java.time.LocalDateTime;
9+
import java.util.ArrayList;
10+
import java.util.List;
811

912
@Entity
1013
@Table (name = "analysis_result")
@@ -33,7 +36,20 @@ public class AnalysisResult {
3336
@Column(nullable = false, name = "createData")
3437
private LocalDateTime createDate;
3538

36-
@Setter
3739
@OneToOne(mappedBy = "analysisResult", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
3840
private Score score;
41+
42+
@Builder
43+
public AnalysisResult(Repositories repositories, String summary,
44+
String strengths, String improvements, LocalDateTime createDate) {
45+
this.repositories = repositories;
46+
this.summary = summary;
47+
this.strengths = strengths;
48+
this.improvements = improvements;
49+
this.createDate = createDate;
50+
}
51+
52+
public void assignScore(Score score) {
53+
this.score = score;
54+
}
3955
}

backend/src/main/java/com/backend/domain/analysis/entity/Score.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,18 @@ public class Score {
4040
public int getTotalScore() {
4141
return readmeScore + testScore + commitScore + cicdScore;
4242
}
43+
44+
@Builder
45+
public Score(AnalysisResult analysisResult, int readmeScore,
46+
int testScore, int commitScore, int cicdScore) {
47+
this.analysisResult = analysisResult;
48+
if (analysisResult != null) {
49+
analysisResult.assignScore(this);
50+
}
51+
52+
this.readmeScore = readmeScore;
53+
this.testScore = testScore;
54+
this.commitScore = commitScore;
55+
this.cicdScore = cicdScore;
56+
}
4357
}

backend/src/main/java/com/backend/domain/analysis/repository/AnalysisResultRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
import org.springframework.stereotype.Repository;
66

77
import java.util.List;
8-
import java.util.Optional;
98

109
@Repository
1110
public interface AnalysisResultRepository extends JpaRepository <AnalysisResult, Long>{
12-
Optional<AnalysisResult> findByRepositoriesId(Long repositoryId);
1311
List<AnalysisResult> findAnalysisResultByRepositoriesId(Long repositoryId);
12+
long countByRepositoriesId(Long repositoryId);
1413
}

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

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package com.backend.domain.analysis.service;
22

3-
import com.backend.domain.evaluation.service.EvaluationService;
4-
import com.backend.domain.repository.dto.response.RepositoryData;
53
import com.backend.domain.analysis.entity.AnalysisResult;
64
import com.backend.domain.analysis.repository.AnalysisResultRepository;
5+
import com.backend.domain.evaluation.service.EvaluationService;
76
import com.backend.domain.repository.dto.response.RepositoryData;
7+
import com.backend.domain.repository.entity.Repositories;
8+
import com.backend.domain.repository.repository.RepositoryJpaRepository;
89
import com.backend.domain.repository.service.RepositoryService;
910
import com.backend.global.exception.BusinessException;
1011
import com.backend.global.exception.ErrorCode;
@@ -13,6 +14,7 @@
1314
import org.springframework.stereotype.Service;
1415
import org.springframework.transaction.annotation.Transactional;
1516

17+
import java.util.Collection;
1618
import java.util.List;
1719

1820
@Slf4j
@@ -21,7 +23,8 @@
2123
public class AnalysisService {
2224
private final RepositoryService repositoryService;
2325
private final AnalysisResultRepository analysisResultRepository;
24-
private final EvaluationService evaluationService; // ★ 추가
26+
private final EvaluationService evaluationService;
27+
private final RepositoryJpaRepository repositoryJpaRepository;
2528

2629

2730
/* Analysis 분석 프로세스 오케스트레이션 담당
@@ -39,7 +42,6 @@ public void analyze(String githubUrl) {
3942
// Repository 데이터 수집
4043
RepositoryData repositoryData;
4144

42-
// log.info("🫠 ResponseData: {}", repositoryData);
4345
// TODO: AI 평가, 저장
4446
try {
4547
repositoryData = repositoryService.fetchAndSaveRepository(owner, repo);
@@ -55,7 +57,6 @@ public void analyze(String githubUrl) {
5557

5658
}
5759

58-
// GitHub URL 파싱하여 owner와 repo 이름 추출
5960
private String[] parseGitHubUrl(String githubUrl) {
6061
log.info("🚩 분석 요청 url: {}", githubUrl);
6162

@@ -102,4 +103,51 @@ public AnalysisResult getAnalysisById(Long analysisId) {
102103
return analysisResultRepository.findById(analysisId)
103104
.orElseThrow(() -> new BusinessException(ErrorCode.ANALYSIS_NOT_FOUND));
104105
}
106+
107+
// Repository 삭제
108+
@Transactional
109+
public void delete(Long repositoriesId){
110+
if (repositoriesId == null) {
111+
throw new BusinessException(ErrorCode.INVALID_INPUT_VALUE);
112+
}
113+
114+
Repositories targetRepository = repositoryJpaRepository.findById(repositoriesId)
115+
.orElseThrow(() -> new BusinessException(ErrorCode.GITHUB_REPO_NOT_FOUND));
116+
117+
repositoryJpaRepository.delete(targetRepository);
118+
}
119+
120+
// 특정 분석 결과 삭제
121+
@Transactional
122+
public void deleteAnalysisResult(Long analysisResultId, Long memberId) {
123+
if (analysisResultId == null) {
124+
throw new BusinessException(ErrorCode.INVALID_INPUT_VALUE);
125+
}
126+
127+
AnalysisResult analysisResult = analysisResultRepository.findById(analysisResultId)
128+
.orElseThrow(() -> new BusinessException(ErrorCode.ANALYSIS_NOT_FOUND));
129+
130+
analysisResultRepository.delete(analysisResult);
131+
}
132+
133+
// 분석 결과 공개 여부 변경
134+
@Transactional
135+
public Repositories updatePublicStatus(Long repositoryId, Long memberId) {
136+
Repositories repository = repositoryJpaRepository.findById(repositoryId)
137+
.orElseThrow(() -> new BusinessException(ErrorCode.GITHUB_REPO_NOT_FOUND));
138+
139+
boolean newStatus = !repository.isPublic();
140+
141+
if (newStatus) {
142+
long analysisCount = analysisResultRepository
143+
.countByRepositoriesId(repositoryId);
144+
145+
if (analysisCount == 0) {
146+
throw new BusinessException(ErrorCode.ANALYSIS_NOT_FOUND);
147+
}
148+
}
149+
150+
repository.updatePublicStatus(newStatus);
151+
return repository;
152+
}
105153
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.backend.domain.community.controller;
2+
3+
import com.backend.domain.analysis.entity.AnalysisResult;
4+
import com.backend.domain.analysis.entity.Score;
5+
import com.backend.domain.analysis.service.AnalysisService;
6+
import com.backend.domain.community.dto.request.CommentRequestDto;
7+
import com.backend.domain.community.dto.request.CommentUpdateRequestDto;
8+
import com.backend.domain.community.dto.response.CommentResponseDto;
9+
import com.backend.domain.community.dto.response.CommunityResponseDto;
10+
import com.backend.domain.community.entity.Comment;
11+
import com.backend.domain.community.service.CommunityService;
12+
import com.backend.domain.repository.entity.Repositories;
13+
import com.backend.domain.repository.service.RepositoryService;
14+
import com.backend.domain.user.entity.User;
15+
import lombok.RequiredArgsConstructor;
16+
import org.springframework.http.ResponseEntity;
17+
import org.springframework.web.bind.annotation.*;
18+
19+
import java.util.ArrayList;
20+
import java.util.List;
21+
22+
@RestController
23+
@RequiredArgsConstructor
24+
@RequestMapping("/api/community")
25+
public class CommunityController {
26+
private final CommunityService communityService;
27+
private final AnalysisService analysisService;
28+
private final RepositoryService repositoryService;
29+
30+
/**
31+
* 커뮤니티 관련 기능이 있는 컨트롤러 입니다.
32+
* - 공개 리포지토리 조회
33+
* - 분석 결과 댓글 작성 / 조회 / 삭제/ 수정
34+
*
35+
*/
36+
37+
// publisRepositories = true (공개여부 : 공개함) 리포지토리 조회
38+
@GetMapping("/repositories")
39+
public ResponseEntity<List<CommunityResponseDto>> getPublicRepositories(){
40+
// publicRepository가 true인 리포지토리 조회
41+
List<Repositories> publicRepository = communityService.getRepositoriesPublicTrue();
42+
List<CommunityResponseDto> communityRepositories = new ArrayList<>();
43+
44+
for(Repositories repo : publicRepository){
45+
List <AnalysisResult> analysisList = analysisService.getAnalysisResultList(repo.getId());
46+
47+
if(!(repo == null)){ // 비어있지 않으면
48+
49+
// 가장 첫번째 값만 사용 : List가 정렬되어서 반환되기 때문에 가장 최신값 사용
50+
AnalysisResult analysisResult = analysisList.get(0);
51+
Score score = analysisResult.getScore();
52+
53+
List<String> languages = repositoryService.getLanguageByRepositoriesId(repo.getId())
54+
.stream()
55+
.map(Enum::name)
56+
.toList();
57+
58+
CommunityResponseDto dto = new CommunityResponseDto(repo, analysisResult, score);
59+
communityRepositories.add(dto);
60+
}
61+
}
62+
return ResponseEntity.ok(communityRepositories);
63+
}
64+
65+
// 댓글 작성
66+
@PostMapping("/{analysisResultId}/write")
67+
public ResponseEntity<CommentResponseDto> addComment(
68+
@PathVariable Long analysisResultId,
69+
@RequestBody CommentRequestDto requestDto
70+
) {
71+
Comment saved = communityService.addComment(
72+
analysisResultId,
73+
requestDto.memberId(),
74+
requestDto.comment()
75+
);
76+
return ResponseEntity.ok(new CommentResponseDto(saved));
77+
}
78+
79+
// 댓글 조회
80+
@GetMapping("/{analysisResultId}/comments")
81+
public ResponseEntity<List<CommentResponseDto>> getCommentsByAnalysisResult(
82+
@PathVariable Long analysisResultId
83+
) {
84+
List<Comment> comments = communityService.getCommentsByAnalysisResult(analysisResultId);
85+
List<CommentResponseDto> response = comments.stream()
86+
.map(CommentResponseDto::new)
87+
.toList();
88+
89+
return ResponseEntity.ok(response);
90+
}
91+
92+
// 댓글 삭제
93+
@DeleteMapping("/delete/{commentId}")
94+
public ResponseEntity<String> deleteCommnt(
95+
@PathVariable Long commentId
96+
){
97+
communityService.deleteComment(commentId);
98+
return ResponseEntity.ok("댓글 삭제 완료");
99+
}
100+
101+
// 댓글 수정
102+
@PatchMapping("/modify/{commentId}/comment")
103+
public ResponseEntity<String> modifyComment(
104+
@PathVariable Long commentId,
105+
@RequestBody CommentUpdateRequestDto updateDto
106+
){
107+
communityService.modifyComment(commentId, updateDto.newComment());
108+
return ResponseEntity.ok("댓글 수정 완료");
109+
}
110+
}

backend/src/main/java/com/backend/domain/community/dto/CommunityResponseDto.java

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.backend.domain.community.dto.request;
2+
3+
public record CommentRequestDto(
4+
Long memberId,
5+
String comment
6+
) {}
7+
8+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.backend.domain.community.dto.request;
2+
3+
public record CommentUpdateRequestDto(
4+
String newComment
5+
) { }
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.backend.domain.community.dto.response;
2+
3+
import com.backend.domain.community.entity.Comment;
4+
5+
import java.time.LocalDateTime;
6+
7+
public record CommentResponseDto(
8+
Long id,
9+
Long memberId,
10+
String comment,
11+
LocalDateTime createDate
12+
) {
13+
public CommentResponseDto(Comment comment) {
14+
this(comment.getId(), comment.getMemberId(), comment.getComment(), comment.getCreateDate());
15+
}
16+
}

0 commit comments

Comments
 (0)