diff --git a/src/main/java/com/aliens/backend/auth/domain/Member.java b/src/main/java/com/aliens/backend/auth/domain/Member.java index dcded02b..4de7626e 100644 --- a/src/main/java/com/aliens/backend/auth/domain/Member.java +++ b/src/main/java/com/aliens/backend/auth/domain/Member.java @@ -125,10 +125,9 @@ public String getFcmToken() { } public void applyMatch() { - if (status.equals(MatchingStatus.NOT_APPLIED_MATCHED)) { + if (status == MatchingStatus.NOT_APPLIED_MATCHED) { status = MatchingStatus.APPLIED_MATCHED; - } - if (status.equals(MatchingStatus.NOT_APPLIED_NOT_MATCHED)) { + } else if (status == MatchingStatus.NOT_APPLIED_NOT_MATCHED) { status = MatchingStatus.APPLIED_NOT_MATCHED; } } @@ -138,19 +137,17 @@ public void matched() { } public void expireMatch() { - if (status.equals(MatchingStatus.APPLIED_MATCHED)) { + if (status == MatchingStatus.APPLIED_MATCHED) { status = MatchingStatus.APPLIED_NOT_MATCHED; - } - if (status.equals(MatchingStatus.NOT_APPLIED_MATCHED)) { + } else if (status == MatchingStatus.NOT_APPLIED_MATCHED || status == MatchingStatus.APPLIED_NOT_MATCHED) { status = MatchingStatus.NOT_APPLIED_NOT_MATCHED; } } public void cancelApplication() { - if (status.equals(MatchingStatus.APPLIED_MATCHED)) { + if (status == MatchingStatus.APPLIED_MATCHED) { status = MatchingStatus.NOT_APPLIED_MATCHED; - } - if (status.equals(MatchingStatus.APPLIED_NOT_MATCHED)) { + } else if (status == MatchingStatus.APPLIED_NOT_MATCHED) { status = MatchingStatus.NOT_APPLIED_NOT_MATCHED; } } diff --git a/src/main/java/com/aliens/backend/global/response/error/MatchingError.java b/src/main/java/com/aliens/backend/global/response/error/MatchingError.java index 40e5b979..14361340 100644 --- a/src/main/java/com/aliens/backend/global/response/error/MatchingError.java +++ b/src/main/java/com/aliens/backend/global/response/error/MatchingError.java @@ -9,7 +9,6 @@ public enum MatchingError implements ErrorCode { NOT_FOUND_PREFER_LANGUAGE(HttpStatus.NOT_FOUND, "MA4", "선호 언어를 찾을 수 없음"), INVALID_LANGUAGE_INPUT(HttpStatus.BAD_REQUEST, "MA5", "두 선호 언어가 같을 수 없음"), DUPLICATE_MATCHING_APPLICATION(HttpStatus.BAD_REQUEST, "MA6", "중복된 매칭 신청"), - ; private final HttpStatus httpStatusCode; diff --git a/src/main/java/com/aliens/backend/mathcing/business/model/Participant.java b/src/main/java/com/aliens/backend/mathcing/business/model/Participant.java index 2aeaac06..01644d22 100644 --- a/src/main/java/com/aliens/backend/mathcing/business/model/Participant.java +++ b/src/main/java/com/aliens/backend/mathcing/business/model/Participant.java @@ -74,4 +74,8 @@ public boolean hasBlocked(Participant participant) { public boolean hasPartner() { return !partners.isEmpty(); } + + public void expireMatch() { + member.expireMatch(); + } } diff --git a/src/main/java/com/aliens/backend/mathcing/domain/MatchingApplication.java b/src/main/java/com/aliens/backend/mathcing/domain/MatchingApplication.java index 8f73d64a..3527e411 100644 --- a/src/main/java/com/aliens/backend/mathcing/domain/MatchingApplication.java +++ b/src/main/java/com/aliens/backend/mathcing/domain/MatchingApplication.java @@ -59,6 +59,11 @@ public void modifyTo(final MatchingApplicationRequest matchingApplicationRequest this.secondPreferLanguage = matchingApplicationRequest.secondPreferLanguage(); } + public void expireMatch() { + Member member = getMember(); + member.expireMatch(); + } + public MatchingApplicationId getId() { return id; } diff --git a/src/main/java/com/aliens/backend/mathcing/domain/MatchingResult.java b/src/main/java/com/aliens/backend/mathcing/domain/MatchingResult.java index 08888321..92522c48 100644 --- a/src/main/java/com/aliens/backend/mathcing/domain/MatchingResult.java +++ b/src/main/java/com/aliens/backend/mathcing/domain/MatchingResult.java @@ -39,13 +39,6 @@ public void matchEach() { matchedMember.matched(); } - public void expireMatch() { - Member matchingMember = getMatchingMember(); - Member matchedMember = getMatchedMember(); - matchingMember.expireMatch(); - matchedMember.expireMatch(); - } - public MatchingRound getMatchingRound() { return id.getMatchingRound(); } diff --git a/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingApplicationRepository.java b/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingApplicationRepository.java index 4b5523e1..bbd203d6 100644 --- a/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingApplicationRepository.java +++ b/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingApplicationRepository.java @@ -12,8 +12,8 @@ @Repository public interface MatchingApplicationRepository extends JpaRepository { - @Query("SELECT ma FROM MatchingApplication ma WHERE ma.id.matchingRound = :matchingRound") - List findAllByMatchingRound(MatchingRound matchingRound); + @Query("SELECT ma FROM MatchingApplication ma WHERE ma.id.matchingRound.round = :round") + List findAllByRound(Long round); @Query("SELECT ma FROM MatchingApplication ma WHERE ma.id.matchingRound = :matchingRound AND ma.id.member.id = :memberId") Optional findByMatchingRoundAndMemberId(MatchingRound matchingRound, Long memberId); diff --git a/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingRoundRepository.java b/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingRoundRepository.java index e2f57b47..9fd8f3b3 100644 --- a/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingRoundRepository.java +++ b/src/main/java/com/aliens/backend/mathcing/domain/repository/MatchingRoundRepository.java @@ -11,6 +11,4 @@ public interface MatchingRoundRepository extends JpaRepository { @Query("SELECT mr FROM MatchingRound mr WHERE mr.round = (SELECT MAX(mr.round) FROM MatchingRound mr)") Optional findCurrentRound(); - - Optional findMatchingRoundByRound(Long round); } diff --git a/src/main/java/com/aliens/backend/mathcing/service/MatchingProcessService.java b/src/main/java/com/aliens/backend/mathcing/service/MatchingProcessService.java index 45ec014c..48218d78 100644 --- a/src/main/java/com/aliens/backend/mathcing/service/MatchingProcessService.java +++ b/src/main/java/com/aliens/backend/mathcing/service/MatchingProcessService.java @@ -82,7 +82,6 @@ public List findMatchingResult(final LoginMember loginMe .toList(); } - private ChatParticipant getChatParticipant(final LoginMember loginMember, final MatchingResult result) { return chatParticipantRepository.findByMemberIdAndMatchedMemberId(loginMember.memberId(), result.getMatchedMemberId()) .orElseThrow(() -> new RestApiException(MatchingError.NOT_FOUND_MATCHING_APPLICATION_INFO)); } @@ -92,12 +91,12 @@ private MatchingApplication findMatchedMemberApplicationByRoundAndMemberId(Match .orElseThrow(() -> new RestApiException(MatchingError.NOT_FOUND_MATCHING_APPLICATION_INFO)); } - @Scheduled(cron = "${matching.round.end}") @Transactional public void expireMatching() { List previousMatchingResults = getPreviousMatchingResults(); - previousMatchingResults.forEach(MatchingResult::expireMatch); + List previousMatchingApplications = getPreviousMatchingApplications(); + previousMatchingApplications.forEach(MatchingApplication::expireMatch); eventPublisher.expireChatRoom(previousMatchingResults); } @@ -106,8 +105,17 @@ private void saveMatchingResult(final MatchingRound matchingRound, final List participant.partners().stream() .map(partner -> MatchingResult.from(matchingRound, participant, partner))) .forEach(this::matchBetween); - eventPublisher.createChatRoom(participants); - eventPublisher.sendNotification(participants); + participants.stream() + .filter(participant -> !participant.hasPartner()) + .forEach(Participant::expireMatch); + if (hasMatchedParticipants(participants)) { + eventPublisher.createChatRoom(participants); + eventPublisher.sendNotification(participants); + } + } + + private boolean hasMatchedParticipants(List participants) { + return !participants.stream().filter(Participant::hasPartner).toList().isEmpty(); } private void checkHasApplied(final List matchingResults) { @@ -126,7 +134,7 @@ private List getMatchingResults(final MatchingRound matchingRoun } private List getMatchingApplications(final MatchingRound matchingRound) { - return matchingApplicationRepository.findAllByMatchingRound(matchingRound); + return matchingApplicationRepository.findAllByRound(matchingRound.getRound()); } private List getPreviousMatchingResults() { @@ -135,6 +143,12 @@ private List getPreviousMatchingResults() { return matchingResultRepository.findAllByRound(previousRound); } + private List getPreviousMatchingApplications() { + MatchingRound currentRound = getCurrentRound(); + Long previousRound = currentRound.getPreviousRound(); + return matchingApplicationRepository.findAllByRound(previousRound); + } + private List getBlockListByMatchingApplications(final List matchingApplications) { List blockHistory = matchingApplications.stream() .map(MatchingApplication::getMember) diff --git a/src/test/java/com/aliens/backend/matching/unit/service/MatchingApplicationServiceTest.java b/src/test/java/com/aliens/backend/matching/unit/service/MatchingApplicationServiceTest.java index 72b730c6..62ab3ab8 100644 --- a/src/test/java/com/aliens/backend/matching/unit/service/MatchingApplicationServiceTest.java +++ b/src/test/java/com/aliens/backend/matching/unit/service/MatchingApplicationServiceTest.java @@ -141,6 +141,20 @@ void applyNextMatchAndCancel() { assertThat(result).isEqualTo(MatchingStatus.NOT_APPLIED_MATCHED.getMessage()); } + @Test + @DisplayName("매칭을 신청했으나, 매칭되지 않은 사용자의 매칭 상태가 정상적으로 변경됨") + void changeMatchingStatusIfNotMatched() { + // given + matchingApplicationService.saveParticipant(loginMember, matchingApplicationRequest); + + // when + dummyGenerator.operateMatching(); + + // then + Member notMatchedMember = getMemberById(member.getId()); + assertThat(notMatchedMember.getStatus()).isEqualTo(MatchingStatus.NOT_APPLIED_NOT_MATCHED.getMessage()); + } + @Test @DisplayName("지정 시간 외 매칭 신청시, 에러 발생") void applyMatchIfNotValidTime() {