diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java index 6ec51e54..d962de4c 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/controller/ReservationController.java @@ -53,7 +53,7 @@ public ResponseEntity getCompletedReservationList( @PathVariable Long storeId, @AuthenticationPrincipal MemberDetails memberDetails ) { - List response = reservationService.getCompletedWaitingUserDetails(storeId); + List response = reservationService.getCompletedWaitingUserDetails(storeId, memberDetails); return ResponseEntity .ok() .body( diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java index 3ed9fa8d..c5dd1526 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java @@ -5,7 +5,6 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -176,41 +175,17 @@ public List getAllWaitingUserDetails(Long storeId) { // 완료 or 취소 처리된 대기 리스트 조회 @Transactional(readOnly = true) - public List getCompletedWaitingUserDetails(Long storeId) { - List reservations = reservationRepository.findAllByStore_StoreIdAndStatusInAndRequestedAtBetween( - storeId, - List.of(ReservationStatus.CONFIRMED, ReservationStatus.CANCELLED), - LocalDate.now().atStartOfDay(), - LocalDate.now().atTime(LocalTime.MAX)); - - return reservations.stream() - .map(r -> WaitingUserResponse.fromEntity(r)) - .toList(); - } + public List getCompletedWaitingUserDetails(Long storeId, MemberDetails memberDetails) { + authorize(storeId, memberDetails); + List reservations = findTodayWaiting(storeId); - private User authorize(Long storeId, MemberDetails member) { - User u = userRepository.findById(member.getId()) - .orElseThrow(UserNotFoundException::new); - if (!Role.SUPER_ADMIN.equals(u.getRole()) && !storeId.equals(u.getStoreId())) { - throw new ReservationViewUnauthorizedException(); + if (reservations.isEmpty()) { + throw new ReservationNotFoundException(); } - return u; - } - // 공통: 오늘 날짜 예약 조회 - private Reservation findTodayReservation(Long storeId, String userId) { - LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); - LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX); - - return reservationRepository - .findByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetween( - storeId, - Long.valueOf(userId), - List.of(ReservationStatus.WAITING, ReservationStatus.CALLING), - startOfDay, - endOfDay - ) - .orElseThrow(() -> new IllegalArgumentException("오늘 날짜의 예약이 존재하지 않습니다.")); + return reservations.stream() + .map(WaitingUserResponse::fromEntity) + .toList(); } /** @@ -261,9 +236,6 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me // 1) 기존 대기 중이거나 호출 중일 때: Redis → DB 최초 저장 if (ReservationStatus.WAITING.name().equals(currStatus) || ReservationStatus.CALLING.name().equals(currStatus)) { - // Redis 전부 삭제 - waitingRedisRepository.deleteWaiting(storeId, userId); - // 새 Reservation 생성 & 저장 Reservation r = Reservation.builder() .reservationNumber(reservationNumber) @@ -277,6 +249,8 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me // 호출 시각 반영 r.markUpdated(LocalDateTime.now(), ReservationStatus.CONFIRMED); Reservation saved = reservationRepository.save(r); + // Redis 전부 삭제 + waitingRedisRepository.deleteWaiting(storeId, userId); return EntryStatusResponseDto.fromEntity(saved); } else { // 2) 이미 취소(CANCELLED)된 경우: DB 레코드 찾아 바로 CONFIRMED 로 전환 @@ -302,7 +276,6 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me || ReservationStatus.CALLING.name().equals(currStatus))) { throw new IllegalStateException("WAITING/CALLING 상태에서만 취소 가능합니다."); } - waitingRedisRepository.deleteWaiting(storeId, userId); Reservation r = Reservation.builder() .reservationNumber(reservationNumber) @@ -315,11 +288,40 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me r.markUpdated(LocalDateTime.now(), ReservationStatus.CANCELLED); Reservation saved = reservationRepository.save(r); + waitingRedisRepository.deleteWaiting(storeId, userId); + return EntryStatusResponseDto.fromEntity(saved); default: throw new IllegalArgumentException("지원하지 않는 상태: " + newStatus); } } + + + /** + * 공통 메서드 + */ + // 오늘 날짜 예약 조회 + private List findTodayWaiting(Long storeId) { + ZoneId zone = ZoneId.of("Asia/Seoul"); + LocalDate today = LocalDate.now(zone); + + return reservationRepository.findAllByStore_StoreIdAndStatusInAndRequestedAtBetween( + storeId, + List.of(ReservationStatus.CONFIRMED, ReservationStatus.CANCELLED), + today.atStartOfDay(zone).toLocalDateTime(), + today.atTime(LocalTime.MAX) + ); + } + + // 사용자 인증 + private User authorize(Long storeId, MemberDetails member) { + User u = userRepository.findById(member.getId()) + .orElseThrow(UserNotFoundException::new); + if (!Role.SUPER_ADMIN.equals(u.getRole()) && !storeId.equals(u.getStoreId())) { + throw new ReservationViewUnauthorizedException(); + } + return u; + } } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java index 61efa124..17e8c36b 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java @@ -15,26 +15,12 @@ @Repository public interface ReservationRepository extends JpaRepository { List findAllByStore_StoreIdOrderByRequestedAtAsc(Long storeId); - boolean existsByUserAndStoreAndStatusIn(User user, Store store, List statuses); - - Optional findByStore_StoreIdAndUserId(Long storeId, Long userId); - Optional findByStore_StoreIdAndUserIdAndRequestedAtBetween( - Long storeId, Long userId, LocalDateTime start, LocalDateTime end); + boolean existsByUserAndStoreAndStatusIn(User user, Store store, List statuses); Optional findFirstByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetweenOrderByRequestedAtDesc( Long storeId, Long userId, List statuses, LocalDateTime start, LocalDateTime end); List findAllByStore_StoreIdAndStatusInAndRequestedAtBetween( Long storeId, List statuses, LocalDateTime start, LocalDateTime end); - Optional findByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetween( - Long storeId, - Long userId, - List statuses, - LocalDateTime start, - LocalDateTime end - ); - - List findAllByStore_StoreId(Long storeId); - }