Skip to content

Commit 76eb8d9

Browse files
authored
feat(Community): 공개 리포지토리 조회, 댓글 작성, 조회, 삭제, 수정
feat(Community): 공개 리포지토리 조회, 댓글 작성, 조회, 삭제, 수정
2 parents 975aff6 + b15da5a commit 76eb8d9

File tree

17 files changed

+312
-16
lines changed

17 files changed

+312
-16
lines changed

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

Lines changed: 3 additions & 0 deletions
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")

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.springframework.stereotype.Service;
1515
import org.springframework.transaction.annotation.Transactional;
1616

17+
import java.util.Collection;
1718
import java.util.List;
1819

1920
@Slf4j
@@ -56,7 +57,6 @@ public void analyze(String githubUrl) {
5657

5758
}
5859

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

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+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.backend.domain.community.dto.response;
2+
3+
import com.backend.domain.analysis.entity.AnalysisResult;
4+
import com.backend.domain.analysis.entity.Score;
5+
import com.backend.domain.repository.entity.Repositories;
6+
7+
import java.util.List;
8+
import java.util.stream.Collectors;
9+
10+
public record CommunityResponseDto(
11+
String userName,
12+
String userIamge,
13+
String repositoryName,
14+
String summary,
15+
List<String> language,
16+
int totalScore,
17+
boolean vewingStatus
18+
) {
19+
public CommunityResponseDto(Repositories repositories, AnalysisResult analysis, Score score) {
20+
this(
21+
repositories.getUser().getName(),
22+
repositories.getUser().getImageUrl(),
23+
repositories.getName(),
24+
analysis.getSummary(),
25+
repositories.getLanguages().stream()
26+
.map(language -> language.getLanguage().name())
27+
.collect(Collectors.toList()),
28+
score.getTotalScore(),
29+
repositories.isPublicRepository()
30+
);
31+
}
32+
}

backend/src/main/java/com/backend/domain/community/entity/Comment.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
import com.backend.domain.analysis.entity.AnalysisResult;
44
import com.backend.global.entity.BaseEntity;
55
import jakarta.persistence.*;
6-
import lombok.Getter;
6+
import lombok.*;
77

88
@Entity
99
@Getter
10+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
11+
@AllArgsConstructor
12+
@Builder
1013
public class Comment extends BaseEntity {
1114
// 댓글 id
1215
@Id
@@ -16,7 +19,7 @@ public class Comment extends BaseEntity {
1619
// 분석결과 id
1720
@ManyToOne(optional= false)
1821
@JoinColumn(name = "analysis_result_id", nullable = false)
19-
private AnalysisResult analysisResultId;
22+
private AnalysisResult analysisResult;
2023

2124
// 회원 id
2225
@Column(name = "member_id", nullable = false)
@@ -25,4 +28,10 @@ public class Comment extends BaseEntity {
2528
// 댓글 내용
2629
@Column(columnDefinition = "TEXT", nullable = false)
2730
private String comment;
28-
}
31+
32+
public void updateComment(String newContent) {
33+
if (newContent == null || newContent.isBlank()) {
34+
throw new IllegalArgumentException("댓글 내용은 비어 있을 수 없습니다.");
35+
}
36+
this.comment = newContent;
37+
}}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.backend.domain.community.repository;
22

3+
import com.backend.domain.community.dto.request.CommentUpdateRequestDto;
34
import com.backend.domain.community.entity.Comment;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.stereotype.Repository;
67

8+
import java.util.List;
9+
710
@Repository
811
public interface CommentRepository extends JpaRepository<Comment, Long> {
12+
List<Comment> findByAnalysisResult_Id(Long analysisResultId);
913
}

0 commit comments

Comments
 (0)