@strapi/review-workflows 5.58.0 → 5.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/admin/routes/content-manager/model/id/components/Header.js +6 -6
  2. package/dist/admin/routes/content-manager/model/id/components/Header.js.map +1 -1
  3. package/dist/admin/routes/content-manager/model/id/components/Header.mjs +6 -6
  4. package/dist/admin/routes/content-manager/model/id/components/Header.mjs.map +1 -1
  5. package/dist/admin/routes/content-manager/model/id/components/Panel.js +6 -6
  6. package/dist/admin/routes/content-manager/model/id/components/Panel.js.map +1 -1
  7. package/dist/admin/routes/content-manager/model/id/components/Panel.mjs +6 -6
  8. package/dist/admin/routes/content-manager/model/id/components/Panel.mjs.map +1 -1
  9. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.js +13 -0
  10. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.js.map +1 -0
  11. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.mjs +11 -0
  12. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.mjs.map +1 -0
  13. package/dist/admin/routes/settings/components/Stages.js.map +1 -1
  14. package/dist/admin/routes/settings/components/Stages.mjs.map +1 -1
  15. package/dist/admin/src/routes/content-manager/model/id/components/Header.d.ts +2 -1
  16. package/dist/admin/src/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.d.ts +5 -0
  17. package/dist/server/controllers/workflows.js +6 -10
  18. package/dist/server/controllers/workflows.js.map +1 -1
  19. package/dist/server/controllers/workflows.mjs +6 -10
  20. package/dist/server/controllers/workflows.mjs.map +1 -1
  21. package/dist/server/services/document-service-middleware.js +1 -1
  22. package/dist/server/services/document-service-middleware.js.map +1 -1
  23. package/dist/server/services/document-service-middleware.mjs +1 -1
  24. package/dist/server/services/document-service-middleware.mjs.map +1 -1
  25. package/dist/server/services/metrics/index.js +2 -2
  26. package/dist/server/services/metrics/index.js.map +1 -1
  27. package/dist/server/services/metrics/index.mjs +2 -2
  28. package/dist/server/services/metrics/index.mjs.map +1 -1
  29. package/dist/server/services/metrics/weekly-metrics.js +1 -1
  30. package/dist/server/services/metrics/weekly-metrics.js.map +1 -1
  31. package/dist/server/services/metrics/weekly-metrics.mjs +1 -1
  32. package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -1
  33. package/dist/server/services/stage-permissions.js +4 -4
  34. package/dist/server/services/stage-permissions.js.map +1 -1
  35. package/dist/server/services/stage-permissions.mjs +4 -4
  36. package/dist/server/services/stage-permissions.mjs.map +1 -1
  37. package/dist/server/services/stages.js +2 -2
  38. package/dist/server/services/stages.js.map +1 -1
  39. package/dist/server/services/stages.mjs +2 -2
  40. package/dist/server/services/stages.mjs.map +1 -1
  41. package/dist/server/services/workflows.js +6 -5
  42. package/dist/server/services/workflows.js.map +1 -1
  43. package/dist/server/services/workflows.mjs +6 -5
  44. package/dist/server/services/workflows.mjs.map +1 -1
  45. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  46. package/dist/server/src/index.d.ts +5 -8
  47. package/dist/server/src/index.d.ts.map +1 -1
  48. package/dist/server/src/services/index.d.ts +5 -8
  49. package/dist/server/src/services/index.d.ts.map +1 -1
  50. package/dist/server/src/services/metrics/index.d.ts +8 -2
  51. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  52. package/dist/server/src/services/metrics/weekly-metrics.d.ts +2 -6
  53. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  54. package/dist/server/src/services/workflows.d.ts +5 -3
  55. package/dist/server/src/services/workflows.d.ts.map +1 -1
  56. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  57. package/package.json +10 -8
@@ -30,8 +30,8 @@ const sendDidEditAssignee = async (fromId, toId)=>{
30
30
  to: toId
31
31
  });
32
32
  };
