autobaan/src/workers/scheduler/index.ts

64 lines
1.9 KiB
TypeScript
Raw Normal View History

import { Dayjs } from 'dayjs'
import { v4 } from 'uuid'
import { Logger, LogLevel } from '../../common/logger'
import { Reservation } from '../../common/reservation'
import { ReservationRequest, validateJSONRequest } from '../../common/request'
import { scheduleDateToRequestReservation } from '../../common/schedule'
import { Worker } from '../types'
export interface ScheduledReservationRequest {
reservationRequest: ReservationRequest
scheduledFor?: Dayjs
}
export interface SchedulerResult {
scheduledReservationRequest?: ScheduledReservationRequest
}
export interface SchedulerInput extends Omit<ReservationRequest, 'dateRange'> {
dateRange: { start: string; end: string }
}
export const work: Worker<SchedulerInput, SchedulerResult> = async (
payload: SchedulerInput
): Promise<SchedulerResult> => {
Logger.instantiate('reservationScheduler', v4(), LogLevel.DEBUG)
2022-02-11 13:20:15 +01:00
Logger.debug('Handling reservation', { payload })
let reservationRequest: ReservationRequest
try {
reservationRequest = validateJSONRequest(payload)
} catch (err) {
Logger.error('Failed to validate request', { err })
throw err
}
Logger.debug('Successfully validated request', { reservationRequest })
const res = new Reservation(
reservationRequest.dateRange,
reservationRequest.opponent
)
if (!res.isAvailableForReservation()) {
Logger.debug('Reservation date is more than 7 days away')
const scheduledDay = scheduleDateToRequestReservation(
reservationRequest.dateRange.start
)
Logger.info(
`Scheduling reservation request for ${scheduledDay.format('YYYY-MM-DD')}`
)
return {
scheduledReservationRequest: {
reservationRequest,
scheduledFor: scheduledDay,
},
}
}
Logger.info('Reservation request can be performed now')
return {
scheduledReservationRequest: { reservationRequest },
}
}