Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
ab36031
[FEAT] : 예약 취소 DTO 개발
CokaNuri Jan 19, 2026
635fe93
[FEAT] : 예약 취소 DTO 개발
CokaNuri Jan 19, 2026
366a69f
[FEAT] : 예약 취소 성공,실패 상태 추가
CokaNuri Jan 19, 2026
a7926e5
[FIX] : 예약 상태 이름 변경
CokaNuri Jan 19, 2026
26820c4
[FEAT] : Booking 엔티티에 cancel 비지니스 메서드 추가
CokaNuri Jan 19, 2026
ae305c1
[FEAT] : 예약 취소 API 구현
CokaNuri Jan 19, 2026
ddf5c18
Merge branch 'develop' into feature/booking-cancel-refund
CokaNuri Jan 23, 2026
dc7f6c7
[FEAT] : Booking 엔티티 취소 이유 필드와 취소 메서드 구현
CokaNuri Jan 26, 2026
8fbe74d
[FEAT] : BookingConverter 구현
CokaNuri Jan 26, 2026
bc7d8c9
[FEAT] : 예약생성 응답 DTO에 paymentID, orderID 추가
CokaNuri Jan 26, 2026
4958004
[CHORE] : 결제 요청 API 스웨거 설명 수정
CokaNuri Jan 26, 2026
02dd443
[REFACTOR] : 결제 승인 API에서 예약 상태도 변경하도록 코드 구조 변경
CokaNuri Jan 26, 2026
fe1f3f1
[CHORE] : 결제 완료 처리 api 스웨거 설정 변경
CokaNuri Jan 26, 2026
b5fda31
[REFACTOR] : 예약 생성 api에서 내부적으로 결제 요청 로직까지 진행하도록 코드 변경
CokaNuri Jan 26, 2026
8bc4e0f
충돌 해결
CokaNuri Jan 26, 2026
03f56a0
[FEAT] : 예약 엔티티에서 결제 완료된 결제키를 찾는 편의 메서드 개발
CokaNuri Jan 26, 2026
950a46f
[FEAT] : 예약 취소시 환불까지 연동되는 비즈니스로직 개발
CokaNuri Jan 26, 2026
893ddb0
[FEAT] : 예약 조회 응답 DTO 개발
CokaNuri Jan 28, 2026
ccda430
[FEAT] : 예약 조회 Repository 개발
CokaNuri Jan 28, 2026
e53a892
[FEAT] : 예약 조회 Service 개발
CokaNuri Jan 28, 2026
70bd0f7
[FEAT] : 예약 조회 Controller 개발
CokaNuri Jan 28, 2026
a69fbb7
[CHORE] : application-local.yml 파일 설정 추가
CokaNuri Jan 28, 2026
20be30d
[FEAT] : BookingMenu 엔티티 개발
CokaNuri Jan 28, 2026
d534aee
[FEAT] : 예약 생성 요청 DTO 변경
CokaNuri Jan 28, 2026
db246b5
[FEAT] : 예약 생성 서비스 로직 변경(메뉴 고려)
CokaNuri Jan 28, 2026
b928fc5
develop 머지
CokaNuri Jan 28, 2026
75033a6
[FIX] : 예약금, 결제금액 타입 Integer->Decimal로 변경
CokaNuri Jan 29, 2026
c08f621
[FIX] : 예약 조회 기본 페이지 1로 변경
CokaNuri Jan 29, 2026
0fa1481
[FIX] : 불필요한 예약 완료 처리 api 삭제
CokaNuri Jan 29, 2026
48f250b
[REFACTOR] : 존재하지 않는 테이블을 포함해 에약을 생성하는 예외 처리
CokaNuri Jan 29, 2026
d75b40f
[CHORE] : PAYMENT 컨트롤러 SWAGGER 설정 복원
CokaNuri Jan 29, 2026
141143c
Merge branch 'develop' into feature/booking
CokaNuri Jan 29, 2026
dab39bf
[FEAT] : 예약 취소 로직 예외 처리 추가
CokaNuri Jan 29, 2026
7a71cd7
Merge branch
CokaNuri Jan 29, 2026
f27fa21
Merge branch 'develop' into feature/booking
CokaNuri Jan 30, 2026
01395e2
[FIX] : 결제 금액 타입 Integer -> BigDecimal로 변경
CokaNuri Jan 30, 2026
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 @@ -4,6 +4,7 @@
import com.eatsfine.eatsfine.domain.booking.dto.response.BookingResponseDTO;
import com.eatsfine.eatsfine.domain.booking.service.BookingCommandService;
import com.eatsfine.eatsfine.domain.booking.service.BookingQueryService;
import com.eatsfine.eatsfine.domain.booking.status.BookingSuccessStatus;
import com.eatsfine.eatsfine.domain.user.entity.User;
import com.eatsfine.eatsfine.domain.user.repository.UserRepository;
import com.eatsfine.eatsfine.global.apiPayload.ApiResponse;
Expand Down Expand Up @@ -60,15 +61,42 @@ public ApiResponse<BookingResponseDTO.CreateBookingResultDTO> createBooking(
return ApiResponse.onSuccess(bookingCommandService.createBooking(user, storeId, dto));
}

