From 8e99cb02e52915073ae9246af1abee40f199217a Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Wed, 30 Jul 2025 11:26:18 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor(Reservation):=20=EC=96=B4=EB=93=9C?= =?UTF-8?q?=EC=9E=84=20=EC=9D=B8=EC=A6=9D=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?memberDetails=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/controller/ReservationController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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( From 8857409ab726b6ca9a164d3080233bcb96a3385b Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Wed, 30 Jul 2025 11:26:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor(Reservation):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ReservationRepository.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) 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); - } From ff8937222375961fd0d21b20393cb76c9ab8af72 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Wed, 30 Jul 2025 11:28:17 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor(Reservation):=20findTodayWaiting?= =?UTF-8?q?=20=EA=B3=B5=ED=86=B5=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20=EB=B0=8F=20=EC=9B=A8=EC=9D=B4=ED=8C=85=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ReservationService.java | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) 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..96f2e7b9 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)); + public List getCompletedWaitingUserDetails(Long storeId, MemberDetails memberDetails) { + authorize(storeId, memberDetails); + List reservations = findTodayWaiting(storeId); - return reservations.stream() - .map(r -> WaitingUserResponse.fromEntity(r)) - .toList(); - } - - 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(); } /** @@ -321,5 +296,32 @@ public EntryStatusResponseDto processEntryStatus(Long storeId, String userId, Me 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; + } } From 10de21769112da124ea503920ebc3056f68ea4ae Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Wed, 30 Jul 2025 11:55:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor(Reservation):=20Redis=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/service/ReservationService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 96f2e7b9..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 @@ -236,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) @@ -252,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 로 전환 @@ -277,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) @@ -290,6 +288,8 @@ 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: