import type { UpdateBookingDetailsResponse } from '~~/shared/booking' import { clearBookingTransactionDocumentByConfirmationToken, getBookingByConfirmationToken, updateBookingPaymentMethodByConfirmationToken } from '../../../../utils/booking-repository' import { parsePaymentMethodInput } from '../../../../utils/bookings' import { getRequiredRouteParam, httpError } from '../../../../utils/http' import { deleteTransactionDocument } from '../../../../utils/transaction-documents' export default defineEventHandler(async (event): Promise => { const token = getRequiredRouteParam(event, 'token', 'Confirmation token') const existingBooking = await getBookingByConfirmationToken(token, { includeTransactionDocument: true }) if (!existingBooking) { httpError(404, 'Booking not found') } if (existingBooking.status !== 'pending') { httpError(409, 'Payment details can only be changed before confirmation') } const body = await readBody<{ paymentMethod?: string | null }>(event) const input = parsePaymentMethodInput(body) const booking = await updateBookingPaymentMethodByConfirmationToken({ confirmationToken: token, paymentMethod: input.paymentMethod }) if (!booking) { httpError(404, 'Booking not found') } if (input.paymentMethod === 'cash') { const cleared = await clearBookingTransactionDocumentByConfirmationToken(token) if (cleared) { await deleteTransactionDocument(cleared.previousStorageName) return { booking: cleared.booking } } } return { booking } })