autobaan/src/server/cron.ts
2023-05-23 15:09:15 -05:00

70 lines
1.9 KiB
TypeScript

import { schedule, ScheduledTask, ScheduleOptions, getTasks as getCronTasks } from 'node-cron'
import { v4 } from 'uuid'
import { asyncLocalStorage, Logger, LogLevel } from '../common/logger'
import { reserve } from '../common/reserver'
const tasks: ScheduledTask[] = []
const getTaskConfig = (name: string): ScheduleOptions => ({
name,
recoverMissedExecutions: false,
timezone: 'Europe/Amsterdam',
})
const logger = new Logger('cron', 'default', LogLevel.DEBUG)
export const getStatus = () => {
const tasks = getCronTasks()
if (tasks.get('reserver cron')) {
return true
}
return false
}
export const startTasks = () => {
try {
if (tasks.length === 0) {
const task = schedule(
'* 7 * * *',
async (timestamp) => {
asyncLocalStorage.run(
new Logger('cron', v4(), LogLevel.DEBUG),
async () => {
const childLogger = asyncLocalStorage.getStore()
childLogger?.info('Running cron job', { timestamp })
try {
const result = await reserve()
if (!result) {
throw new Error('Failed to complete reservation')
}
childLogger?.info('Completed running cron job')
} catch (error) {
childLogger?.error('Error running cron job', {
error: (error as Error).message,
})
stopTasks()
}
}
)
},
getTaskConfig('reserver cron')
)
logger.debug('Started cron task')
tasks.push(task)
}
} catch (error) {
logger.error('Failed to start tasks', { error: (error as Error).message })
}
}
export const stopTasks = () => {
try {
if (tasks.length > 0) {
tasks.map((task) => task.stop())
logger.debug('Stopped cron tasks')
}
} catch (error) {
logger.error('Failed to stop tasks', { error: (error as Error).message })
}
}