scheduled cleanup jobs

This commit is contained in:
mrjvs
2023-10-29 17:15:07 +01:00
parent 91750a5086
commit b6b6288a7a
7 changed files with 86 additions and 1 deletions

View File

@@ -1,4 +1,5 @@
import { setupFastify, startFastify } from '@/modules/fastify';
import { setupJobs } from '@/modules/jobs';
import { setupMetrics } from '@/modules/metrics';
import { setupMikroORM } from '@/modules/mikro';
import { scopedLogger } from '@/services/logger';
@@ -13,6 +14,7 @@ async function bootstrap(): Promise<void> {
const app = await setupFastify();
await setupMikroORM();
await setupMetrics(app);
await setupJobs();
await startFastify(app);

View File

@@ -0,0 +1,5 @@
import { sessionExpiryJob } from '@/modules/jobs/list/sessionExpiry';
export async function setupJobs() {
sessionExpiryJob.start();
}

43
src/modules/jobs/job.ts Normal file
View File

@@ -0,0 +1,43 @@
import { getORM } from '@/modules/mikro';
import { scopedLogger } from '@/services/logger';
import { EntityManager } from '@mikro-orm/postgresql';
import { CronJob } from 'cron';
const minOffset = 0;
const maxOffset = 60 * 4;
const secondsOffset =
Math.floor(Math.random() * (maxOffset - minOffset)) + minOffset;
const log = scopedLogger('jobs');
const wait = (sec: number) =>
new Promise<void>((resolve) => {
setTimeout(() => resolve(), sec * 1000);
});
/**
* @param cron crontime in this order: (min of hour) (hour of day) (day of month) (day of week) (sec of month)
*/
export function job(
cron: string,
cb: (ctx: { em: EntityManager }) => Promise<void>,
): CronJob {
return CronJob.from({
cronTime: cron,
onTick: async () => {
// offset by random amount of seconds, just to prevent jobs running at
// the same time when running multiple instances
await wait(secondsOffset);
// actually run the job
try {
const em = getORM().em.fork();
await cb({ em });
} catch (err) {
log.error('Failed to run job!');
log.error(err);
}
},
start: false,
});
}

View File

@@ -0,0 +1,15 @@
import { Session } from '@/db/models/Session';
import { job } from '@/modules/jobs/job';
// every day at 12:00:00
export const sessionExpiryJob = job('0 12 * * *', async ({ em }) => {
await em
.createQueryBuilder(Session)
.delete()
.where({
expiresAt: {
$lt: new Date(),
},
})
.execute();
});