-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
703f187
commit 8940102
Showing
6 changed files
with
84 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
backend/src/main/java/corea/matchresult/domain/MatchResultReader.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
backend/src/main/java/corea/matchresult/domain/MatchResultWriter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
66
backend/src/main/java/corea/review/service/ReviewService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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))); | ||
} | ||
} |