Secure API endpoints with requireBookingManager authorization check Update confirmation page to prompt for login if unauthorized Add safe redirect handling to login and guest middleware
55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import type { UpdateBookingDetailsResponse } from '~~/shared/booking'
|
|
|
|
import { requireBookingManager } from '../../../../utils/auth'
|
|
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<UpdateBookingDetailsResponse> => {
|
|
const token = getRequiredRouteParam(event, 'token', 'Confirmation token')
|
|
const existingBooking = await getBookingByConfirmationToken(token, { includeTransactionDocument: true })
|
|
|
|
if (!existingBooking) {
|
|
httpError(404, 'Booking not found')
|
|
}
|
|
|
|
await requireBookingManager(event, existingBooking)
|
|
|
|
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
|
|
}
|
|
})
|