From 5c1d2a5e83c3654ae468d17c900892c32ef76060 Mon Sep 17 00:00:00 2001 From: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Mon, 6 Feb 2023 14:24:32 +0100 Subject: [PATCH] feat(medusa): Option to override existing cron job (#2989) --- .changeset/old-scissors-develop.md | 5 +++ packages/medusa/src/services/event-bus.ts | 17 ++++++--- packages/medusa/src/services/job-scheduler.ts | 37 ++++++++++++++----- 3 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 .changeset/old-scissors-develop.md diff --git a/.changeset/old-scissors-develop.md b/.changeset/old-scissors-develop.md new file mode 100644 index 0000000000..d54f5d629a --- /dev/null +++ b/.changeset/old-scissors-develop.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +feat(medusa): Option to override existing cron job diff --git a/packages/medusa/src/services/event-bus.ts b/packages/medusa/src/services/event-bus.ts index 8ee60ce875..f7894a2f70 100644 --- a/packages/medusa/src/services/event-bus.ts +++ b/packages/medusa/src/services/event-bus.ts @@ -7,7 +7,7 @@ import { StagedJob } from "../models" import { StagedJobRepository } from "../repositories/staged-job" import { ConfigModule, Logger } from "../types/global" import { sleep } from "../utils/sleep" -import JobSchedulerService from "./job-scheduler" +import JobSchedulerService, { CreateJobOptions } from "./job-scheduler" type InjectedDependencies = { manager: EntityManager @@ -413,12 +413,19 @@ export default class EventBusService { * @param handler - the handler to call on each cron job * @return void */ - createCronJob( + async createCronJob( eventName: string, data: T, cron: string, - handler: Subscriber - ): void { - this.jobSchedulerService_.create(eventName, data, cron, handler) + handler: Subscriber, + options?: CreateJobOptions + ): Promise { + await this.jobSchedulerService_.create( + eventName, + data, + cron, + handler, + options ?? {} + ) } } diff --git a/packages/medusa/src/services/job-scheduler.ts b/packages/medusa/src/services/job-scheduler.ts index cc38c0fd23..90062d2503 100644 --- a/packages/medusa/src/services/job-scheduler.ts +++ b/packages/medusa/src/services/job-scheduler.ts @@ -13,6 +13,10 @@ type ScheduledJobHandler = ( eventName: string ) => Promise +export type CreateJobOptions = { + keepExisting?: boolean +} + export default class JobSchedulerService { protected readonly config_: ConfigModule protected readonly logger_: Logger @@ -102,21 +106,34 @@ export default class JobSchedulerService { * @param handler - the handler to call on the job * @return void */ - create( + async create( eventName: string, data: T, schedule: string, - handler: ScheduledJobHandler - ): void { + handler: ScheduledJobHandler, + options: CreateJobOptions + ): Promise { this.logger_.info(`Registering ${eventName}`) this.registerHandler(eventName, handler) - this.queue_.add( - { - eventName, - data, - }, - { repeat: { cron: schedule } } - ) + const jobToCreate = { + eventName, + data, + } + const repeatOpts = { repeat: { cron: schedule } } + + if (options?.keepExisting) { + return await this.queue_.add(eventName, jobToCreate, repeatOpts) + } + + const existingJobs = (await this.queue_.getRepeatableJobs()) ?? [] + + const existingJob = existingJobs.find((job) => job.name === eventName) + + if (existingJob) { + await this.queue_.removeRepeatableByKey(existingJob.key) + } + + return await this.queue_.add(eventName, jobToCreate, repeatOpts) } }