diff --git a/src/main/java/ita/tinybite/domain/notification/controller/FcmTokenController.java b/src/main/java/ita/tinybite/domain/notification/controller/FcmTokenController.java index 363a463..122fb08 100644 --- a/src/main/java/ita/tinybite/domain/notification/controller/FcmTokenController.java +++ b/src/main/java/ita/tinybite/domain/notification/controller/FcmTokenController.java @@ -30,7 +30,7 @@ public ResponseEntity registerToken(@RequestBody @Valid FcmTokenRequest re return ResponseEntity.noContent().build(); } - @PostMapping("/test") + @PostMapping("/Test") public ResponseEntity test(@RequestParam Long userId) { notificationFacade.notifyTest(userId); return ResponseEntity.ok().build(); diff --git a/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java b/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java index a25f07d..4707fa7 100644 --- a/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java +++ b/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java @@ -81,6 +81,19 @@ List findActivePartiesByUserIdExcludingHost( @Param("participantStatus") ParticipantStatus participantStatus ); + @Query("SELECT pp FROM PartyParticipant pp " + + "JOIN FETCH pp.party p " + + "JOIN FETCH p.host " + + "WHERE pp.user.userId = :userId " + + "AND p.host.userId != :userId " + + "AND p.status IN :partyStatuses " + + "AND pp.status = :participantStatus") + List findActivePartiesByUserIdExcludingHostAndStatusIn( + @Param("userId") Long userId, + @Param("partyStatuses") List partyStatuses, + @Param("participantStatus") ParticipantStatus participantStatus + ); + int countByPartyIdAndStatusAndUser_UserIdNot(Long partyId, ParticipantStatus participantStatus, Long userId); List findAllByPartyAndStatus(Party party, ParticipantStatus status); diff --git a/src/main/java/ita/tinybite/domain/party/repository/PartyRepository.java b/src/main/java/ita/tinybite/domain/party/repository/PartyRepository.java index 7b30fd5..63876f5 100644 --- a/src/main/java/ita/tinybite/domain/party/repository/PartyRepository.java +++ b/src/main/java/ita/tinybite/domain/party/repository/PartyRepository.java @@ -23,6 +23,8 @@ public interface PartyRepository extends JpaRepository { List findByHostUserIdAndStatus(Long userId, PartyStatus partyStatus); + List findByHostUserIdAndStatusIn(Long userId, List statuses); + List findByTown(String location); List findByTownAndCategory(String location, PartyCategory category); diff --git a/src/main/java/ita/tinybite/domain/party/service/PartyService.java b/src/main/java/ita/tinybite/domain/party/service/PartyService.java index b0c47f5..34b59d5 100644 --- a/src/main/java/ita/tinybite/domain/party/service/PartyService.java +++ b/src/main/java/ita/tinybite/domain/party/service/PartyService.java @@ -580,8 +580,8 @@ public void approveParticipant(Long partyId, Long participantId, Long hostId) { partyId ); - // 목표 인원 달성 확인 - checkAndCloseIfFull(party); + // 정원이 찼으면 모집 완료 상태로 변경 + checkAndCompleteIfFull(party); } /** @@ -783,10 +783,14 @@ private void validateGroupChatRoomAccess(Party party, Long userId) { } } - // ?? - private void checkAndCloseIfFull(Party party) { + /** + * 정원이 찼으면 모집 완료 상태로 변경 + * - COMPLETED: 정원이 찼거나 모집이 완료된 상태 (파티 진행 중) + * - CLOSED: 파티가 정상적으로 종료된 상태 (결산 완료 후) + */ + private void checkAndCompleteIfFull(Party party) { if (party.getCurrentParticipants() >= party.getMaxParticipants()) { - party.close(); + party.changePartyStatus(PartyStatus.COMPLETED); } } diff --git a/src/main/java/ita/tinybite/domain/user/service/UserService.java b/src/main/java/ita/tinybite/domain/user/service/UserService.java index 3ad2ae4..9c1f18e 100644 --- a/src/main/java/ita/tinybite/domain/user/service/UserService.java +++ b/src/main/java/ita/tinybite/domain/user/service/UserService.java @@ -179,7 +179,11 @@ public RejoinValidationResponse validateRejoin(String email) { } public List getHostingParties(Long userId, Double latitude, Double longitude) { - List parties = partyRepository.findByHost_UserId(userId); + List parties = partyRepository.findByHostUserIdAndStatusIn( + userId, + Arrays.asList(PartyStatus.RECRUITING, PartyStatus.COMPLETED) + ); + return parties.stream() .sorted(Comparator.comparing(Party::getCreatedAt).reversed()) .map(party -> { @@ -194,9 +198,9 @@ public List getHostingParties(Long userId, Double latitude, D public List getParticipatingParties(Long userId, Double latitude, Double longitude) { List participants = participantRepository - .findActivePartiesByUserIdExcludingHost( + .findActivePartiesByUserIdExcludingHostAndStatusIn( userId, - PartyStatus.RECRUITING, + Arrays.asList(PartyStatus.RECRUITING, PartyStatus.COMPLETED), ParticipantStatus.APPROVED );