Skip to content

Commit

Permalink
Merge pull request #14 from paritytech/feat/cron-jobs-config
Browse files Browse the repository at this point in the history
Allow to configure cron jobs in the "config/modules.json" file
  • Loading branch information
ba1uev authored Feb 20, 2024
2 parents 5a03091 + c063e39 commit 0d9a507
Show file tree
Hide file tree
Showing 11 changed files with 42 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/modules/checklists/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"dependencies": ["users"],
"requiredIntegrations": [],
"recommendedIntegrations": [],
"availableCronJobs": ["checklist-answer-delete-data"],
"models": ["Checklist", "ChecklistAnswer"],
"clientRouter": {
"admin": {
Expand Down
5 changes: 5 additions & 0 deletions src/modules/events/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
"dependencies": ["users", "forms"],
"requiredIntegrations": [],
"recommendedIntegrations": ["matrix", "notion", "email-smtp"],
"availableCronJobs": [
"event-delete-data",
"event-checklist-reminder",
"update-notion-events"
],
"models": [
"Event",
"EventApplication",
Expand Down
1 change: 1 addition & 0 deletions src/modules/forms/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"dependencies": ["users"],
"requiredIntegrations": [],
"recommendedIntegrations": ["email-smtp", "matrix"],
"availableCronJobs": ["forms-delete-data"],
"models": ["Form", "FormSubmission"],
"clientRouter": {
"public": {
Expand Down
1 change: 1 addition & 0 deletions src/modules/profile-questions/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"dependencies": ["users"],
"requiredIntegrations": [],
"recommendedIntegrations": [],
"availableCronJobs": ["checklist-answer-delete-user-data"],
"models": ["ProfileQuestionAnswer"],
"clientRouter": {
"user": {
Expand Down
1 change: 1 addition & 0 deletions src/modules/time-off/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
"dependencies": ["users"],
"requiredIntegrations": [],
"recommendedIntegrations": ["bamboohr"],
"availableCronJobs": ["fetch-time-off-requests"],
"models": ["TimeOffRequest"]
}
1 change: 1 addition & 0 deletions src/modules/users/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"dependencies": [],
"requiredIntegrations": [],
"recommendedIntegrations": ["bamboohr", "matrix", "mapbox"],
"availableCronJobs": ["users-delete-users-data"],
"models": ["User", "Session", "City", "Tag", "UserTag"],
"clientRouter": {
"public": {},
Expand Down
1 change: 1 addition & 0 deletions src/modules/visits/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"dependencies": ["users"],
"requiredIntegrations": [],
"recommendedIntegrations": ["bamboohr", "matrix"],
"availableCronJobs": ["visit-delete-data", "visit-reminder:*"],
"models": ["Visit", "VisitReminderJob"],
"clientRouter": {
"public": {},
Expand Down
2 changes: 1 addition & 1 deletion src/modules/visits/server/jobs/visit-reminder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const jobFactory = (office: Office): CronJob => {
? getUtcHourForTimezone(REMINDER_HOUR_LOCAL, office.timezone)
: REMINDER_HOUR_LOCAL
return {
name: `visit-reminder-${office.id}`,
name: `visit-reminder:${office.id}`,
cron: `*/10 ${jobReminderHour} * * *`, // every 10th minute past hour `REMINDER_HOUR_LOCAL` (local time)
fn: async (ctx: CronJobContext) => {
const officeId = office.id
Expand Down
4 changes: 4 additions & 0 deletions src/modules/working-hours/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
"dependencies": ["users", "time-off"],
"requiredIntegrations": [],
"recommendedIntegrations": ["matrix", "bamboohr"],
"availableCronJobs": [
"working-hours-reminder",
"fetch-default-hours-reminder"
],
"models": [
"WorkingHoursEntry",
"DefaultWorkingHoursEntry",
Expand Down
4 changes: 4 additions & 0 deletions src/server/app-config/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,9 @@ export const moduleConfig = z
enabledIntegrations: z.array(z.string()).default([]),
metadata: z.record(z.any()).optional(),
portals: z.record(z.array(componentRef)).default({}),
enabledCronJobs: z
.array(z.tuple([z.string(), z.string().or(z.null())]))
.default([]),
})
.strict()

Expand Down Expand Up @@ -232,6 +235,7 @@ export const moduleManifest = z
dependencies: z.array(z.string()),
recommendedIntegrations: z.array(z.string()).default([]),
requiredIntegrations: z.array(z.string()).default([]),
availableCronJobs: z.array(z.string()).default([]),
models: z.array(z.string()).default([]),
clientRouter: moduleClientRouter.optional(),
})
Expand Down
25 changes: 22 additions & 3 deletions src/server/module-router-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import {
import { PermissionsSet } from '#shared/utils'
import * as fp from '#shared/utils/fp'

const PER_OFFICE_JOB_ID_RE = /^[a-zA-Z0-9_-]+:[a-zA-Z_-]+$/

const safeRequireDist = (relativePath: string) =>
safeRequire(getFilePath(`dist_server/${relativePath}`))

Expand Down Expand Up @@ -188,8 +190,9 @@ export const moduleRouterPlugin =
}

// register cron jobs
// TODO: define active jobs in the config/modules.json file
if (!config.skipCronJobs && moduleCronJobs) {
const availableCronJobs = moduleManifest.availableCronJobs
const enabledCronJobs = module.enabledCronJobs
const { moduleCronJobsFactory } = moduleCronJobs as {
moduleCronJobsFactory: ModuleCronJobsFactory
}
Expand All @@ -202,10 +205,26 @@ export const moduleRouterPlugin =
}
const moduleJobs = moduleCronJobsFactory(jobContext)
moduleJobs.forEach((job) => {
const jobId = PER_OFFICE_JOB_ID_RE.test(job.name)
? job.name.split(':')[0] + ':*'
: job.name
if (!availableCronJobs.includes(jobId)) {
fastify.log.warn(
`Unknown job "${job.name}" ("${module.id}" module). Skipped.`
)
return
}
const enabledCronJob = enabledCronJobs.find(
(x) => x[0] === job.name
)
if (!enabledCronJob) {
return
}
const cron = enabledCronJob[1] || job.cron
fastify.log.info(
`Job "${job.name}" has been scheduled for "${job.cron}" ("${module.id}" module)`
`Job "${job.name}" has been scheduled for "${cron}" ("${module.id}" module)`
)
nodeCron.schedule(job.cron, () => {
nodeCron.schedule(cron, () => {
limiter.schedule(async () => {
try {
await fastify.log.info(`Job "${job.name}" started`)
Expand Down

0 comments on commit 0d9a507

Please sign in to comment.