49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
import dayjs from './dayjs'
|
|
import { asyncLocalStorage as l, LoggableError } from './logger'
|
|
import { Reservation } from './reservation'
|
|
import { Runner } from './runner'
|
|
|
|
let runner: Runner | undefined
|
|
const getRunner = () => {
|
|
if (!runner) {
|
|
runner = new Runner({
|
|
headless: true,
|
|
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
})
|
|
}
|
|
return runner
|
|
}
|
|
|
|
export const reserve = async (
|
|
reservations?: Reservation[]
|
|
): Promise<boolean> => {
|
|
let reservationsToPerform = reservations
|
|
if (!reservationsToPerform) {
|
|
l.getStore()?.debug('No reservation provided, fetching first in database')
|
|
reservationsToPerform =
|
|
(await Reservation.fetchByDate(dayjs())) || undefined
|
|
}
|
|
|
|
if (!reservationsToPerform || reservationsToPerform.length === 0) {
|
|
l.getStore()?.info('No reservation to perform')
|
|
return true
|
|
}
|
|
|
|
for (const reservationToPerform of reservationsToPerform) {
|
|
l.getStore()?.debug('Trying to perform reservation', {
|
|
reservationToPerform: reservationToPerform.toString(true),
|
|
})
|
|
const runner = getRunner()
|
|
try {
|
|
await runner.run(reservationToPerform)
|
|
await reservationToPerform.delete()
|
|
} catch (error) {
|
|
l.getStore()?.error('Failed to perform reservation', {
|
|
error: (error as LoggableError).toString(),
|
|
})
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|