Skip to content

Commit 15e2c40

Browse files
Merge pull request #108 from prgrms-web-devcourse-final-project/develop
chore: develop → main 브랜치 머지
2 parents 0d0de4f + 6571d4f commit 15e2c40

29 files changed

+381
-82
lines changed
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package grep.neogul_coder.domain.prtemplate.controller.dto.request;
22

3+
import io.swagger.v3.oas.annotations.media.Schema;
34
import lombok.Data;
45

56
@Data
67
public class LinkUpdateRequest {
78

8-
private String prUrl;
9+
@Schema(description = "링크 이름", example = "인스타그램")
910
private String urlName;
1011

12+
@Schema(description = "링크 URL", example = "https://instagram.com/example")
13+
private String prUrl;
14+
1115
}

src/main/java/grep/neogul_coder/domain/prtemplate/controller/dto/request/PrUpdateRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class PrUpdateRequest {
1414
private String location;
1515

1616
@Size(max = 2, message = "링크는 최대 2개 까지 가능합니다.")
17-
@Schema(description = "PR 링크 목록", example = "[\"https://instagram.com/example\"]")
17+
@Schema(description = "PR 링크 목록", example = "[{\"urlName\": \"인스타그램\", \"prUrl\": \"https://instagram.com/example\"}]")
1818
private List<LinkUpdateRequest> prUrls;
19+
1920
}

src/main/java/grep/neogul_coder/domain/prtemplate/repository/LinkRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
@Repository
99
public interface LinkRepository extends JpaRepository<Link, Long> {
1010
Link findByPrId(Long prId);
11-
11+
List<Link> findAllByPrIdAndActivatedTrue(Long prId);
1212
List<Link> findAllByPrId(Long prId);
1313
}

src/main/java/grep/neogul_coder/domain/prtemplate/service/LinkService.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package grep.neogul_coder.domain.prtemplate.service;
22

33
import grep.neogul_coder.domain.prtemplate.controller.dto.request.LinkUpdateRequest;
4-
import grep.neogul_coder.domain.prtemplate.controller.dto.request.PrUpdateRequest;
54
import grep.neogul_coder.domain.prtemplate.entity.Link;
6-
import grep.neogul_coder.domain.prtemplate.entity.PrTemplate;
7-
import grep.neogul_coder.domain.prtemplate.exception.code.PrTemplateErrorCode;
85
import grep.neogul_coder.domain.prtemplate.repository.LinkRepository;
96
import grep.neogul_coder.domain.prtemplate.repository.PrTemplateRepository;
10-
import grep.neogul_coder.global.exception.business.NotFoundException;
117
import jakarta.transaction.Transactional;
12-
import jakarta.validation.constraints.Size;
13-
import java.util.List;
148
import lombok.RequiredArgsConstructor;
159
import org.springframework.stereotype.Service;
1610

11+
import java.util.List;
12+
1713
@Service
1814
@RequiredArgsConstructor
1915
@Transactional
@@ -28,13 +24,19 @@ public void deleteByPrId(Long prId) {
2824
}
2925

