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 f6d91d36..5133d2b9 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 @@ -9,11 +9,13 @@ import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.nowait.applicationadmin.reservation.dto.CallingWaitingResponseDto; import com.nowait.applicationadmin.reservation.dto.EntryStatusResponseDto; +import com.nowait.applicationadmin.reservation.dto.ReservationStatusRequest; import com.nowait.applicationadmin.reservation.dto.WaitingUserResponse; import com.nowait.applicationadmin.reservation.service.ReservationService; import com.nowait.common.api.ApiUtils; @@ -67,16 +69,16 @@ public ResponseEntity getCompletedReservationList( // ) // ); // } - @PatchMapping("/admin/update/{storeId}/{userId}/{status}") + @PatchMapping("/admin/update/{storeId}/{userId}") @Operation(summary = "예약팀 상태 업데이트 처리", description = "특정 예약에 대한 입장 완료 처리") @ApiResponse(responseCode = "200", description = "예약팀 상태 변경 : CALLING -> CONFIRMED") public ResponseEntity updateEntry( @PathVariable Long storeId, @PathVariable String userId, - @PathVariable ReservationStatus status, + @RequestBody ReservationStatusRequest request, @AuthenticationPrincipal MemberDetails memberDetails ) { - EntryStatusResponseDto response = reservationService.processEntryStatus(storeId, userId, memberDetails,status); + EntryStatusResponseDto response = reservationService.processEntryStatus(storeId, userId, memberDetails, request.getStatus()); return ResponseEntity .status(HttpStatus.OK) .body( @@ -85,5 +87,4 @@ public ResponseEntity updateEntry( )); } - } diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/ReservationStatusRequest.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/ReservationStatusRequest.java new file mode 100644 index 00000000..9508a8e8 --- /dev/null +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/ReservationStatusRequest.java @@ -0,0 +1,14 @@ +package com.nowait.applicationadmin.reservation.dto; + +import com.nowait.common.enums.ReservationStatus; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ReservationStatusRequest { + private ReservationStatus status; +} 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 abae93f4..b8dfd999 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 @@ -45,10 +45,11 @@ public class ReservationService { private final UserRepository userRepository; private final WaitingRedisRepository waitingRedisRepository; private final StoreRepository storeRepository; + //TODO 성능 비교를 위해 남겨둔 로직 @Transactional(readOnly = true) public ReservationStatusSummaryDto getReservationListByStoreId(Long storeId, MemberDetails memberDetails) { - User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(storeId)) { throw new ReservationViewUnauthorizedException(); } @@ -61,10 +62,14 @@ public ReservationStatusSummaryDto getReservationListByStoreId(Long storeId, Mem int callingCount = 0; List reservationDtoList = new ArrayList<>(); for (Reservation r : reservations) { - if (r.getStatus() == ReservationStatus.WAITING) waitingCount++; - if (r.getStatus() == ReservationStatus.CONFIRMED) confirmedCount++; - if (r.getStatus() == ReservationStatus.CANCELLED) cancelledCount++; - if (r.getStatus() == ReservationStatus.CALLING) callingCount++; + if (r.getStatus() == ReservationStatus.WAITING) + waitingCount++; + if (r.getStatus() == ReservationStatus.CONFIRMED) + confirmedCount++; + if (r.getStatus() == ReservationStatus.CANCELLED) + cancelledCount++; + if (r.getStatus() == ReservationStatus.CALLING) + callingCount++; reservationDtoList.add(ReservationGetResponseDto.fromEntity(r)); } @@ -76,18 +81,22 @@ public ReservationStatusSummaryDto getReservationListByStoreId(Long storeId, Mem .reservationList(reservationDtoList) .build(); } + //TODO 성능 비교를 위해 남겨둔 로직 @Transactional public CallGetResponseDto updateReservationStatus(Long reservationId, ReservationStatusUpdateRequestDto requestDto, MemberDetails memberDetails) { - User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); - Reservation reservation = reservationRepository.findById(reservationId).orElseThrow(ReservationNotFoundException::new); - if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId().equals(reservation.getStore().getStoreId())) { + User user = userRepository.findById(memberDetails.getId()).orElseThrow(UserNotFoundException::new); + Reservation reservation = reservationRepository.findById(reservationId) + .orElseThrow(ReservationNotFoundException::new); + if (!Role.SUPER_ADMIN.equals(user.getRole()) && !user.getStoreId() + .equals(reservation.getStore().getStoreId())) { throw new ReservationUpdateUnauthorizedException(); } - reservation.updateStatus(requestDto.getStatus()); + reservation.updateStatus(requestDto.getStatus()); return CallGetResponseDto.fromEntity(reservation); } + // Redis queue에 있는 주점별 전체 대기열 조회 @Transactional(readOnly = true) public List getAllWaitingUserDetails(Long storeId) { @@ -111,7 +120,8 @@ public List getAllWaitingUserDetails(Long storeId) { ThreadLocalRandom.current().nextInt(1, 100)); Optional reservationOpt = reservationRepository.findFirstByStore_StoreIdAndUserIdAndRequestedAtBetweenOrderByRequestedAtDesc( - storeId, Long.valueOf(userId), LocalDate.now().atStartOfDay(), LocalDate.now().atTime(LocalTime.MAX)); + storeId, Long.valueOf(userId), LocalDate.now().atStartOfDay(), + LocalDate.now().atTime(LocalTime.MAX)); if (reservationOpt.isPresent()) { Reservation reservation = reservationOpt.get(); createdAt = reservation.getRequestedAt(); @@ -120,8 +130,6 @@ public List getAllWaitingUserDetails(Long storeId) { } else { } - - return new WaitingUserResponse( reservationId != null ? reservationId.toString() : null, userId, @@ -150,7 +158,6 @@ public List getCompletedWaitingUserDetails(Long storeId) { .toList(); } - private User authorize(Long storeId, MemberDetails member) { User u = userRepository.findById(member.getId()) .orElseThrow(UserNotFoundException::new); @@ -163,7 +170,7 @@ private User authorize(Long storeId, MemberDetails member) { // 공통: 오늘 날짜 예약 조회 private Reservation findTodayReservation(Long storeId, String userId) { LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); - LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX); + LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX); return reservationRepository .findByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetween( @@ -184,16 +191,16 @@ private Reservation findTodayReservation(Long storeId, String userId) { */ @Transactional public EntryStatusResponseDto processEntryStatus( - Long storeId, - String userId, - MemberDetails member, + Long storeId, + String userId, + MemberDetails member, ReservationStatus newStatus ) { User manager = authorize(storeId, member); User user = userRepository.findById(Long.valueOf(userId)).orElseThrow(UserNotFoundException::new); - String message = null; - Reservation reservation; + String message = null; + Reservation reservation; switch (newStatus) { case CALLING: @@ -206,7 +213,7 @@ public EntryStatusResponseDto processEntryStatus( // 2) 파티 인원, 호출 시각 Integer partySize = waitingRedisRepository.getWaitingPartySize(storeId, userId); - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = LocalDateTime.now(); // 3) DB에 무조건 새로 저장 Store store = storeRepository.getReferenceById(storeId); @@ -245,17 +252,15 @@ public EntryStatusResponseDto processEntryStatus( // 5) 공통 DTO 반환 return EntryStatusResponseDto.builder() - .id( reservation.getId().toString()) - .userId( userId) - .partySize( reservation.getPartySize()) - .userName( user.getNickname()) - .createdAt( reservation.getRequestedAt()) - .status( reservation.getStatus().name()) - .message( message) + .id(reservation.getId().toString()) + .userId(userId) + .partySize(reservation.getPartySize()) + .userName(user.getNickname()) + .createdAt(reservation.getRequestedAt()) + .status(reservation.getStatus().name()) + .message(message) .build(); } - - } diff --git a/nowait-common/src/main/java/com/nowait/common/enums/ReservationStatus.java b/nowait-common/src/main/java/com/nowait/common/enums/ReservationStatus.java index 4d4f58a2..8ede6dd2 100644 --- a/nowait-common/src/main/java/com/nowait/common/enums/ReservationStatus.java +++ b/nowait-common/src/main/java/com/nowait/common/enums/ReservationStatus.java @@ -1,5 +1,5 @@ package com.nowait.common.enums; public enum ReservationStatus { - WAITING,CALLING, CONFIRMED, CANCELLED + WAITING, CALLING, CONFIRMED, CANCELLED }