{"version":3,"file":"scheduling.mjs","sources":["../../../server/src/services/scheduling.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { errors } from '@strapi/utils';\nimport { Release } from '../../../shared/contracts/releases';\nimport { getService } from '../utils';\nimport { RELEASE_MODEL_UID } from '../constants';\n\nconst createSchedulingService = ({ strapi }: { strapi: Core.Strapi }) => {\n  const scheduledJobs = new Map<Release['id'], string>();\n\n  return {\n    async set(releaseId: Release['id'], scheduleDate: Date) {\n      const release = await strapi.db\n        .query(RELEASE_MODEL_UID)\n        .findOne({ where: { id: releaseId, releasedAt: null } });\n\n      if (!release) {\n        throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n      }\n\n      const taskName = `publishRelease_${releaseId}`;\n\n      strapi.cron.add({\n        [taskName]: {\n          async task() {\n            try {\n              await getService('release', { strapi }).publish(releaseId);\n              // @TODO: Trigger webhook with success message\n            } catch (error) {\n              // @TODO: Trigger webhook with error message\n            }\n          },\n          options: scheduleDate,\n        },\n      });\n\n      if (scheduledJobs.has(releaseId)) {\n        this.cancel(releaseId);\n      }\n\n      scheduledJobs.set(releaseId, taskName);\n\n      return scheduledJobs;\n    },\n\n    cancel(releaseId: Release['id']) {\n      if (scheduledJobs.has(releaseId)) {\n        strapi.cron.remove(scheduledJobs.get(releaseId)!);\n        scheduledJobs.delete(releaseId);\n      }\n\n      return scheduledJobs;\n    },\n\n    getAll() {\n      return scheduledJobs;\n    },\n\n    /**\n     * On bootstrap, we can use this function to make sure to sync the scheduled jobs from the database that are not yet released\n     * This is useful in case the server was restarted and the scheduled jobs were lost\n     * This also could be used to sync different Strapi instances in case of a cluster\n     */\n    async syncFromDatabase() {\n      const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n        where: {\n          scheduledAt: {\n            $gte: new Date(),\n          },\n          releasedAt: null,\n        },\n      });\n\n      for (const release of releases) {\n        this.set(release.id, release.scheduledAt);\n      }\n\n      return scheduledJobs;\n    },\n  };\n};\n\nexport default createSchedulingService;\n"],"names":["createSchedulingService","strapi","scheduledJobs","Map","set","releaseId","scheduleDate","release","db","query","RELEASE_MODEL_UID","findOne","where","id","releasedAt","errors","NotFoundError","taskName","cron","add","task","getService","publish","error","options","has","cancel","remove","get","delete","getAll","syncFromDatabase","releases","findMany","scheduledAt","$gte","Date"],"mappings":";;;;AAOA,MAAMA,uBAAAA,GAA0B,CAAC,EAAEC,MAAM,EAA2B,GAAA;AAClE,IAAA,MAAMC,gBAAgB,IAAIC,GAAAA,EAAAA;IAE1B,OAAO;QACL,MAAMC,GAAAA,CAAAA,CAAIC,SAAwB,EAAEC,YAAkB,EAAA;YACpD,MAAMC,OAAAA,GAAU,MAAMN,MAAAA,CAAOO,EAAE,CAC5BC,KAAK,CAACC,iBAAAA,CAAAA,CACNC,OAAO,CAAC;gBAAEC,KAAAA,EAAO;oBAAEC,EAAAA,EAAIR,SAAAA;oBAAWS,UAAAA,EAAY;AAAK;AAAE,aAAA,CAAA;AAExD,YAAA,IAAI,CAACP,OAAAA,EAAS;AACZ,gBAAA,MAAM,IAAIQ,MAAAA,CAAOC,aAAa,CAAC,CAAC,wBAAwB,EAAEX,SAAAA,CAAAA,CAAW,CAAA;AACvE,YAAA;AAEA,YAAA,MAAMY,QAAAA,GAAW,CAAC,eAAe,EAAEZ,SAAAA,CAAAA,CAAW;YAE9CJ,MAAAA,CAAOiB,IAAI,CAACC,GAAG,CAAC;AACd,gBAAA,CAACF,WAAW;oBACV,MAAMG,IAAAA,CAAAA,GAAAA;wBACJ,IAAI;AACF,4BAAA,MAAMC,WAAW,SAAA,EAAW;AAAEpB,gCAAAA;AAAO,6BAAA,CAAA,CAAGqB,OAAO,CAACjB,SAAAA,CAAAA;;AAElD,wBAAA,CAAA,CAAE,OAAOkB,KAAAA,EAAO;;AAEhB,wBAAA;AACF,oBAAA,CAAA;oBACAC,OAAAA,EAASlB;AACX;AACF,aAAA,CAAA;YAEA,IAAIJ,aAAAA,CAAcuB,GAAG,CAACpB,SAAAA,CAAAA,EAAY;gBAChC,IAAI,CAACqB,MAAM,CAACrB,SAAAA,CAAAA;AACd,YAAA;YAEAH,aAAAA,CAAcE,GAAG,CAACC,SAAAA,EAAWY,QAAAA,CAAAA;YAE7B,OAAOf,aAAAA;AACT,QAAA,CAAA;AAEAwB,QAAAA,MAAAA,CAAAA,CAAOrB,SAAwB,EAAA;YAC7B,IAAIH,aAAAA,CAAcuB,GAAG,CAACpB,SAAAA,CAAAA,EAAY;AAChCJ,gBAAAA,MAAAA,CAAOiB,IAAI,CAACS,MAAM,CAACzB,aAAAA,CAAc0B,GAAG,CAACvB,SAAAA,CAAAA,CAAAA;AACrCH,gBAAAA,aAAAA,CAAc2B,MAAM,CAACxB,SAAAA,CAAAA;AACvB,YAAA;YAEA,OAAOH,aAAAA;AACT,QAAA,CAAA;AAEA4B,QAAAA,MAAAA,CAAAA,GAAAA;YACE,OAAO5B,aAAAA;AACT,QAAA,CAAA;AAEA;;;;AAIC,QACD,MAAM6B,gBAAAA,CAAAA,GAAAA;YACJ,MAAMC,QAAAA,GAAW,MAAM/B,MAAAA,CAAOO,EAAE,CAACC,KAAK,CAACC,iBAAAA,CAAAA,CAAmBuB,QAAQ,CAAC;gBACjErB,KAAAA,EAAO;oBACLsB,WAAAA,EAAa;AACXC,wBAAAA,IAAAA,EAAM,IAAIC,IAAAA;AACZ,qBAAA;oBACAtB,UAAAA,EAAY;AACd;AACF,aAAA,CAAA;YAEA,KAAK,MAAMP,WAAWyB,QAAAA,CAAU;AAC9B,gBAAA,IAAI,CAAC5B,GAAG,CAACG,QAAQM,EAAE,EAAEN,QAAQ2B,WAAW,CAAA;AAC1C,YAAA;YAEA,OAAOhC,aAAAA;AACT,QAAA;AACF,KAAA;AACF;;;;"}