Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public ResponseEntity<?> getCompletedReservationList(
@PathVariable Long storeId,
@AuthenticationPrincipal MemberDetails memberDetails
) {
List<WaitingUserResponse> response = reservationService.getCompletedWaitingUserDetails(storeId);
List<WaitingUserResponse> response = reservationService.getCompletedWaitingUserDetails(storeId, memberDetails);
return ResponseEntity
.ok()
.body(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -176,41 +175,17 @@ public List<WaitingUserResponse> getAllWaitingUserDetails(Long storeId) {

// 완료 or 취소 처리된 대기 리스트 조회
@Transactional(readOnly = true)
public List<WaitingUserResponse> getCompletedWaitingUserDetails(Long storeId) {
List<Reservation> 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<WaitingUserResponse> getCompletedWaitingUserDetails(Long storeId, MemberDetails memberDetails) {
authorize(storeId, memberDetails);
List<Reservation> 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();
}

/**
Expand Down Expand Up @@ -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)
Expand All @@ -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 로 전환
Expand All @@ -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)
Expand All @@ -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<Reservation> 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;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,12 @@
@Repository
public interface ReservationRepository extends JpaRepository<Reservation, Long> {
List<Reservation> findAllByStore_StoreIdOrderByRequestedAtAsc(Long storeId);
boolean existsByUserAndStoreAndStatusIn(User user, Store store, List<ReservationStatus> statuses);

Optional<Reservation> findByStore_StoreIdAndUserId(Long storeId, Long userId);

Optional<Reservation> findByStore_StoreIdAndUserIdAndRequestedAtBetween(
Long storeId, Long userId, LocalDateTime start, LocalDateTime end);
boolean existsByUserAndStoreAndStatusIn(User user, Store store, List<ReservationStatus> statuses);

Optional<Reservation> findFirstByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetweenOrderByRequestedAtDesc(
Long storeId, Long userId, List<ReservationStatus> statuses, LocalDateTime start, LocalDateTime end);

List<Reservation> findAllByStore_StoreIdAndStatusInAndRequestedAtBetween(
Long storeId, List<ReservationStatus> statuses, LocalDateTime start, LocalDateTime end);
Optional<Reservation> findByStore_StoreIdAndUserIdAndStatusInAndRequestedAtBetween(
Long storeId,
Long userId,
List<ReservationStatus> statuses,
LocalDateTime start,
LocalDateTime end
);

List<Reservation> findAllByStore_StoreId(Long storeId);

}