@Operation(summary = "결제 완료 처리",
description = "결제 완료 후 결제 정보를 입력받아 예약 상태를 업데이트합니다.")
@PatchMapping("/bookings/{bookingId}/payments-confirm")
public ApiResponse<BookingResponseDTO.ConfirmPaymentResultDTO> confirmPayment(
@PathVariable Long bookingId,
@RequestBody @Valid BookingRequestDTO.PaymentConfirmDTO dto
) {
//불필요한 api 삭제
// @Operation(summary = "예약 완료 처리",
// description = "결제 완료 후 결제 정보를 입력받아 예약 상태를 업데이트합니다. 주의) 외부에서 이 API를 호출하지 않고 " +
// "POST /api/v1/payments/confirm API 호출 후 내부적으로 이 API의 로직을 실행합니다.")
// @PatchMapping("/bookings/{bookingId}/payments-confirm")
// public ApiResponse<BookingResponseDTO.ConfirmPaymentResultDTO> confirmPayment(
// @PathVariable Long bookingId,
// @RequestBody @Valid BookingRequestDTO.PaymentConfirmDTO dto
// ) {
//
// return ApiResponse.onSuccess(bookingCommandService.confirmPayment(bookingId,dto));
// }

return ApiResponse.onSuccess(bookingCommandService.confirmPayment(bookingId,dto));
@Operation(summary = "예약 취소",
description = "예약을 취소하고 환불을 진행합니다.")
@PatchMapping("/bookings/{bookingId}/cancel")
public ApiResponse<BookingResponseDTO.CancelBookingResultDTO> cancelBooking(
@PathVariable Long bookingId,
@RequestBody @Valid BookingRequestDTO.CancelBookingDTO dto
) {
return ApiResponse.of(BookingSuccessStatus._BOOKING_CANCELED,
bookingCommandService.cancelBooking(bookingId, dto));
Comment on lines +77 to +85
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cd /tmp/repo && find . -name "*.java" -type f | head -20

Repository: Eatsfine/BE

Length of output: 114


🏁 Script executed:

# Search for cancelBooking implementation in the codebase
rg -n "def cancelBooking|void cancelBooking|cancelBooking.*{" --type java -A 10

Repository: Eatsfine/BE

Length of output: 224


🏁 Script executed:

# Look for the BookingCommandService implementation
rg -n "class BookingCommandService|interface BookingCommandService" --type java -A 30

Repository: Eatsfine/BE

Length of output: 5492


🏁 Script executed:

# Search for security context usage and `@AuthenticationPrincipal` annotations
rg -n "SecurityContextHolder|@AuthenticationPrincipal|@PreAuthorize|@Secured" --type java -B 2 -A 3

Repository: Eatsfine/BE

Length of output: 37


🏁 Script executed:

# Search for ownership validation patterns
rg -n "getUser\(\)|getCurrentUser|getPrincipal|getAuthentication|getMember|getCustomer" --type java -B 2 -A 5

Repository: Eatsfine/BE

Length of output: 37


🏁 Script executed:

rg -n "cancelBooking" --type java -B 3 -A 25

Repository: Eatsfine/BE

Length of output: 7449


🏁 Script executed:

# Read the BookingCommandServiceImpl file to see the complete cancelBooking implementation
cat src/main/java/com/eatsfine/eatsfine/domain/booking/service/BookingCommandServiceImpl.java | head -250

Repository: Eatsfine/BE

Length of output: 8522


🏁 Script executed:

# Search for ownership validation patterns in booking service
rg -n "user|owner|member|authorization|permission|BookingException" src/main/java/com/eatsfine/eatsfine/domain/booking/service/ --type java -B 2 -A 2

Repository: Eatsfine/BE

Length of output: 15577


Add ownership validation to cancelBooking.

The cancelBooking method in BookingCommandServiceImpl has no ownership check. Any authenticated user can cancel another user's booking by knowing the booking ID. Unlike createBooking, which explicitly receives the authenticated user as a parameter, cancelBooking only takes bookingId and dto.

Add user context extraction and verify that the authenticated user owns the booking before processing the cancellation, or refactor the method signature to accept the authenticated user like createBooking does.

🤖 Prompt for AI Agents
In
`@src/main/java/com/eatsfine/eatsfine/domain/booking/controller/BookingController.java`
around lines 77 - 85, The cancelBooking endpoint currently lacks ownership
validation: update the controller method (BookingController.cancelBooking) to
obtain the authenticated user (e.g., add an `@AuthenticationPrincipal` /
SecurityContext extraction or mirror createBooking's signature) and pass the
user identity into BookingCommandService.cancelBooking; then update
BookingCommandService.cancelBooking and BookingCommandServiceImpl.cancelBooking
to accept the user (userId or UserPrincipal) and, inside the impl, fetch the
Booking (e.g., via bookingRepository.findById), verify booking.getOwnerId()
equals the authenticated user id, and throw an appropriate
Forbidden/AccessDenied exception if not matching before proceeding with
cancellation and refund.

}


@Operation(summary = "예약 내역 조회",
description = "마이페이지에서 나의 예약 내역을 조회합니다.")
@GetMapping("/users/bookings")
public ApiResponse<BookingResponseDTO.BookingPreviewListDTO> getMyBookings(
@RequestParam(name = "status", required = false) String status,
@RequestParam(name = "page", defaultValue = "1") Integer page
) {
User user = userRepository.findById(1L).orElseThrow(); // 임시로 임의의 유저 사용

// 서비스 호출 시 page - 1을 넘겨서 0-based index로 맞춰줍니다.
return ApiResponse.of(BookingSuccessStatus._BOOKING_FOUND,
bookingQueryService.getBookingList(user, status, page-1));
Comment on lines +92 to +100
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n src/main/java/com/eatsfine/eatsfine/domain/booking/controller/BookingController.java | sed -n '85,110p'

Repository: Eatsfine/BE

Length of output: 905


🏁 Script executed:

cat -n src/main/java/com/eatsfine/eatsfine/domain/booking/controller/BookingController.java | head -50

Repository: Eatsfine/BE

Length of output: 2641


🏁 Script executed:

rg "findById.*orElseThrow" src/main/java/com/eatsfine/eatsfine/domain/booking/controller/BookingController.java -A 2 -B 2

Repository: Eatsfine/BE

Length of output: 474


🏁 Script executed:

rg "PageRequest" src/main/java/com/eatsfine/eatsfine/domain/booking/ -A 2 -B 2

Repository: Eatsfine/BE

Length of output: 1421


Resolve hardcoded user ID and add page bounds validation.

Hardcoding findById(1L) bypasses authentication, exposing all users' booking data regardless of who is requesting. Replace with authenticated user from security context.

Additionally, page - 1 without bounds checking will cause PageRequest.of() to throw if invalid values are passed. Although the parameter has defaultValue = "1", explicit negative or zero values can bypass this. Validate that page >= 1 before calculation.

🛠️ Example fix (auth retrieval left to your security layer)
-        User user = userRepository.findById(1L).orElseThrow(); // 임시로 임의의 유저 사용
-
-        // 서비스 호출 시 page - 1을 넘겨서 0-based index로 맞춰줍니다.
+        User user = /* resolve authenticated user from security context */;
+
+        // 서비스 호출 시 page - 1을 넘겨서 0-based index로 맞춰줍니다.
+        int pageIndex = (page == null || page < 1) ? 0 : page - 1;
         return ApiResponse.of(BookingSuccessStatus._BOOKING_FOUND,
-                bookingQueryService.getBookingList(user, status, page-1));
+                bookingQueryService.getBookingList(user, status, pageIndex));
🤖 Prompt for AI Agents
In
`@src/main/java/com/eatsfine/eatsfine/domain/booking/controller/BookingController.java`
around lines 92 - 100, Replace the hardcoded user lookup in
BookingController.getMyBookings (userRepository.findById(1L)) with retrieval of
the authenticated user from your security context (e.g., obtain Authentication
from SecurityContextHolder and resolve principal to User or load by principal
id) and pass that User to bookingQueryService.getBookingList; additionally
validate the page request parameter (ensure page >= 1) before computing page-1
and either return a 400 Bad Request (throw an appropriate exception) or coerce
to 1, then call bookingQueryService.getBookingList(user, status, page - 1) and
return via ApiResponse.of with BookingResponseDTO.BookingPreviewListDTO.

}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,32 @@
package com.eatsfine.eatsfine.domain.booking.converter;

import com.eatsfine.eatsfine.domain.booking.dto.response.BookingResponseDTO;
import com.eatsfine.eatsfine.domain.booking.entity.Booking;
import com.eatsfine.eatsfine.domain.payment.dto.response.PaymentResponseDTO;
import com.eatsfine.eatsfine.domain.store.entity.Store;

import java.math.BigDecimal;
import java.util.List;

public class BookingConverter {

public static BookingResponseDTO.CreateBookingResultDTO toCreateBookingResultDTO(
Booking booking, Store store, BigDecimal totalDeposit,
List<BookingResponseDTO.BookingResultTableDTO> resultTableDTOS,
PaymentResponseDTO.PaymentRequestResultDTO paymentInfo) {

return BookingResponseDTO.CreateBookingResultDTO.builder()
.bookingId(booking.getId())
.storeName(store.getStoreName())
.date(booking.getBookingDate())
.time(booking.getBookingTime())
.partySize(booking.getPartySize())
.status(booking.getStatus().name())
.totalDeposit(totalDeposit)
.createdAt(booking.getCreatedAt())
.tables(resultTableDTOS)
.paymentId(paymentInfo.paymentId())
.orderId(paymentInfo.orderId())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,23 @@ public record CreateBookingDTO(
@NotNull @DateTimeFormat(pattern = "HH:mm") LocalTime time,
@NotNull @Min(1) Integer partySize,
@NotNull List<Long> tableIds,
@NotNull boolean isSplitAccepted
@NotNull boolean isSplitAccepted,
@NotNull List<MenuOrderDto> menuItems
){}

public record MenuOrderDto(
@NotNull Long menuId,
@NotNull @Min(1) Integer quantity
){}

public record PaymentConfirmDTO(
@NotBlank String paymentKey, //결제 고유 키
@NotNull Integer amount //실제 결제 금액
){}

public record CancelBookingDTO(
@NotBlank String reason //예약 취소 사유

){}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.eatsfine.eatsfine.domain.booking.dto.response;

import com.eatsfine.eatsfine.domain.booking.enums.BookingStatus;
import lombok.Builder;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
Expand Down Expand Up @@ -42,9 +44,11 @@ public record CreateBookingResultDTO(
LocalDate date,
LocalTime time,
Integer partySize,
Integer totalDeposit,
BigDecimal totalDeposit,
List<BookingResultTableDTO> tables,
LocalDateTime createdAt // 예약 생성 시간
LocalDateTime createdAt, // 예약 생성 시간
Long paymentId, // 결제 ID
String orderId // 주문 ID
){}

@Builder
Expand All @@ -61,6 +65,40 @@ public record ConfirmPaymentResultDTO(
Long bookingId,
String status, // CONFIRMED
String paymentKey, // PG사 결제 키
Integer amount // 최종 결제 금액
BigDecimal amount // 최종 결제 금액
){}

@Builder
public record CancelBookingResultDTO(
Long bookingId,
String status, // CANCELED
String cancelReason, // 취소 사유
LocalDateTime canceledAt, // 취소 시간
BigDecimal refundAmount // 환불 금액
){}

@Builder
public record BookingPreviewListDTO(
List<BookingPreviewDTO> bookingList,
Integer listSize,
Integer totalPage,
Long totalElements,
Boolean isFirst,
Boolean isLast

){}

@Builder
public record BookingPreviewDTO(
Long bookingId,
String storeName,
String storeAddress,
LocalDate bookingDate,
LocalTime bookingTime,
Integer partySize,
String tableNumbers,
BigDecimal amount,
String paymentMethod,
String status
){}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.eatsfine.eatsfine.domain.booking.entity;

import com.eatsfine.eatsfine.domain.booking.entity.mapping.BookingMenu;
import com.eatsfine.eatsfine.domain.booking.entity.mapping.BookingTable;
import com.eatsfine.eatsfine.domain.booking.enums.BookingStatus;
import com.eatsfine.eatsfine.domain.payment.entity.Payment;
import com.eatsfine.eatsfine.domain.payment.enums.PaymentStatus;
import com.eatsfine.eatsfine.domain.payment.exception.PaymentException;
import com.eatsfine.eatsfine.domain.payment.status.PaymentErrorStatus;
import com.eatsfine.eatsfine.domain.store.entity.Store;
import com.eatsfine.eatsfine.domain.storetable.entity.StoreTable;
import com.eatsfine.eatsfine.domain.user.entity.User;
import com.eatsfine.eatsfine.global.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
Expand Down Expand Up @@ -60,8 +65,20 @@ public class Booking extends BaseEntity {
private LocalTime bookingTime;

@Enumerated(EnumType.STRING)
@Column(name = "status", length = 20, nullable = false)
private BookingStatus status;

@Builder.Default
@OneToMany(mappedBy = "booking", cascade = CascadeType.ALL, orphanRemoval = true)
private List<BookingMenu> bookingMenus = new ArrayList<>();

public void addBookingMenu(BookingMenu bookingMenu) {
this.bookingMenus.add(bookingMenu);
if (bookingMenu.getBooking() != this) {
bookingMenu.confirmBooking(this);
}
}

public void addBookingTable(StoreTable storeTable) {
BookingTable bookingTable = BookingTable.builder()
.booking(this)
Expand All @@ -70,10 +87,30 @@ public void addBookingTable(StoreTable storeTable) {
this.bookingTables.add(bookingTable);
}

private Integer depositAmount;
private BigDecimal depositAmount;

private String cancelReason;

public void confirm() {
this.status = BookingStatus.CONFIRMED;
}

public void cancel(String cancelReason)
{
this.status = BookingStatus.CANCELED;
this.cancelReason = cancelReason;
}

//예약과 관련된 결제 중 결제 완료된 결제키 조회
public String getSuccessPaymentKey() {
return this.payments.stream()
.filter(p -> p.getPaymentStatus() == PaymentStatus.COMPLETED)
.map(Payment::getPaymentKey)
.findFirst()
.orElseThrow(() -> new PaymentException(PaymentErrorStatus._PAYMENT_NOT_FOUND));
}

public void setDepositAmount(BigDecimal totalDeposit) {
this.depositAmount = totalDeposit;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.eatsfine.eatsfine.domain.booking.entity.mapping;

import com.eatsfine.eatsfine.domain.booking.entity.Booking;
import com.eatsfine.eatsfine.domain.menu.entity.Menu;
import jakarta.persistence.*;
import lombok.*;

import java.math.BigDecimal;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Getter
@Builder
public class BookingMenu {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private Integer quantity;

private BigDecimal price;

@ManyToOne(fetch = FetchType.LAZY)
private Booking booking;

@ManyToOne(fetch = FetchType.LAZY)
private Menu menu;

public void confirmBooking(Booking booking) {
this.booking = booking;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

public enum BookingStatus {

PENDING, CONFIRMED, COMPLETED, CANCELLED, NOSHOW
PENDING, CONFIRMED, COMPLETED, CANCELED, NOSHOW
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Handle backward compatibility for persisted/serialized CANCELLED.
Renaming an enum constant can break existing DB rows (e.g., CANCELLED) and client payloads. Please add a migration/backfill or a compatibility layer before release.

🤖 Prompt for AI Agents
In `@src/main/java/com/eatsfine/eatsfine/domain/booking/enums/BookingStatus.java`
at line 5, Existing persisted/serialized values using "CANCELLED" will break
after renaming to CANCELED; add a compatibility layer and migration: implement a
tolerant deserializer/static factory on the BookingStatus enum (e.g., a static
fromString or a `@JsonCreator` method in BookingStatus) that maps the legacy
string "CANCELLED" to BookingStatus.CANCELED, and add a DB backfill migration
(SQL update to replace "CANCELLED" with "CANCELED" in the bookings table) so
stored rows are fixed; ensure any serialization annotations (Jackson/Gson)
accept the legacy spelling as well.

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package com.eatsfine.eatsfine.domain.booking.repository;

import com.eatsfine.eatsfine.domain.booking.entity.Booking;
import com.eatsfine.eatsfine.domain.booking.enums.BookingStatus;
import com.eatsfine.eatsfine.domain.user.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

@Repository
public interface BookingRepository extends JpaRepository<Booking, Long> {


Expand All @@ -35,6 +41,13 @@ public interface BookingRepository extends JpaRepository<Booking, Long> {
"AND b.status IN ('CONFIRMED', 'PENDING')")
boolean existsBookingByTableAndDateTime(@Param("tableId") Long tableId, @Param("date") LocalDate date, @Param("time") LocalTime time);


// 1. 특정 유저의 모든 예약을 최신순으로 페이징 조회
@Query("select b from Booking b join fetch b.store where b.user = :user")
Page<Booking> findAllByUser(@Param("user") User user, Pageable pageable);

@Query("Select b from Booking b join fetch b.store where b.user = :user and b.status = :status")
Page<Booking> findAllByUserAndStatus(@Param("user") User user, @Param("status") BookingStatus status, Pageable pageable);
@Query("SELECT COUNT(bt) > 0 FROM BookingTable bt " +
"JOIN bt.booking b " +
"WHERE bt.storeTable.id = :tableId " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ public interface BookingCommandService {
BookingResponseDTO.CreateBookingResultDTO createBooking(User user, Long storeId, BookingRequestDTO.CreateBookingDTO dto);

BookingResponseDTO.ConfirmPaymentResultDTO confirmPayment(Long BookingId, BookingRequestDTO.PaymentConfirmDTO dto);

BookingResponseDTO.CancelBookingResultDTO cancelBooking(Long bookingId, BookingRequestDTO.CancelBookingDTO dto);

}
Loading