Skip to content

Commit

Permalink
refactor: 리뷰 서비스 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
youngsu5582 committed Oct 19, 2024
1 parent 703f187 commit 8940102
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,8 @@ public boolean isReviewed() {
public void updateReviewLink(String reviewLink) {
this.reviewLink = reviewLink;
}

public String getReviewerGithubId() {
return reviewer.getGithubUserId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package corea.matchresult.domain;

import corea.exception.CoreaException;
import corea.exception.ExceptionType;
import corea.matchresult.repository.MatchResultRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class MatchResultReader {

private final MatchResultRepository matchResultRepository;

public MatchResult findOne(long roomId,long reviewerId,long revieweeId) {
return matchResultRepository.findByRoomIdAndReviewerIdAndRevieweeId(roomId, reviewerId, revieweeId)
.orElseThrow(() -> new CoreaException(ExceptionType.NOT_MATCHED_MEMBER));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package corea.matchresult.domain;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@RequiredArgsConstructor
@Transactional
public class MatchResultWriter {

public void reviewComplete(MatchResult matchResult, String prLink) {
matchResult.reviewComplete();
matchResult.updateReviewLink(prLink);
}
}
66 changes: 19 additions & 47 deletions backend/src/main/java/corea/review/service/ReviewService.java
Original file line number Diff line number Diff line change
@@ -1,77 +1,49 @@
package corea.review.service;

import corea.auth.dto.GithubPullRequestReview;
import corea.auth.service.GithubOAuthProvider;
import corea.exception.CoreaException;
import corea.exception.ExceptionType;
import corea.matchresult.domain.MatchResult;
import corea.matchresult.repository.MatchResultRepository;
import corea.member.domain.Member;
import corea.member.repository.MemberRepository;
import corea.room.domain.Room;
import corea.room.repository.RoomRepository;
import corea.matchresult.domain.MatchResultReader;
import corea.matchresult.domain.MatchResultWriter;
import corea.review.dto.GithubPullRequestReview;
import corea.review.infrastructure.GithubReviewProvider;
import corea.room.domain.RoomReader;
import corea.room.domain.RoomStatus;
import lombok.RequiredArgsConstructor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.stream.Stream;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ReviewService {

private static final Logger log = LogManager.getLogger(ReviewService.class);

private final GithubOAuthProvider githubOAuthProvider;
private final RoomRepository roomRepository;
private final MemberRepository memberRepository;
private final MatchResultRepository matchResultRepository;
private final GithubReviewProvider githubReviewProvider;
private final RoomReader roomReader;
private final MatchResultReader matchResultReader;
private final MatchResultWriter matchResultWriter;

@Transactional
public void completeReview(long roomId, long reviewerId, long revieweeId) {
Room room = getRoom(roomId);
validateRoomStatus(room);

MatchResult matchResult = getMatchResult(roomId, reviewerId, revieweeId);
matchResult.reviewComplete();
updateReviewLink(matchResult, reviewerId);

log.info("리뷰 완료[{매칭 ID({}), 리뷰어 ID({}, 리뷰이 ID({})", matchResult.getId(), reviewerId, revieweeId);
}

private Room getRoom(long roomId) {
return roomRepository.findById(roomId)
.orElseThrow(() -> new CoreaException(ExceptionType.ROOM_NOT_FOUND, String.format("해당 Id의 방이 없습니다. 입력된 Id=%d", roomId)));
}

private void validateRoomStatus(Room room) {
if (room.isNotProgress()) {
boolean isNotProgress = roomReader.isNotStatus(roomId, RoomStatus.PROGRESS);
if (isNotProgress) {
throw new CoreaException(ExceptionType.ROOM_STATUS_INVALID);
}
}
MatchResult matchResult = matchResultReader.findOne(roomId, reviewerId, revieweeId);
String prLink = getPrReviewLink(matchResult.getPrLink(), matchResult.getReviewerGithubId());
matchResultWriter.reviewComplete(matchResult, prLink);

private void updateReviewLink(MatchResult matchResult, long reviewerId) {
Member reviewer = memberRepository.findById(reviewerId)
.orElseThrow(() -> new CoreaException(ExceptionType.MEMBER_NOT_FOUND));
String userName = reviewer.getUsername();
String newReviewLink = findReviewLink(userName, matchResult.getPrLink());
matchResult.updateReviewLink(newReviewLink);
log.info("리뷰 완료[{매칭 ID({}), 리뷰어 ID({}, 리뷰이 ID({})", matchResult.getId(), reviewerId, revieweeId);
}

private String findReviewLink(String userName, String prLink) {
GithubPullRequestReview[] githubPullRequestReviews = githubOAuthProvider.getPullRequestReview(prLink);
return Stream.of(githubPullRequestReviews)
.filter(review -> review.user().login().equals(userName))
.findFirst()
private String getPrReviewLink(String prLink, String reviewerGithubId) {
return githubReviewProvider.getReviewWithPrLink(prLink)
.findWithGithubId(reviewerGithubId)
.map(GithubPullRequestReview::html_url)
.orElseThrow(() -> new CoreaException(ExceptionType.NOT_COMPLETE_GITHUB_REVIEW));
}

private MatchResult getMatchResult(long roomId, long reviewerId, long revieweeId) {
return matchResultRepository.findByRoomIdAndReviewerIdAndRevieweeId(roomId, reviewerId, revieweeId)
.orElseThrow(() -> new CoreaException(ExceptionType.NOT_MATCHED_MEMBER));
}
}
4 changes: 2 additions & 2 deletions backend/src/main/java/corea/room/domain/Room.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ public boolean isNotClosed() {
return !isClosed();
}

public boolean isNotProgress() {
return status.isNotProgress();
public boolean isStatus(RoomStatus status) {
return this.status == status;
}

public boolean isNotMatchingManager(long memberId) {
Expand Down
24 changes: 24 additions & 0 deletions backend/src/main/java/corea/room/domain/RoomReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package corea.room.domain;

import corea.exception.CoreaException;
import corea.exception.ExceptionType;
import corea.room.repository.RoomRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class RoomReader {

private final RoomRepository roomRepository;

public boolean isNotStatus(long roomId, RoomStatus status) {
Room room = find(roomId);
return !room.isStatus(status);
}

public Room find(long roomId) {
return roomRepository.findById(roomId)
.orElseThrow(() -> new CoreaException(ExceptionType.ROOM_NOT_FOUND, String.format("해당 Id의 방이 없습니다. 입력된 Id=%d", roomId)));
}
}

0 comments on commit 8940102

Please sign in to comment.