autobaan/src/common/scheduler.ts

58 lines
1.4 KiB
TypeScript
Raw Normal View History

import { Dayjs } from 'dayjs'
import { asyncLocalStorage } from './logger'
import { Reservation } from './reservation'
import { validateJSONRequest } from './request'
import { reserve } from './reserver'
export interface ScheduledReservation {
reservation: Reservation
scheduledFor?: Dayjs
}
export interface SchedulerResult {
scheduledReservation?: ScheduledReservation
}
export type SchedulerInput = Record<string, unknown>
export const schedule = async (
payload: SchedulerInput
): Promise<SchedulerResult> => {
const logger = asyncLocalStorage.getStore()
logger?.debug('Handling reservation', { payload })
let reservation: Reservation
try {
reservation = await validateJSONRequest(payload)
} catch (err) {
logger?.error('Failed to validate request', { err })
throw err
}
logger?.debug('Successfully validated request', {
reservation: reservation.toString(true),
})
if (!reservation.isAvailableForReservation()) {
logger?.debug(
'Reservation date is more than 7 days away; saving for later reservation'
)
await reservation.save()
return {
scheduledReservation: {
reservation,
scheduledFor: reservation.getAllowedReservationDate(),
},
}
}
logger?.info('Reservation request can be performed now')
await reserve(reservation)
return {
scheduledReservation: { reservation },
}
}