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 @@ -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;
Expand Down Expand Up @@ -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(
Expand All @@ -85,5 +87,4 @@ public ResponseEntity<?> updateEntry(
));
}


}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand All @@ -61,10 +62,14 @@ public ReservationStatusSummaryDto getReservationListByStoreId(Long storeId, Mem
int callingCount = 0;
List<ReservationGetResponseDto> 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));
}

Expand All @@ -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<WaitingUserResponse> getAllWaitingUserDetails(Long storeId) {
Expand All @@ -111,7 +120,8 @@ public List<WaitingUserResponse> getAllWaitingUserDetails(Long storeId) {
ThreadLocalRandom.current().nextInt(1, 100));

Optional<Reservation> 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();
Expand All @@ -120,8 +130,6 @@ public List<WaitingUserResponse> getAllWaitingUserDetails(Long storeId) {
} else {
}



return new WaitingUserResponse(
reservationId != null ? reservationId.toString() : null,
userId,
Expand Down Expand Up @@ -150,7 +158,6 @@ public List<WaitingUserResponse> getCompletedWaitingUserDetails(Long storeId) {
.toList();
}


private User authorize(Long storeId, MemberDetails member) {
User u = userRepository.findById(member.getId())
.orElseThrow(UserNotFoundException::new);
Expand All @@ -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(
Expand All @@ -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:
Expand All @@ -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);
Expand Down Expand Up @@ -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();
}



}

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.nowait.common.enums;

public enum ReservationStatus {
WAITING,CALLING, CONFIRMED, CANCELLED
WAITING, CALLING, CONFIRMED, CANCELLED
}