diff --git a/src/main/java/com/example/gtable/reservation/controller/ReservationController.java b/src/main/java/com/example/gtable/reservation/controller/ReservationController.java index fcf6fd7..e53f4be 100644 --- a/src/main/java/com/example/gtable/reservation/controller/ReservationController.java +++ b/src/main/java/com/example/gtable/reservation/controller/ReservationController.java @@ -1,24 +1,29 @@ package com.example.gtable.reservation.controller; - -import java.util.List; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; - import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +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.example.gtable.global.api.ApiUtils; import com.example.gtable.global.security.oauth2.dto.CustomOAuth2User; +import com.example.gtable.reservation.dto.CallGetResponseDto; import com.example.gtable.reservation.dto.ReservationCreateRequestDto; import com.example.gtable.reservation.dto.ReservationCreateResponseDto; -import com.example.gtable.reservation.dto.ReservationGetResponseDto; +import com.example.gtable.reservation.dto.ReservationStatusSummaryDto; +import com.example.gtable.reservation.dto.ReservationStatusUpdateRequestDto; import com.example.gtable.reservation.service.ReservationService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; @Tag(name = "Reservation API", description = "예약 API") @RestController @RequestMapping("/reservations") @@ -48,7 +53,7 @@ public ResponseEntity create( @Operation(summary = "주점별 예약리스트 조회", description = "특정 주점에 대한 예약리스트 조회") @ApiResponse(responseCode = "200", description = "예약리스트 조회") public ResponseEntity getReservationListByStoreId(@PathVariable Long storeId) { - List response = reservationService.getReservationListByStoreId(storeId); + ReservationStatusSummaryDto response = reservationService.getReservationListByStoreId(storeId); return ResponseEntity .status(HttpStatus.OK) .body( @@ -58,18 +63,20 @@ public ResponseEntity getReservationListByStoreId(@PathVariable Long storeId) ); } - // @PatchMapping("/{id}/status") - // public ReservationDto.Response updateStatus( - // @PathVariable Long id, - // @RequestParam Reservation.Status status - // ) { - // return reservationService.updateStatus(id, status); - // } - // - // @DeleteMapping("/{id}") - // public void delete(@PathVariable Long id) { - // reservationService.delete(id); - // } + @PatchMapping("/admin/updates/{reservationId}") + @Operation(summary = "예약팀 상태 변경", description = "특정 예약에 대한 상태 변경(예약중->호출중,호출중->입장완료,취소)") + @ApiResponse(responseCode = "200", description = "예약팀 상태 변경") + public ResponseEntity updateReservationStatus(@PathVariable Long reservationId,@RequestBody + ReservationStatusUpdateRequestDto requestDto) { + CallGetResponseDto response = reservationService.updateReservationStatus(reservationId,requestDto); + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + response + ) + ); + } } diff --git a/src/main/java/com/example/gtable/reservation/dto/CallGetResponseDto.java b/src/main/java/com/example/gtable/reservation/dto/CallGetResponseDto.java new file mode 100644 index 0000000..9769a2a --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/dto/CallGetResponseDto.java @@ -0,0 +1,30 @@ +package com.example.gtable.reservation.dto; + +import java.time.LocalDateTime; + +import com.example.gtable.reservation.entity.Reservation; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CallGetResponseDto { + private Long id; + private Long storeId; + private String userName; + private LocalDateTime requestedAt; + private String status; + private Integer partySize; + + public static CallGetResponseDto fromEntity(Reservation reservation) { + return CallGetResponseDto.builder() + .id(reservation.getId()) + .storeId(reservation.getStore().getStoreId()) + .userName(reservation.getUser().getNickname()) + .requestedAt(reservation.getRequestedAt()) + .status(reservation.getStatus().name()) + .partySize(reservation.getPartySize()) + .build(); + } +} diff --git a/src/main/java/com/example/gtable/reservation/dto/ReservationStatusSummaryDto.java b/src/main/java/com/example/gtable/reservation/dto/ReservationStatusSummaryDto.java new file mode 100644 index 0000000..3fba901 --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/dto/ReservationStatusSummaryDto.java @@ -0,0 +1,18 @@ +package com.example.gtable.reservation.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class ReservationStatusSummaryDto { + private int waitingCount; + private int confirmedCount; + private int cancelledCount; + private int callingCount; + private List reservationList; +} diff --git a/src/main/java/com/example/gtable/reservation/dto/ReservationStatusUpdateRequestDto.java b/src/main/java/com/example/gtable/reservation/dto/ReservationStatusUpdateRequestDto.java new file mode 100644 index 0000000..81d0583 --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/dto/ReservationStatusUpdateRequestDto.java @@ -0,0 +1,12 @@ +package com.example.gtable.reservation.dto; + +import com.example.gtable.reservation.entity.ReservationStatus; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ReservationStatusUpdateRequestDto { + private ReservationStatus status; +} diff --git a/src/main/java/com/example/gtable/reservation/entity/Reservation.java b/src/main/java/com/example/gtable/reservation/entity/Reservation.java index c5b36cb..6cab8e2 100644 --- a/src/main/java/com/example/gtable/reservation/entity/Reservation.java +++ b/src/main/java/com/example/gtable/reservation/entity/Reservation.java @@ -36,4 +36,8 @@ public class Reservation { @Column(name = "party_size", nullable = false) private Integer partySize; + public void updateStatus(ReservationStatus status) { + this.status = status; + } + } diff --git a/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java b/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java index b01aa1c..44def9b 100644 --- a/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java +++ b/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java @@ -7,5 +7,5 @@ import com.example.gtable.reservation.entity.Reservation; public interface ReservationRepository extends JpaRepository { - List findAllByStore_StoreId(Long storeId); + List findAllByStore_StoreIdOrderByRequestedAtAsc(Long storeId); } diff --git a/src/main/java/com/example/gtable/reservation/service/ReservationService.java b/src/main/java/com/example/gtable/reservation/service/ReservationService.java index 6193b4d..3f5803d 100644 --- a/src/main/java/com/example/gtable/reservation/service/ReservationService.java +++ b/src/main/java/com/example/gtable/reservation/service/ReservationService.java @@ -1,15 +1,19 @@ package com.example.gtable.reservation.service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.gtable.global.security.oauth2.dto.CustomOAuth2User; +import com.example.gtable.reservation.dto.CallGetResponseDto; import com.example.gtable.reservation.dto.ReservationCreateRequestDto; import com.example.gtable.reservation.dto.ReservationCreateResponseDto; import com.example.gtable.reservation.dto.ReservationGetResponseDto; +import com.example.gtable.reservation.dto.ReservationStatusSummaryDto; +import com.example.gtable.reservation.dto.ReservationStatusUpdateRequestDto; import com.example.gtable.reservation.entity.Reservation; import com.example.gtable.reservation.entity.ReservationStatus; import com.example.gtable.reservation.repository.ReservationRepository; @@ -55,14 +59,39 @@ public ReservationCreateResponseDto create(Long storeId, CustomOAuth2User custom .build(); } @Transactional(readOnly = true) - public List getReservationListByStoreId(Long storeId) { - List reservations = reservationRepository.findAllByStore_StoreId(storeId); + public ReservationStatusSummaryDto getReservationListByStoreId(Long storeId) { + List reservations = reservationRepository.findAllByStore_StoreIdOrderByRequestedAtAsc(storeId); - return reservations.stream() - .map(ReservationGetResponseDto::fromEntity) - .toList(); + // 상태별 카운트 집계 + int waitingCount = 0; + int confirmedCount = 0; + int cancelledCount = 0; + 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++; + reservationDtoList.add(ReservationGetResponseDto.fromEntity(r)); + } + + return ReservationStatusSummaryDto.builder() + .waitingCount(waitingCount) + .confirmedCount(confirmedCount) + .cancelledCount(cancelledCount) + .callingCount(callingCount) + .reservationList(reservationDtoList) + .build(); } + @Transactional + public CallGetResponseDto updateReservationStatus(Long reservationId, ReservationStatusUpdateRequestDto requestDto) { + Reservation reservation = reservationRepository.findById(reservationId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 reservation")); + reservation.updateStatus(requestDto.getStatus()); + return CallGetResponseDto.fromEntity(reservation); + } + - // 나머지 메서드도 동일하게 store/user 접근 시 getId() 활용 }