diff --git a/package.json b/package.json index e63f3b9..0f05c42 100644 --- a/package.json +++ b/package.json @@ -37,11 +37,13 @@ "@fastify/cors": "^8.3.0", "@mikro-orm/core": "^5.9.0", "@mikro-orm/postgresql": "^5.9.0", + "@types/ms": "^0.7.33", "cron": "^3.1.5", "fastify": "^4.21.0", "fastify-metrics": "^10.3.2", "fastify-type-provider-zod": "^1.1.9", "jsonwebtoken": "^9.0.2", + "ms": "^2.1.3", "nanoid": "^3.3.6", "neat-config": "^2.0.0", "node-forge": "^1.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d583d1f..1acccc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: '@mikro-orm/postgresql': specifier: ^5.9.0 version: 5.9.0(@mikro-orm/core@5.9.0) + '@types/ms': + specifier: ^0.7.33 + version: 0.7.33 cron: specifier: ^3.1.5 version: 3.1.5 @@ -29,6 +32,9 @@ dependencies: jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 + ms: + specifier: ^2.1.3 + version: 2.1.3 nanoid: specifier: ^3.3.6 version: 3.3.6 @@ -456,6 +462,10 @@ packages: resolution: {integrity: sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==} dev: false + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + dev: false + /@types/node-forge@1.3.8: resolution: {integrity: sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==} dependencies: diff --git a/src/modules/jobs/index.ts b/src/modules/jobs/index.ts index e6e955d..6258549 100644 --- a/src/modules/jobs/index.ts +++ b/src/modules/jobs/index.ts @@ -1,9 +1,11 @@ import { challengeCodeJob } from '@/modules/jobs/list/challengeCode'; import { sessionExpiryJob } from '@/modules/jobs/list/sessionExpiry'; import { userDeletionJob } from '@/modules/jobs/list/userDeletion'; +import { providerMetricCleanupJob } from '@/modules/jobs/list/providerMetricCleanup'; export async function setupJobs() { challengeCodeJob.start(); sessionExpiryJob.start(); userDeletionJob.start(); + providerMetricCleanupJob.start(); } diff --git a/src/modules/jobs/list/providerMetricCleanup.ts b/src/modules/jobs/list/providerMetricCleanup.ts new file mode 100644 index 0000000..c2234b8 --- /dev/null +++ b/src/modules/jobs/list/providerMetricCleanup.ts @@ -0,0 +1,27 @@ +import { ProviderMetric } from '@/db/models/ProviderMetrics'; +import { job } from '@/modules/jobs/job'; +import ms from 'ms'; + +// every day at 12:00:00 +export const providerMetricCleanupJob = job( + 'provider-metric-cleanup', + '0 12 * * *', + async ({ em, log }) => { + const now = new Date(); + const thirtyDaysAgo = new Date(now.getTime() - ms('30d')); + + const deletedMetrics = await em + .createQueryBuilder(ProviderMetric) + .delete() + .where({ + createdAt: { + $lt: thirtyDaysAgo, + }, + }) + .execute<{ affectedRows: number }>('run'); + + log.info( + `Removed ${deletedMetrics.affectedRows} metrics that were older than 30 days`, + ); + }, +);