33
- const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes)=>{
34
- strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
33
+ const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({ numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes })=>{
34
+ await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
35
35
  groupProperties: {
36
36
  numberOfActiveWorkflows,
37
37
  avgStagesCount,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (\n numberOfActiveWorkflows: number,\n avgStagesCount: number,\n maxStagesCount: number,\n activatedContentTypes: number\n) => {\n strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AAEO,MAAMG,4CAAAA,GAA+C,OAC1DC,uBAAAA,EACAC,gBACAC,cAAAA,EACAC,qBAAAA,GAAAA;AAEAnB,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QAChEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport type WeeklyMetrics = {\n numberOfActiveWorkflows: number;\n avgStagesCount: number;\n maxStagesCount: number | undefined;\n activatedContentTypes: number;\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n}: WeeklyMetrics) => {\n await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AASO,MAAMG,4CAAAA,GAA+C,OAAO,EACjEC,uBAAuB,EACvBC,cAAc,EACdC,cAAc,EACdC,qBAAqB,EACP,GAAA;AACd,IAAA,MAAMnB,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QACtEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;"}
@@ -44,7 +44,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
44
44
  },
45
45
  async sendMetrics () {
46
46
  const computedMetrics = await this.computeMetrics();
47
- metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
47
+ await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
48
48
  const metricsInfoStored = await getMetricsStoreValue();
49
49
  // @ts-expect-error metricsInfoStored can use spread
50
50
  await setMetricsStoreValue({
@@ -1 +1 @@
1
- {"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":";;;;;;AAKA,MAAMA,QAAAA,GAAW,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAA;AAEpC,MAAMC,uBAAAA,GAA0B,CAACC,IAAAA,GAC/B,CAAA,EAAGA,KAAKC,UAAU,EAAA,CAAG,CAAC,EAAED,IAAAA,CAAKE,UAAU,EAAA,CAAG,CAAC,EAAEF,IAAAA,CAAKG,QAAQ,GAAG,KAAK,EAAEH,IAAAA,CAAKI,MAAM,EAAA,CAAA,CAAI;AAErF,mCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,OAAAA,GAAUC,iBAAW,kBAAA,EAAoB;AAAEF,QAAAA;AAAO,KAAA,CAAA;IACxD,MAAMG,gBAAAA,GAAmBD,iBAAW,WAAA,EAAa;AAAEF,QAAAA;AAAO,KAAA,CAAA;AAE1D,IAAA,MAAMI,oBAAAA,GAAuB,UAAA;AAC3B,QAAA,MAAMC,QAAQ,MAAML,MAAAA,CAAOM,KAAK,CAACC,GAAG,CAAC;YAAEC,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK;AAAU,SAAA,CAAA;QAClF,OAAOC,gBAAAA,CAAUN,OAAO,EAAC,CAAA;AAC3B,IAAA,CAAA;AAEA,IAAA,MAAMO,uBAAuB,CAACP,KAAAA,GAC5BL,OAAOM,KAAK,CAACO,GAAG,CAAC;YAAEL,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK,SAAA;AAAWL,YAAAA;AAAM,SAAA,CAAA;IAEvE,OAAO;QACL,MAAMS,cAAAA,CAAAA,GAAAA;;AAEJ,YAAA,MAAMC,SAAAA,GAAY,MAAMZ,gBAAAA,CAAiBa,IAAI,CAAC;gBAAEC,QAAAA,EAAU;AAAS,aAAA,CAAA;AAEnE,YAAA,MAAMC,cAAcC,UAAAA,CAAIJ,SAAAA,EAAW,CAACK,QAAAA,GAAaC,WAAAA,CAAKD,SAASE,MAAM,CAAA,CAAA;AAErE,YAAA,MAAMC,oBAAoBJ,UAAAA,CAAIJ,SAAAA,EAAW,CAACK,QAAAA,GAAaC,WAAAA,CAAKD,SAASI,YAAY,CAAA,CAAA;YAEjF,OAAO;AACLC,gBAAAA,uBAAAA,EAAyBJ,WAAAA,CAAKN,SAAAA,CAAAA;AAC9BW,gBAAAA,cAAAA,EAAgBC,WAAAA,CAAKT,WAAAA,CAAAA;AACrBU,gBAAAA,cAAAA,EAAgBC,UAAAA,CAAIX,WAAAA,CAAAA;AACpBY,gBAAAA,qBAAAA,EAAuBC,UAAAA,CAAIR,iBAAAA;AAC7B,aAAA;AACF,QAAA,CAAA;QAEA,MAAMS,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,eAAAA,GAAkB,MAAM,IAAI,CAACnB,cAAc,EAAA;AACjDb,YAAAA,OAAAA,CAAQiC,4CAA4C,CAACD,eAAAA,CAAAA;AAErD,YAAA,MAAME,oBAAoB,MAAM/B,oBAAAA,EAAAA;;AAEhC,YAAA,MAAMQ,oBAAAA,CAAqB;AAAE,gBAAA,GAAGuB,iBAAiB;gBAAEC,gBAAAA,EAAkB,IAAIC,OAAOC,OAAO;AAAG,aAAA,CAAA;AAC5F,QAAA,CAAA;QAEA,MAAMC,8BAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMJ,oBAAyB,MAAM/B,oBAAAA,EAAAA;AACrC,YAAA,MAAM,EAAEoC,cAAAA,EAAgBC,eAAe,EAAEL,gBAAgB,EAAE,GAAGD,iBAAAA;AAE9D,YAAA,MAAMO,MAAM,IAAIL,IAAAA,EAAAA;AAChB,YAAA,IAAIG,cAAAA,GAAiBC,eAAAA;YAErB,IAAI,CAACA,mBAAmB,CAACL,gBAAAA,IAAoBA,mBAAmB3C,QAAAA,GAAWiD,GAAAA,CAAIJ,OAAO,EAAA,EAAI;gBACxFE,cAAAA,GAAiB9C,uBAAAA,CAAwBiD,YAAID,GAAAA,EAAK;oBAAEE,OAAAA,EAAS;AAAG,iBAAA,CAAA,CAAA;AAChE,gBAAA,MAAMhC,oBAAAA,CAAqB;AAAE,oBAAA,GAAGuB,iBAAiB;AAAEK,oBAAAA;AAAe,iBAAA,CAAA;AACpE,YAAA;YAEA,OAAOA,cAAAA;AACT,QAAA,CAAA;QAEA,MAAMK,YAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAML,cAAAA,GAAiB,MAAM,IAAI,CAACD,8BAA8B,EAAA;YAEhEvC,MAAAA,CAAO8C,IAAI,CAACH,GAAG,CAAC;gBACdI,qBAAAA,EAAuB;AACrBC,oBAAAA,IAAAA,EAAM,IAAI,CAAChB,WAAW,CAACiB,IAAI,CAAC,IAAI,CAAA;oBAChCC,OAAAA,EAASV;AACX;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\nimport type workflowMetrics from './index';\nimport type { WeeklyMetrics } from './index';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi }) as typeof workflowMetrics;\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics(): Promise<WeeklyMetrics> {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
@@ -42,7 +42,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
42
42
  },
43
43
  async sendMetrics () {
44
44
  const computedMetrics = await this.computeMetrics();
45
- metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
45
+ await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
46
46
  const metricsInfoStored = await getMetricsStoreValue();
47
47
  // @ts-expect-error metricsInfoStored can use spread
48
48
  await setMetricsStoreValue({
@@ -1 +1 @@
1
- {"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":";;;;AAKA,MAAMA,QAAAA,GAAW,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAA;AAEpC,MAAMC,uBAAAA,GAA0B,CAACC,IAAAA,GAC/B,CAAA,EAAGA,KAAKC,UAAU,EAAA,CAAG,CAAC,EAAED,IAAAA,CAAKE,UAAU,EAAA,CAAG,CAAC,EAAEF,IAAAA,CAAKG,QAAQ,GAAG,KAAK,EAAEH,IAAAA,CAAKI,MAAM,EAAA,CAAA,CAAI;AAErF,mCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,OAAAA,GAAUC,WAAW,kBAAA,EAAoB;AAAEF,QAAAA;AAAO,KAAA,CAAA;IACxD,MAAMG,gBAAAA,GAAmBD,WAAW,WAAA,EAAa;AAAEF,QAAAA;AAAO,KAAA,CAAA;AAE1D,IAAA,MAAMI,oBAAAA,GAAuB,UAAA;AAC3B,QAAA,MAAMC,QAAQ,MAAML,MAAAA,CAAOM,KAAK,CAACC,GAAG,CAAC;YAAEC,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK;AAAU,SAAA,CAAA;QAClF,OAAOC,SAAAA,CAAUN,OAAO,EAAC,CAAA;AAC3B,IAAA,CAAA;AAEA,IAAA,MAAMO,uBAAuB,CAACP,KAAAA,GAC5BL,OAAOM,KAAK,CAACO,GAAG,CAAC;YAAEL,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK,SAAA;AAAWL,YAAAA;AAAM,SAAA,CAAA;IAEvE,OAAO;QACL,MAAMS,cAAAA,CAAAA,GAAAA;;AAEJ,YAAA,MAAMC,SAAAA,GAAY,MAAMZ,gBAAAA,CAAiBa,IAAI,CAAC;gBAAEC,QAAAA,EAAU;AAAS,aAAA,CAAA;AAEnE,YAAA,MAAMC,cAAcC,GAAAA,CAAIJ,SAAAA,EAAW,CAACK,QAAAA,GAAaC,IAAAA,CAAKD,SAASE,MAAM,CAAA,CAAA;AAErE,YAAA,MAAMC,oBAAoBJ,GAAAA,CAAIJ,SAAAA,EAAW,CAACK,QAAAA,GAAaC,IAAAA,CAAKD,SAASI,YAAY,CAAA,CAAA;YAEjF,OAAO;AACLC,gBAAAA,uBAAAA,EAAyBJ,IAAAA,CAAKN,SAAAA,CAAAA;AAC9BW,gBAAAA,cAAAA,EAAgBC,IAAAA,CAAKT,WAAAA,CAAAA;AACrBU,gBAAAA,cAAAA,EAAgBC,GAAAA,CAAIX,WAAAA,CAAAA;AACpBY,gBAAAA,qBAAAA,EAAuBC,GAAAA,CAAIR,iBAAAA;AAC7B,aAAA;AACF,QAAA,CAAA;QAEA,MAAMS,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,eAAAA,GAAkB,MAAM,IAAI,CAACnB,cAAc,EAAA;AACjDb,YAAAA,OAAAA,CAAQiC,4CAA4C,CAACD,eAAAA,CAAAA;AAErD,YAAA,MAAME,oBAAoB,MAAM/B,oBAAAA,EAAAA;;AAEhC,YAAA,MAAMQ,oBAAAA,CAAqB;AAAE,gBAAA,GAAGuB,iBAAiB;gBAAEC,gBAAAA,EAAkB,IAAIC,OAAOC,OAAO;AAAG,aAAA,CAAA;AAC5F,QAAA,CAAA;QAEA,MAAMC,8BAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMJ,oBAAyB,MAAM/B,oBAAAA,EAAAA;AACrC,YAAA,MAAM,EAAEoC,cAAAA,EAAgBC,eAAe,EAAEL,gBAAgB,EAAE,GAAGD,iBAAAA;AAE9D,YAAA,MAAMO,MAAM,IAAIL,IAAAA,EAAAA;AAChB,YAAA,IAAIG,cAAAA,GAAiBC,eAAAA;YAErB,IAAI,CAACA,mBAAmB,CAACL,gBAAAA,IAAoBA,mBAAmB3C,QAAAA,GAAWiD,GAAAA,CAAIJ,OAAO,EAAA,EAAI;gBACxFE,cAAAA,GAAiB9C,uBAAAA,CAAwBiD,IAAID,GAAAA,EAAK;oBAAEE,OAAAA,EAAS;AAAG,iBAAA,CAAA,CAAA;AAChE,gBAAA,MAAMhC,oBAAAA,CAAqB;AAAE,oBAAA,GAAGuB,iBAAiB;AAAEK,oBAAAA;AAAe,iBAAA,CAAA;AACpE,YAAA;YAEA,OAAOA,cAAAA;AACT,QAAA,CAAA;QAEA,MAAMK,YAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAML,cAAAA,GAAiB,MAAM,IAAI,CAACD,8BAA8B,EAAA;YAEhEvC,MAAAA,CAAO8C,IAAI,CAACH,GAAG,CAAC;gBACdI,qBAAAA,EAAuB;AACrBC,oBAAAA,IAAAA,EAAM,IAAI,CAAChB,WAAW,CAACiB,IAAI,CAAC,IAAI,CAAA;oBAChCC,OAAAA,EAASV;AACX;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\nimport type workflowMetrics from './index';\nimport type { WeeklyMetrics } from './index';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi }) as typeof workflowMetrics;\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics(): Promise<WeeklyMetrics> {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
@@ -5,9 +5,9 @@ var index = require('../utils/index.js');
5
5
  var workflows = require('../constants/workflows.js');
6
6
 
7
7
  const { ApplicationError } = utils.errors;
8
- const validActions = [
8
+ const validActions = new Set([
9
9
  workflows.STAGE_TRANSITION_UID
10
- ];
10
+ ]);
11
11
  var stagePermissions = (({ strapi })=>{
12
12
  const roleService = index.getAdminService('role');
13
13
  const permissionService = index.getAdminService('permission');
@@ -20,7 +20,7 @@ var stagePermissions = (({ strapi })=>{
20
20
  };
21
21
  return {
22
22
  async register ({ roleId, action, fromStage }) {
23
- if (!validActions.includes(action)) {
23
+ if (!validActions.has(action)) {
24
24
  throw new ApplicationError(`Invalid action ${action}`);
25
25
  }
26
26
  const permissions = await roleService.addPermissions(roleId, [
@@ -38,7 +38,7 @@ var stagePermissions = (({ strapi })=>{
38
38
  return utils.async.map(permissions, this.register);
39
39
  },
40
40
  async registerTo ({ roleId, action, toStage }) {
41
- if (!validActions.includes(action)) {
41
+ if (!validActions.has(action)) {
42
42
  throw new ApplicationError(`Invalid action ${action}`);
43
43
  }
44
44
  const permissions = await roleService.addPermissions(roleId, [
@@ -1 +1 @@
1
- {"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = [STAGE_TRANSITION_UID];\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","includes","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
1
+ {"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = new Set([STAGE_TRANSITION_UID]);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","Set","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","has","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","undefined"],"mappings":"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"}
@@ -3,9 +3,9 @@ import { getAdminService } from '../utils/index.mjs';
3
3
  import { STAGE_MODEL_UID, STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
4
4
 
5
5
  const { ApplicationError } = errors;
6
- const validActions = [
6
+ const validActions = new Set([
7
7
  STAGE_TRANSITION_UID
8
- ];
8
+ ]);
9
9
  var stagePermissions = (({ strapi })=>{
10
10
  const roleService = getAdminService('role');
11
11
  const permissionService = getAdminService('permission');
@@ -18,7 +18,7 @@ var stagePermissions = (({ strapi })=>{
18
18
  };
19
19
  return {
20
20
  async register ({ roleId, action, fromStage }) {
21
- if (!validActions.includes(action)) {
21
+ if (!validActions.has(action)) {
22
22
  throw new ApplicationError(`Invalid action ${action}`);
23
23
  }
24
24
  const permissions = await roleService.addPermissions(roleId, [
@@ -36,7 +36,7 @@ var stagePermissions = (({ strapi })=>{
36
36
  return async.map(permissions, this.register);
37
37
  },
38
38
  async registerTo ({ roleId, action, toStage }) {
39
- if (!validActions.includes(action)) {
39
+ if (!validActions.has(action)) {
40
40
  throw new ApplicationError(`Invalid action ${action}`);
41
41
  }
42
42
  const permissions = await roleService.addPermissions(roleId, [
@@ -1 +1 @@
1
- {"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = [STAGE_TRANSITION_UID];\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","includes","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
1
+ {"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = new Set([STAGE_TRANSITION_UID]);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","Set","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","has","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","undefined"],"mappings":"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"}
@@ -159,7 +159,7 @@ var stages = (({ strapi })=>{
159
159
  });
160
160
  },
161
161
  async deleteStagePermissions (stages) {
162
- const permissions = stages.map((s)=>s.permissions || []).flat();
162
+ const permissions = stages.flatMap((s)=>s.permissions || []);
163
163
  await stagePermissionsService.unregister(permissions || []);
164
164
  },
165
165
  count ({ workflowId } = {}) {
@@ -378,7 +378,7 @@ const normalizeStageForDiff = (stage)=>({
378
378
  // If no matching element is found before the startIndex,
379
379
  // search the remaining elements in the array
380
380
  const remainingArray = stages.slice(startIndex + 1);
381
- const nearestObject = remainingArray.filter(condition)[0];
381
+ const nearestObject = remainingArray.find(condition);
382
382
  return nearestObject;
383
383
  }
384
384
 
@@ -1 +1 @@
1
- {"version":3,"file":"stages.js","sources":["../../../server/src/services/stages.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { pick, map, isEqual } from 'lodash';\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { STAGE_MODEL_UID, ENTITY_STAGE_ATTRIBUTE, ERRORS } from '../constants/workflows';\nimport { getService } from '../utils';\n\ninterface PopulatedPermission {\n role: number | { id: number };\n action: string;\n actionParameters?: { from?: number; to?: number };\n}\n\nconst { ApplicationError, ValidationError } = errors;\nconst sanitizedStageFields = ['id', 'name', 'workflow', 'color'];\nconst sanitizeStageFields = (stage: Record<string, unknown>) => pick(stage, sanitizedStageFields);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const stagePermissionsService = getService('stage-permissions', { strapi });\n const workflowValidator = getService('validation', { strapi });\n\n return {\n find({ workflowId, populate }: any) {\n return strapi.db.query(STAGE_MODEL_UID).findMany({\n where: { workflow: workflowId },\n populate,\n });\n },\n\n findById(id: string | number, { populate }: any = {}) {\n return strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id },\n populate,\n });\n },\n\n async createMany(stagesList: any, { fields }: any = {}) {\n const params = { select: fields ?? '*' };\n\n const stages = await Promise.all(\n stagesList.map((stage: any) =>\n strapi.db.query(STAGE_MODEL_UID).create({\n data: sanitizeStageFields(stage),\n ...params,\n })\n )\n );\n\n await async.reduce(stagesList)(async (_, stage, idx) => {\n const stageId = stages[idx].id;\n const allPermissionIds: number[] = [];\n\n // Register \"from\" permissions\n if (stage.fromPermissions && stage.fromPermissions.length > 0) {\n const fromPermissions = await async.map(\n stage.fromPermissions,\n (permission: StagePermission) =>\n stagePermissionsService.register({\n roleId: permission.role,\n action: permission.action,\n fromStage: stageId,\n })\n );\n allPermissionIds.push(...fromPermissions.flat().map((p: { id: number }) => p.id));\n }\n\n // Register \"to\" permissions\n if (stage.toPermissions && stage.toPermissions.length > 0) {\n const toPermissions = await async.map(\n stage.toPermissions,\n (permission: StagePermission) =>\n stagePermissionsService.registerTo({\n roleId: permission.role,\n action: permission.action,\n toStage: stageId,\n })\n );\n allPermissionIds.push(...toPermissions.flat().map((p: { id: number }) => p.id));\n }\n\n if (allPermissionIds.length > 0) {\n await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: stageId },\n data: {\n permissions: allPermissionIds,\n },\n });\n }\n }, []);\n\n metrics.sendDidCreateStage();\n\n return stages;\n },\n\n async update(srcStage: any, destStage: any) {\n const stageId = destStage.id;\n const hasPermissionChanges = destStage.fromPermissions || destStage.toPermissions;\n\n let allPermissionIds: number[];\n\n if (hasPermissionChanges) {\n // Delete all old permissions (both from and to) when either type changes\n await this.deleteStagePermissions([srcStage]);\n\n allPermissionIds = [];\n\n const extractRoleId = (p: PopulatedPermission): number =>\n typeof p.role === 'object' ? p.role.id : p.role;\n\n // Re-register \"from\" permissions (fall back to existing \"from\" entries from DB)\n const fromPerms =\n destStage.fromPermissions ??\n (srcStage?.permissions ?? [])\n .filter((p: PopulatedPermission) => p.actionParameters?.from)\n .map((p: PopulatedPermission) => ({ role: extractRoleId(p), action: p.action }));\n\n if (fromPerms.length > 0) {\n const registered = await async.map(fromPerms, (permission: StagePermission) =>\n stagePermissionsService.register({\n roleId: permission.role,\n action: permission.action,\n fromStage: stageId,\n })\n );\n allPermissionIds.push(...registered.flat().map((p: { id: number }) => p.id));\n }\n\n // Re-register \"to\" permissions (fall back to existing \"to\" entries from DB)\n const toPerms =\n destStage.toPermissions ??\n (srcStage?.permissions ?? [])\n .filter((p: PopulatedPermission) => p.actionParameters?.to)\n .map((p: PopulatedPermission) => ({ role: extractRoleId(p), action: p.action }));\n\n if (toPerms.length > 0) {\n const registered = await async.map(toPerms, (permission: StagePermission) =>\n stagePermissionsService.registerTo({\n roleId: permission.role,\n action: permission.action,\n toStage: stageId,\n })\n );\n allPermissionIds.push(...registered.flat().map((p: { id: number }) => p.id));\n }\n } else {\n allPermissionIds = (srcStage?.permissions ?? [])\n .map((p: { id: number }) => p.id)\n .filter(Boolean);\n }\n\n const stage = await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: stageId },\n data: {\n ...destStage,\n permissions: allPermissionIds,\n },\n });\n\n metrics.sendDidEditStage();\n\n return stage;\n },\n\n async delete(stage: any) {\n // Unregister all permissions related to this stage id\n await this.deleteStagePermissions([stage]);\n\n const deletedStage = await strapi.db.query(STAGE_MODEL_UID).delete({\n where: { id: stage.id },\n });\n\n metrics.sendDidDeleteStage();\n\n return deletedStage;\n },\n\n async deleteMany(stages: any) {\n await this.deleteStagePermissions(stages);\n\n return strapi.db.query(STAGE_MODEL_UID).deleteMany({\n where: { id: { $in: stages.map((s: any) => s.id) } },\n });\n },\n\n async deleteStagePermissions(stages: any) {\n const permissions = stages.map((s: any) => s.permissions || []).flat();\n await stagePermissionsService.unregister(permissions || []);\n },\n\n count({ workflowId }: any = {}) {\n const opts = {} as any;\n\n if (workflowId) {\n opts.where = {\n workflow: workflowId,\n };\n }\n\n return strapi.db.query(STAGE_MODEL_UID).count(opts);\n },\n\n async replaceStages(srcStages: any, destStages: any, contentTypesToMigrate = []) {\n const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);\n\n assertAtLeastOneStageRemain(srcStages || [], { created, deleted });\n\n // Update stages and assign entity stages\n return strapi.db.transaction(async ({ trx }) => {\n // Create the new stages\n const createdStages = await this.createMany(created, { fields: ['id'] });\n // Put all the newly created stages ids\n const createdStagesIds = map(createdStages, 'id');\n\n // Update the workflow stages\n await async.map(updated, (destStage: any) => {\n const srcStage = srcStages.find((s: any) => s.id === destStage.id);\n\n return this.update(srcStage, destStage);\n });\n\n // Delete the stages that are not in the new stages list\n await async.map(deleted, async (stage: any) => {\n // Find the nearest stage in the workflow and newly created stages\n // that is not deleted, prioritizing the previous stages\n const nearestStage = findNearestMatchingStage(\n [...srcStages, ...createdStages],\n srcStages.findIndex((s: any) => s.id === stage.id),\n (targetStage: any) => {\n return !deleted.find((s: any) => s.id === targetStage.id);\n }\n );\n\n // Assign the new stage to entities that had the deleted stage\n await async.map(contentTypesToMigrate, (contentTypeUID: any) => {\n this.updateEntitiesStage(contentTypeUID, {\n fromStageId: stage.id,\n toStageId: nearestStage.id,\n trx,\n });\n });\n\n return this.delete(stage);\n });\n\n return destStages.map((stage: any) => ({\n ...stage,\n id: stage.id ?? createdStagesIds.shift(),\n }));\n });\n },\n\n /**\n * Update the stage of an entity\n */\n async updateEntity(\n entityToUpdate: {\n id: number | string;\n documentId: string;\n locale: string;\n updatedAt: string;\n },\n model: UID.ContentType,\n stageId: any\n ) {\n const stage = await this.findById(stageId);\n const { documentId, locale } = entityToUpdate;\n\n await workflowValidator.validateWorkflowCount();\n\n if (!stage) {\n throw new ApplicationError(`Selected stage does not exist`);\n }\n\n const entity = await strapi.documents(model).update({\n documentId,\n locale,\n // Stage doesn't have DP or i18n enabled, connecting it through the `id`\n // will be safer than relying on the `documentId` + `locale` + `status` transformation\n data: { [ENTITY_STAGE_ATTRIBUTE]: pick(stage, ['id']) },\n populate: [ENTITY_STAGE_ATTRIBUTE],\n });\n\n // Update the `updated_at` field of the entity, so that the `status` is not considered `Modified`\n // NOTE: `updatedAt` is a protected attribute that can not be modified directly from the query layer\n // hence the knex query builder is used here.\n const { tableName } = strapi.db.metadata.get(model);\n await strapi.db\n .connection(tableName)\n .where({ id: entityToUpdate.id })\n .update({\n updated_at: new Date(entityToUpdate.updatedAt),\n });\n\n metrics.sendDidChangeEntryStage();\n\n return entity;\n },\n\n /**\n * Updates entity stages of a content type:\n * - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage\n * - If fromStageId is null, all entities without a stage will be assigned the new stage\n * - If fromStageId is a number, all entities with that stage will be assigned the new stage\n *\n * For performance reasons we use knex queries directly.\n *\n * @param {string} contentTypeUID\n * @param {number | undefined | null} fromStageId\n * @param {number} toStageId\n * @param {import('knex').Knex.Transaction} trx\n * @returns\n */\n async updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any) {\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;\n const joinColumn = joinTable.joinColumn.name;\n const invJoinColumn = joinTable.inverseJoinColumn.name;\n\n await workflowValidator.validateWorkflowCount();\n\n return strapi.db.transaction(async ({ trx }) => {\n // Update all already existing links to the new stage\n if (fromStageId === undefined) {\n return strapi.db\n .getConnection()\n .from(joinTable.name)\n .update({ [invJoinColumn]: toStageId })\n .transacting(trx);\n }\n\n // Update all links from the specified stage to the new stage\n const selectStatement = strapi.db\n .getConnection()\n .select({ [joinColumn]: 't1.id', [invJoinColumn]: toStageId })\n .from(`${tableName} as t1`)\n .leftJoin(`${joinTable.name} as t2`, `t1.id`, `t2.${joinColumn}`)\n .where(`t2.${invJoinColumn}`, fromStageId)\n .toSQL();\n\n // Insert rows for all entries of the content type that have the specified stage\n return strapi.db\n .getConnection(joinTable.name)\n .insert(\n strapi.db.connection.raw(\n `(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`,\n selectStatement.bindings\n )\n )\n .transacting(trx);\n });\n },\n\n /**\n * Deletes all entity stages of a content type\n * @param {string} contentTypeUID\n * @returns\n */\n async deleteAllEntitiesStage(contentTypeUID: any) {\n const { attributes } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;\n\n // Delete all stage links for the content type\n return strapi.db.transaction(async ({ trx }) =>\n strapi.db.getConnection().from(joinTable.name).delete().transacting(trx)\n );\n },\n };\n};\n\nconst normalizeStageForDiff = (stage: {\n name?: string;\n color?: string;\n fromPermissions?: unknown[];\n toPermissions?: unknown[];\n}) => ({\n ...pick(stage, ['name', 'color']),\n fromPermissions: stage.fromPermissions ?? [],\n toPermissions: stage.toPermissions ?? [],\n});\n\n/**\n * Compares two arrays of stages and returns an object indicating the differences.\n *\n * The function compares the `id` properties of each stage in `sourceStages` and `comparisonStages` to determine if the stage is present in both arrays.\n * If a stage with the same `id` is found in both arrays but the `name` property is different, the stage is considered updated.\n * If a stage with a particular `id` is only found in `comparisonStages`, it is considered created.\n * If a stage with a particular `id` is only found in `sourceStages`, it is considered deleted.\n *\n * @typedef {{id: Number, name: String, workflow: Number}} Stage\n * @typedef {{created: Stage[], updated: Stage[], deleted: Stage[]}} DiffStages\n *\n * The DiffStages object has three properties: `created`, `updated`, and `deleted`.\n * `created` is an array of stages that are in `comparisonStages` but not in `sourceStages`.\n * `updated` is an array of stages that have different names in `comparisonStages` and `sourceStages`.\n * `deleted` is an array of stages that are in `sourceStages` but not in `comparisonStages`.\n *\n * @param {Stage[]} sourceStages\n * @param {Stage[]} comparisonStages\n * @returns { DiffStages }\n */\nfunction getDiffBetweenStages(sourceStages: any, comparisonStages: any) {\n const result = comparisonStages.reduce(\n // ...\n\n (acc: any, stageToCompare: any) => {\n const srcStage = sourceStages.find((stage: any) => stage.id === stageToCompare.id);\n\n if (!srcStage) {\n acc.created.push(stageToCompare);\n } else if (!isEqual(normalizeStageForDiff(srcStage), normalizeStageForDiff(stageToCompare))) {\n acc.updated.push(stageToCompare);\n }\n return acc;\n },\n { created: [], updated: [] }\n );\n\n result.deleted = sourceStages.filter(\n (srcStage: any) => !comparisonStages.some((cmpStage: any) => cmpStage.id === srcStage.id)\n );\n\n return result;\n}\n\n/**\n * Asserts that at least one stage remains in the workflow after applying deletions and additions.\n *\n * @param {Array} workflowStages - An array of stages in the current workflow.\n * @param {Object} diffStages - An object containing the stages to be deleted and created.\n * @param {Array} diffStages.deleted - An array of stages that are planned to be deleted from the workflow.\n * @param {Array} diffStages.created - An array of stages that are planned to be created in the workflow.\n *\n * @throws {ValidationError} If the number of remaining stages in the workflow after applying deletions and additions is less than 1.\n */\nfunction assertAtLeastOneStageRemain(workflowStages: any, diffStages: any) {\n const remainingStagesCount =\n workflowStages.length - diffStages.deleted.length + diffStages.created.length;\n if (remainingStagesCount < 1) {\n throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);\n }\n}\n\n/**\n * Find the id of the nearest object in an array that matches a condition.\n * Used for searching for the nearest stage that is not deleted.\n * Starts by searching the elements before the index, then the remaining elements in the array.\n *\n * @param {Array} stages\n * @param {Number} startIndex the index to start searching from\n * @param {Function} condition must evaluate to true for the object to be considered a match\n * @returns {Object} stage\n */\nfunction findNearestMatchingStage(stages: any, startIndex: any, condition: any) {\n // Start by searching the elements before the startIndex\n for (let i = startIndex; i >= 0; i -= 1) {\n if (condition(stages[i])) {\n return stages[i];\n }\n }\n\n // If no matching element is found before the startIndex,\n // search the remaining elements in the array\n const remainingArray = stages.slice(startIndex + 1);\n const nearestObject = remainingArray.filter(condition)[0];\n return nearestObject;\n}\n"],"names":["ApplicationError","ValidationError","errors","sanitizedStageFields","sanitizeStageFields","stage","pick","strapi","metrics","getService","stagePermissionsService","workflowValidator","find","workflowId","populate","db","query","STAGE_MODEL_UID","findMany","where","workflow","findById","id","findOne","createMany","stagesList","fields","params","select","stages","Promise","all","map","create","data","async","reduce","_","idx","stageId","allPermissionIds","fromPermissions","length","permission","register","roleId","role","action","fromStage","push","flat","p","toPermissions","registerTo","toStage","update","permissions","sendDidCreateStage","srcStage","destStage","hasPermissionChanges","deleteStagePermissions","extractRoleId","fromPerms","filter","actionParameters","from","registered","toPerms","to","Boolean","sendDidEditStage","delete","deletedStage","sendDidDeleteStage","deleteMany","$in","s","unregister","count","opts","replaceStages","srcStages","destStages","contentTypesToMigrate","created","updated","deleted","getDiffBetweenStages","assertAtLeastOneStageRemain","transaction","trx","createdStages","createdStagesIds","nearestStage","findNearestMatchingStage","findIndex","targetStage","contentTypeUID","updateEntitiesStage","fromStageId","toStageId","shift","updateEntity","entityToUpdate","model","documentId","locale","validateWorkflowCount","entity","documents","ENTITY_STAGE_ATTRIBUTE","tableName","metadata","get","connection","updated_at","Date","updatedAt","sendDidChangeEntryStage","attributes","joinTable","joinColumn","name","invJoinColumn","inverseJoinColumn","undefined","getConnection","transacting","selectStatement","leftJoin","toSQL","insert","raw","sql","bindings","deleteAllEntitiesStage","normalizeStageForDiff","sourceStages","comparisonStages","result","acc","stageToCompare","isEqual","some","cmpStage","workflowStages","diffStages","remainingStagesCount","ERRORS","WORKFLOW_WITHOUT_STAGES","startIndex","condition","i","remainingArray","slice","nearestObject"],"mappings":"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"}
1
+ {"version":3,"file":"stages.js","sources":["../../../server/src/services/stages.ts"],"sourcesContent":["import type { Core, UID } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { pick, map, isEqual } from 'lodash';\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { STAGE_MODEL_UID, ENTITY_STAGE_ATTRIBUTE, ERRORS } from '../constants/workflows';\nimport { getService } from '../utils';\n\ninterface PopulatedPermission {\n role: number | { id: number };\n action: string;\n actionParameters?: { from?: number; to?: number };\n}\n\nconst { ApplicationError, ValidationError } = errors;\nconst sanitizedStageFields = ['id', 'name', 'workflow', 'color'];\nconst sanitizeStageFields = (stage: Record<string, unknown>) => pick(stage, sanitizedStageFields);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const stagePermissionsService = getService('stage-permissions', { strapi });\n const workflowValidator = getService('validation', { strapi });\n\n return {\n find({ workflowId, populate }: any) {\n return strapi.db.query(STAGE_MODEL_UID).findMany({\n where: { workflow: workflowId },\n populate,\n });\n },\n\n findById(id: string | number, { populate }: any = {}) {\n return strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id },\n populate,\n });\n },\n\n async createMany(stagesList: any, { fields }: any = {}) {\n const params = { select: fields ?? '*' };\n\n const stages = await Promise.all(\n stagesList.map((stage: any) =>\n strapi.db.query(STAGE_MODEL_UID).create({\n data: sanitizeStageFields(stage),\n ...params,\n })\n )\n );\n\n await async.reduce(stagesList)(async (_, stage, idx) => {\n const stageId = stages[idx].id;\n const allPermissionIds: number[] = [];\n\n // Register \"from\" permissions\n if (stage.fromPermissions && stage.fromPermissions.length > 0) {\n const fromPermissions = await async.map(\n stage.fromPermissions,\n (permission: StagePermission) =>\n stagePermissionsService.register({\n roleId: permission.role,\n action: permission.action,\n fromStage: stageId,\n })\n );\n allPermissionIds.push(...fromPermissions.flat().map((p: { id: number }) => p.id));\n }\n\n // Register \"to\" permissions\n if (stage.toPermissions && stage.toPermissions.length > 0) {\n const toPermissions = await async.map(\n stage.toPermissions,\n (permission: StagePermission) =>\n stagePermissionsService.registerTo({\n roleId: permission.role,\n action: permission.action,\n toStage: stageId,\n })\n );\n allPermissionIds.push(...toPermissions.flat().map((p: { id: number }) => p.id));\n }\n\n if (allPermissionIds.length > 0) {\n await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: stageId },\n data: {\n permissions: allPermissionIds,\n },\n });\n }\n }, []);\n\n metrics.sendDidCreateStage();\n\n return stages;\n },\n\n async update(srcStage: any, destStage: any) {\n const stageId = destStage.id;\n const hasPermissionChanges = destStage.fromPermissions || destStage.toPermissions;\n\n let allPermissionIds: number[];\n\n if (hasPermissionChanges) {\n // Delete all old permissions (both from and to) when either type changes\n await this.deleteStagePermissions([srcStage]);\n\n allPermissionIds = [];\n\n const extractRoleId = (p: PopulatedPermission): number =>\n typeof p.role === 'object' ? p.role.id : p.role;\n\n // Re-register \"from\" permissions (fall back to existing \"from\" entries from DB)\n const fromPerms =\n destStage.fromPermissions ??\n (srcStage?.permissions ?? [])\n .filter((p: PopulatedPermission) => p.actionParameters?.from)\n .map((p: PopulatedPermission) => ({ role: extractRoleId(p), action: p.action }));\n\n if (fromPerms.length > 0) {\n const registered = await async.map(fromPerms, (permission: StagePermission) =>\n stagePermissionsService.register({\n roleId: permission.role,\n action: permission.action,\n fromStage: stageId,\n })\n );\n allPermissionIds.push(...registered.flat().map((p: { id: number }) => p.id));\n }\n\n // Re-register \"to\" permissions (fall back to existing \"to\" entries from DB)\n const toPerms =\n destStage.toPermissions ??\n (srcStage?.permissions ?? [])\n .filter((p: PopulatedPermission) => p.actionParameters?.to)\n .map((p: PopulatedPermission) => ({ role: extractRoleId(p), action: p.action }));\n\n if (toPerms.length > 0) {\n const registered = await async.map(toPerms, (permission: StagePermission) =>\n stagePermissionsService.registerTo({\n roleId: permission.role,\n action: permission.action,\n toStage: stageId,\n })\n );\n allPermissionIds.push(...registered.flat().map((p: { id: number }) => p.id));\n }\n } else {\n allPermissionIds = (srcStage?.permissions ?? [])\n .map((p: { id: number }) => p.id)\n .filter(Boolean);\n }\n\n const stage = await strapi.db.query(STAGE_MODEL_UID).update({\n where: { id: stageId },\n data: {\n ...destStage,\n permissions: allPermissionIds,\n },\n });\n\n metrics.sendDidEditStage();\n\n return stage;\n },\n\n async delete(stage: any) {\n // Unregister all permissions related to this stage id\n await this.deleteStagePermissions([stage]);\n\n const deletedStage = await strapi.db.query(STAGE_MODEL_UID).delete({\n where: { id: stage.id },\n });\n\n metrics.sendDidDeleteStage();\n\n return deletedStage;\n },\n\n async deleteMany(stages: any) {\n await this.deleteStagePermissions(stages);\n\n return strapi.db.query(STAGE_MODEL_UID).deleteMany({\n where: { id: { $in: stages.map((s: any) => s.id) } },\n });\n },\n\n async deleteStagePermissions(stages: any) {\n const permissions = stages.flatMap((s: any) => s.permissions || []);\n await stagePermissionsService.unregister(permissions || []);\n },\n\n count({ workflowId }: any = {}) {\n const opts = {} as any;\n\n if (workflowId) {\n opts.where = {\n workflow: workflowId,\n };\n }\n\n return strapi.db.query(STAGE_MODEL_UID).count(opts);\n },\n\n async replaceStages(srcStages: any, destStages: any, contentTypesToMigrate = []) {\n const { created, updated, deleted } = getDiffBetweenStages(srcStages, destStages);\n\n assertAtLeastOneStageRemain(srcStages || [], { created, deleted });\n\n // Update stages and assign entity stages\n return strapi.db.transaction(async ({ trx }) => {\n // Create the new stages\n const createdStages = await this.createMany(created, { fields: ['id'] });\n // Put all the newly created stages ids\n const createdStagesIds = map(createdStages, 'id');\n\n // Update the workflow stages\n await async.map(updated, (destStage: any) => {\n const srcStage = srcStages.find((s: any) => s.id === destStage.id);\n\n return this.update(srcStage, destStage);\n });\n\n // Delete the stages that are not in the new stages list\n await async.map(deleted, async (stage: any) => {\n // Find the nearest stage in the workflow and newly created stages\n // that is not deleted, prioritizing the previous stages\n const nearestStage = findNearestMatchingStage(\n [...srcStages, ...createdStages],\n srcStages.findIndex((s: any) => s.id === stage.id),\n (targetStage: any) => {\n return !deleted.find((s: any) => s.id === targetStage.id);\n }\n );\n\n // Assign the new stage to entities that had the deleted stage\n await async.map(contentTypesToMigrate, (contentTypeUID: any) => {\n this.updateEntitiesStage(contentTypeUID, {\n fromStageId: stage.id,\n toStageId: nearestStage.id,\n trx,\n });\n });\n\n return this.delete(stage);\n });\n\n return destStages.map((stage: any) => ({\n ...stage,\n id: stage.id ?? createdStagesIds.shift(),\n }));\n });\n },\n\n /**\n * Update the stage of an entity\n */\n async updateEntity(\n entityToUpdate: {\n id: number | string;\n documentId: string;\n locale: string;\n updatedAt: string;\n },\n model: UID.ContentType,\n stageId: any\n ) {\n const stage = await this.findById(stageId);\n const { documentId, locale } = entityToUpdate;\n\n await workflowValidator.validateWorkflowCount();\n\n if (!stage) {\n throw new ApplicationError(`Selected stage does not exist`);\n }\n\n const entity = await strapi.documents(model).update({\n documentId,\n locale,\n // Stage doesn't have DP or i18n enabled, connecting it through the `id`\n // will be safer than relying on the `documentId` + `locale` + `status` transformation\n data: { [ENTITY_STAGE_ATTRIBUTE]: pick(stage, ['id']) },\n populate: [ENTITY_STAGE_ATTRIBUTE],\n });\n\n // Update the `updated_at` field of the entity, so that the `status` is not considered `Modified`\n // NOTE: `updatedAt` is a protected attribute that can not be modified directly from the query layer\n // hence the knex query builder is used here.\n const { tableName } = strapi.db.metadata.get(model);\n await strapi.db\n .connection(tableName)\n .where({ id: entityToUpdate.id })\n .update({\n updated_at: new Date(entityToUpdate.updatedAt),\n });\n\n metrics.sendDidChangeEntryStage();\n\n return entity;\n },\n\n /**\n * Updates entity stages of a content type:\n * - If fromStageId is undefined, all entities with an existing stage will be assigned the new stage\n * - If fromStageId is null, all entities without a stage will be assigned the new stage\n * - If fromStageId is a number, all entities with that stage will be assigned the new stage\n *\n * For performance reasons we use knex queries directly.\n *\n * @param {string} contentTypeUID\n * @param {number | undefined | null} fromStageId\n * @param {number} toStageId\n * @param {import('knex').Knex.Transaction} trx\n * @returns\n */\n async updateEntitiesStage(contentTypeUID: any, { fromStageId, toStageId }: any) {\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;\n const joinColumn = joinTable.joinColumn.name;\n const invJoinColumn = joinTable.inverseJoinColumn.name;\n\n await workflowValidator.validateWorkflowCount();\n\n return strapi.db.transaction(async ({ trx }) => {\n // Update all already existing links to the new stage\n if (fromStageId === undefined) {\n return strapi.db\n .getConnection()\n .from(joinTable.name)\n .update({ [invJoinColumn]: toStageId })\n .transacting(trx);\n }\n\n // Update all links from the specified stage to the new stage\n const selectStatement = strapi.db\n .getConnection()\n .select({ [joinColumn]: 't1.id', [invJoinColumn]: toStageId })\n .from(`${tableName} as t1`)\n .leftJoin(`${joinTable.name} as t2`, `t1.id`, `t2.${joinColumn}`)\n .where(`t2.${invJoinColumn}`, fromStageId)\n .toSQL();\n\n // Insert rows for all entries of the content type that have the specified stage\n return strapi.db\n .getConnection(joinTable.name)\n .insert(\n strapi.db.connection.raw(\n `(${joinColumn}, ${invJoinColumn}) ${selectStatement.sql}`,\n selectStatement.bindings\n )\n )\n .transacting(trx);\n });\n },\n\n /**\n * Deletes all entity stages of a content type\n * @param {string} contentTypeUID\n * @returns\n */\n async deleteAllEntitiesStage(contentTypeUID: any) {\n const { attributes } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTable = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable;\n\n // Delete all stage links for the content type\n return strapi.db.transaction(async ({ trx }) =>\n strapi.db.getConnection().from(joinTable.name).delete().transacting(trx)\n );\n },\n };\n};\n\nconst normalizeStageForDiff = (stage: {\n name?: string;\n color?: string;\n fromPermissions?: unknown[];\n toPermissions?: unknown[];\n}) => ({\n ...pick(stage, ['name', 'color']),\n fromPermissions: stage.fromPermissions ?? [],\n toPermissions: stage.toPermissions ?? [],\n});\n\n/**\n * Compares two arrays of stages and returns an object indicating the differences.\n *\n * The function compares the `id` properties of each stage in `sourceStages` and `comparisonStages` to determine if the stage is present in both arrays.\n * If a stage with the same `id` is found in both arrays but the `name` property is different, the stage is considered updated.\n * If a stage with a particular `id` is only found in `comparisonStages`, it is considered created.\n * If a stage with a particular `id` is only found in `sourceStages`, it is considered deleted.\n *\n * @typedef {{id: Number, name: String, workflow: Number}} Stage\n * @typedef {{created: Stage[], updated: Stage[], deleted: Stage[]}} DiffStages\n *\n * The DiffStages object has three properties: `created`, `updated`, and `deleted`.\n * `created` is an array of stages that are in `comparisonStages` but not in `sourceStages`.\n * `updated` is an array of stages that have different names in `comparisonStages` and `sourceStages`.\n * `deleted` is an array of stages that are in `sourceStages` but not in `comparisonStages`.\n *\n * @param {Stage[]} sourceStages\n * @param {Stage[]} comparisonStages\n * @returns { DiffStages }\n */\nfunction getDiffBetweenStages(sourceStages: any, comparisonStages: any) {\n const result = comparisonStages.reduce(\n // ...\n\n (acc: any, stageToCompare: any) => {\n const srcStage = sourceStages.find((stage: any) => stage.id === stageToCompare.id);\n\n if (!srcStage) {\n acc.created.push(stageToCompare);\n } else if (!isEqual(normalizeStageForDiff(srcStage), normalizeStageForDiff(stageToCompare))) {\n acc.updated.push(stageToCompare);\n }\n return acc;\n },\n { created: [], updated: [] }\n );\n\n result.deleted = sourceStages.filter(\n (srcStage: any) => !comparisonStages.some((cmpStage: any) => cmpStage.id === srcStage.id)\n );\n\n return result;\n}\n\n/**\n * Asserts that at least one stage remains in the workflow after applying deletions and additions.\n *\n * @param {Array} workflowStages - An array of stages in the current workflow.\n * @param {Object} diffStages - An object containing the stages to be deleted and created.\n * @param {Array} diffStages.deleted - An array of stages that are planned to be deleted from the workflow.\n * @param {Array} diffStages.created - An array of stages that are planned to be created in the workflow.\n *\n * @throws {ValidationError} If the number of remaining stages in the workflow after applying deletions and additions is less than 1.\n */\nfunction assertAtLeastOneStageRemain(workflowStages: any, diffStages: any) {\n const remainingStagesCount =\n workflowStages.length - diffStages.deleted.length + diffStages.created.length;\n if (remainingStagesCount < 1) {\n throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);\n }\n}\n\n/**\n * Find the id of the nearest object in an array that matches a condition.\n * Used for searching for the nearest stage that is not deleted.\n * Starts by searching the elements before the index, then the remaining elements in the array.\n *\n * @param {Array} stages\n * @param {Number} startIndex the index to start searching from\n * @param {Function} condition must evaluate to true for the object to be considered a match\n * @returns {Object} stage\n */\nfunction findNearestMatchingStage(stages: any, startIndex: any, condition: any) {\n // Start by searching the elements before the startIndex\n for (let i = startIndex; i >= 0; i -= 1) {\n if (condition(stages[i])) {\n return stages[i];\n }\n }\n\n // If no matching element is found before the startIndex,\n // search the remaining elements in the array\n const remainingArray = stages.slice(startIndex + 1);\n const nearestObject = remainingArray.find(condition);\n return nearestObject;\n}\n"],"names":["ApplicationError","ValidationError","errors","sanitizedStageFields","sanitizeStageFields","stage","pick","strapi","metrics","getService","stagePermissionsService","workflowValidator","find","workflowId","populate","db","query","STAGE_MODEL_UID","findMany","where","workflow","findById","id","findOne","createMany","stagesList","fields","params","select","stages","Promise","all","map","create","data","async","reduce","_","idx","stageId","allPermissionIds","fromPermissions","length","permission","register","roleId","role","action","fromStage","push","flat","p","toPermissions","registerTo","toStage","update","permissions","sendDidCreateStage","srcStage","destStage","hasPermissionChanges","deleteStagePermissions","extractRoleId","fromPerms","filter","actionParameters","from","registered","toPerms","to","Boolean","sendDidEditStage","delete","deletedStage","sendDidDeleteStage","deleteMany","$in","s","flatMap","unregister","count","opts","replaceStages","srcStages","destStages","contentTypesToMigrate","created","updated","deleted","getDiffBetweenStages","assertAtLeastOneStageRemain","transaction","trx","createdStages","createdStagesIds","nearestStage","findNearestMatchingStage","findIndex","targetStage","contentTypeUID","updateEntitiesStage","fromStageId","toStageId","shift","updateEntity","entityToUpdate","model","documentId","locale","validateWorkflowCount","entity","documents","ENTITY_STAGE_ATTRIBUTE","tableName","metadata","get","connection","updated_at","Date","updatedAt","sendDidChangeEntryStage","attributes","joinTable","joinColumn","name","invJoinColumn","inverseJoinColumn","undefined","getConnection","transacting","selectStatement","leftJoin","toSQL","insert","raw","sql","bindings","deleteAllEntitiesStage","normalizeStageForDiff","sourceStages","comparisonStages","result","acc","stageToCompare","isEqual","some","cmpStage","workflowStages","diffStages","remainingStagesCount","ERRORS","WORKFLOW_WITHOUT_STAGES","startIndex","condition","i","remainingArray","slice","nearestObject"],"mappings":"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"}
@@ -157,7 +157,7 @@ var stages = (({ strapi })=>{
157
157
  });
158
158
  },
159
159
  async deleteStagePermissions (stages) {
160
- const permissions = stages.map((s)=>s.permissions || []).flat();
160
+ const permissions = stages.flatMap((s)=>s.permissions || []);
161
161
  await stagePermissionsService.unregister(permissions || []);
162
162
  },
163
163
  count ({ workflowId } = {}) {
@@ -376,7 +376,7 @@ const normalizeStageForDiff = (stage)=>({
376
376
  // If no matching element is found before the startIndex,
377
377
  // search the remaining elements in the array
378
378
  const remainingArray = stages.slice(startIndex + 1);
379
- const nearestObject = remainingArray.filter(condition)[0];
379
+ const nearestObject = remainingArray.find(condition);
380
380
  return nearestObject;
381
381
  }
382
382