3026
public void update(Long prId, List<LinkUpdateRequest> prUrls) {
31-
linkRepository.findByPrId(prId);
27+
List<Link> existingLinks = linkRepository.findAllByPrId(prId);
28+
for (Link link : existingLinks) {
29+
link.delete();
30+
}
31+
linkRepository.saveAll(existingLinks);
3232

3333
for (LinkUpdateRequest request : prUrls) {
3434
Link link = Link.builder()
35-
.prId(prId)
36-
.prUrl(request.getPrUrl())
37-
.build();
35+
.prId(prId)
36+
.urlName(request.getUrlName())
37+
.prUrl(request.getPrUrl())
38+
.activated(true)
39+
.build();
3840

3941
linkRepository.save(link);
4042
}

src/main/java/grep/neogul_coder/domain/prtemplate/service/PrTemplateService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public PrPageResponse toResponse(Long userId) {
5555
User user = userRepository.findById(userId).orElseThrow(() -> new NotFoundException(
5656
UserErrorCode.USER_NOT_FOUND, "회원이 존재하지 않습니다."));
5757
PrTemplate prTemplate = prTemplateRepository.findByUserId(userId);
58-
List<Link> links = linkRepository.findAllByPrId(prTemplate.getId());
58+
List<Link> links = linkRepository.findAllByPrIdAndActivatedTrue(prTemplate.getId());
5959
List<ReviewEntity> reviews = reviewRepository.findAllByTargetUserId(userId);
6060

6161
List<PrPageResponse.UserProfileDto> userProfiles = List.of(

src/main/java/grep/neogul_coder/domain/review/ReviewErrorCode.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
@Getter
88
public enum ReviewErrorCode implements ErrorCode {
99
NOT_SINGLE_REVIEW_TYPE(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "단일 리뷰 타입이 아닙니다. ( ex) GOOD, BAD 혼합 )"),
10-
STUDY_MEMBER_EMPTY(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "스터디 맴버들을 조회 하였으나 스터디 맴버가 없습니다");
10+
ALREADY_REVIEW_WRITE_USER(HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST.name(), "이미 리뷰를 작성한 회원 입니다"),
11+
12+
STUDY_MEMBER_EMPTY(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "스터디 맴버들을 조회 하였으나 스터디 맴버가 없습니다"),
13+
STUDY_NOT_FOUND(HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND.name(), "스터디를 찾지 못했습니다.");
1114

1215
private static final String BASIC_ERROR_NAME = "REVIEW";
1316
private final HttpStatus status;

src/main/java/grep/neogul_coder/domain/review/controller/dto/request/ReviewSaveRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class ReviewSaveRequest {
3131
@Schema(example = "너무 친절 하세요!", description = "주관 리뷰")
3232
private String content;
3333

34+
private ReviewSaveRequest() {}
35+
3436
@Builder
3537
private ReviewSaveRequest(long studyId, long targetUserId, ReviewType reviewType,
3638
List<String> reviewTag, String content) {

src/main/java/grep/neogul_coder/domain/review/repository/ReviewQueryRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,14 @@ public Page<ReviewEntity> findContentsPagingBy(Pageable pageable, long userId) {
3737

3838
return new PageImpl<>(reviews, pageable, (total != null) ? total : 0L);
3939
}
40+
41+
public ReviewEntity findBy(long studyId, long targetUserId, long writeUserId) {
42+
return queryFactory.selectFrom(reviewEntity)
43+
.where(
44+
reviewEntity.studyId.eq(studyId),
45+
reviewEntity.targetUserId.eq(targetUserId),
46+
reviewEntity.writeUserId.eq(writeUserId)
47+
)
48+
.fetchOne();
49+
}
4050
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package grep.neogul_coder.domain.review.repository;
22

3-
import grep.neogul_coder.domain.review.Review;
43
import grep.neogul_coder.domain.review.entity.ReviewEntity;
54
import org.springframework.data.jpa.repository.JpaRepository;
65

76
import java.util.List;
87

98
public interface ReviewRepository extends JpaRepository<ReviewEntity, Long> {
109
List<ReviewEntity> findByTargetUserId(long userId);
10+
1111
List<ReviewEntity> findAllByTargetUserId(Long userId);
1212
}

src/main/java/grep/neogul_coder/domain/review/service/ReviewService.java

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import grep.neogul_coder.domain.study.Study;
1616
import grep.neogul_coder.domain.study.StudyMember;
1717
import grep.neogul_coder.domain.study.repository.StudyMemberRepository;
18+
import grep.neogul_coder.domain.study.repository.StudyRepository;
1819
import grep.neogul_coder.domain.users.entity.User;
1920
import grep.neogul_coder.domain.users.repository.UserRepository;
21+
import grep.neogul_coder.global.exception.business.BusinessException;
2022
import grep.neogul_coder.global.exception.business.NotFoundException;
2123
import lombok.RequiredArgsConstructor;
2224
import org.springframework.data.domain.Page;
@@ -29,14 +31,15 @@
2931
import java.util.function.Function;
3032
import java.util.stream.Collectors;
3133

32-
import static grep.neogul_coder.domain.review.ReviewErrorCode.STUDY_MEMBER_EMPTY;
34+
import static grep.neogul_coder.domain.review.ReviewErrorCode.*;
3335

3436
@Transactional(readOnly = true)
3537
@RequiredArgsConstructor
3638
@Service
3739
public class ReviewService {
3840

3941
private final UserRepository userRepository;
42+
private final StudyRepository studyRepository;
4043
private final StudyMemberRepository studyMemberRepository;
4144

4245
private final ReviewTagFinder reviewTagFinder;
@@ -46,21 +49,26 @@ public class ReviewService {
4649
private final ReviewTagRepository reviewTagRepository;
4750

4851
public ReviewTargetUsersInfo getReviewTargetUsersInfo(long studyId, String myNickname) {
49-
List<StudyMember> studyMembers = studyMemberRepository.findByStudyIdFetchStudy(studyId);
50-
List<User> targetUsers = findReviewTargetUsers(studyMembers, myNickname);
51-
Study study = extractStudyFrom(studyMembers);
52+
Study study = findValidStudy(studyId);
53+
List<StudyMember> studyMembers = findValidStudyMember(studyId);
5254

55+
List<User> targetUsers = findReviewTargetUsers(studyMembers, myNickname);
5356
return ReviewTargetUsersInfo.of(study, targetUsers);
5457
}
5558

5659
@Transactional
57-
public void save(ReviewSaveServiceRequest request, long userId) {
60+
public void save(ReviewSaveServiceRequest request, long writeUserId) {
61+
if(isAlreadyWrittenReviewBy(request.getStudyId(), request.getTargetUserId(), writeUserId)){
62+
throw new BusinessException(ALREADY_REVIEW_WRITE_USER, ALREADY_REVIEW_WRITE_USER.getMessage());
63+
}
64+
65+
Study study = findValidStudy(request.getStudyId());
5866
ReviewTags reviewTags = ReviewTags.from(convertStringToReviewTag(request.getReviewTag()));
5967
ReviewType reviewType = reviewTags.ensureSingleReviewType();
6068

61-
Review review = request.toReview(reviewTags.getReviewTags(), reviewType, userId);
69+
Review review = request.toReview(reviewTags.getReviewTags(), reviewType, writeUserId);
6270
List<ReviewTagEntity> reviewTagEntities = mapToReviewTagEntities(reviewTags);
63-
reviewRepository.save(ReviewEntity.from(review, reviewTagEntities, request.getStudyId()));
71+
reviewRepository.save(ReviewEntity.from(review, reviewTagEntities, study.getId()));
6472
}
6573

6674
public MyReviewTagsInfo getMyReviewTags(long userId) {
@@ -81,6 +89,20 @@ public ReviewContentsPagingInfo getMyReviewContents(Pageable pageable, long user
8189
return ReviewContentsPagingInfo.of(reviewPages, userIdMap);
8290
}
8391

92+
private Study findValidStudy(long studyId){
93+
return studyRepository.findById(studyId)
94+
.orElseThrow(() -> new NotFoundException(STUDY_NOT_FOUND, STUDY_NOT_FOUND.getMessage()));
95+
}
96+
97+
private List<StudyMember> findValidStudyMember(long studyId) {
98+
List<StudyMember> studyMembers = studyMemberRepository.findByStudyIdFetchStudy(studyId);
99+
100+
if (studyMembers.isEmpty()) {
101+
throw new NotFoundException(STUDY_MEMBER_EMPTY, STUDY_MEMBER_EMPTY.getMessage());
102+
}
103+
return studyMembers;
104+
}
105+
84106
private List<User> findReviewTargetUsers(List<StudyMember> studyMembers, String myNickname) {
85107
List<Long> userIds = studyMembers.stream()
86108
.map(StudyMember::getUserId)
@@ -92,11 +114,8 @@ private List<User> findReviewTargetUsers(List<StudyMember> studyMembers, String
92114
.toList();
93115
}
94116

95-
private Study extractStudyFrom(List<StudyMember> studyMembers) {
96-
if (studyMembers.isEmpty()) {
97-
throw new NotFoundException(STUDY_MEMBER_EMPTY, STUDY_MEMBER_EMPTY.getMessage());
98-
}
99-
return studyMembers.getFirst().getStudy();
117+
private boolean isAlreadyWrittenReviewBy(long studyId, long targetUserId, long writeUserId) {
118+
return reviewQueryRepository.findBy(studyId, targetUserId, writeUserId) != null;
100119
}
101120

102121
private List<ReviewTag> convertStringToReviewTag(List<String> reviewTags) {

0 commit comments

Comments
 (0)