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