{"version":3,"file":"validation.mjs","sources":["../../../server/src/services/validation.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { uniq } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport { ERRORS, MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from '../constants/workflows';\nimport { clampMaxWorkflows, clampMaxStagesPerWorkflow } from '../utils/review-workflows';\n\nconst { ValidationError } = errors;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n  return {\n    limits: {\n      numberOfWorkflows: MAX_WORKFLOWS,\n      stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n    },\n    register({ numberOfWorkflows, stagesPerWorkflow }: any) {\n      if (!Object.isFrozen(this.limits)) {\n        this.limits.numberOfWorkflows = clampMaxWorkflows(\n          numberOfWorkflows || this.limits.numberOfWorkflows\n        );\n        this.limits.stagesPerWorkflow = clampMaxStagesPerWorkflow(\n          stagesPerWorkflow || this.limits.stagesPerWorkflow\n        );\n        Object.freeze(this.limits);\n      }\n    },\n    /**\n     * Validates the stages of a workflow.\n     * @param {Array} stages - Array of stages to be validated.\n     * @throws {ValidationError} - If the workflow has no stages or exceeds the limit.\n     */\n    validateWorkflowStages(stages: any) {\n      if (!stages || stages.length === 0) {\n        throw new ValidationError(ERRORS.WORKFLOW_WITHOUT_STAGES);\n      }\n      if (stages.length > this.limits.stagesPerWorkflow) {\n        throw new ValidationError(ERRORS.STAGES_LIMIT);\n      }\n      // Validate stage names are not duplicated\n      const stageNames = stages.map((stage: any) => stage.name);\n      if (uniq(stageNames).length !== stageNames.length) {\n        throw new ValidationError(ERRORS.DUPLICATED_STAGE_NAME);\n      }\n    },\n\n    async validateWorkflowCountStages(workflowId: any, countAddedStages = 0) {\n      const stagesService = getService('stages', { strapi });\n      const countWorkflowStages = await stagesService.count({ workflowId });\n\n      if (countWorkflowStages + countAddedStages > this.limits.stagesPerWorkflow) {\n        throw new ValidationError(ERRORS.STAGES_LIMIT);\n      }\n    },\n\n    /**\n     * Validates the count of existing and added workflows.\n     * @param {number} [countAddedWorkflows=0] - The count of workflows to be added.\n     * @throws {ValidationError} - If the total count of workflows exceeds the limit.\n     * @returns {Promise<void>} - A Promise that resolves when the validation is completed.\n     */\n    async validateWorkflowCount(countAddedWorkflows = 0) {\n      const workflowsService = getService('workflows', { strapi });\n      const countWorkflows = await workflowsService.count();\n      if (countWorkflows + countAddedWorkflows > this.limits.numberOfWorkflows) {\n        throw new ValidationError(ERRORS.WORKFLOWS_LIMIT);\n      }\n    },\n  };\n};\n"],"names":["ValidationError","errors","strapi","limits","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","register","Object","isFrozen","clampMaxWorkflows","clampMaxStagesPerWorkflow","freeze","validateWorkflowStages","stages","length","ERRORS","WORKFLOW_WITHOUT_STAGES","STAGES_LIMIT","stageNames","map","stage","name","uniq","DUPLICATED_STAGE_NAME","validateWorkflowCountStages","workflowId","countAddedStages","stagesService","getService","countWorkflowStages","count","validateWorkflowCount","countAddedWorkflows","workflowsService","countWorkflows","WORKFLOWS_LIMIT"],"mappings":";;;;;;AAOA,MAAM,EAAEA,eAAe,EAAE,GAAGC,MAAAA;AAE5B,gCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,OAAO;QACLC,MAAAA,EAAQ;YACNC,iBAAAA,EAAmBC,aAAAA;YACnBC,iBAAAA,EAAmBC;AACrB,SAAA;AACAC,QAAAA,QAAAA,CAAAA,CAAS,EAAEJ,iBAAiB,EAAEE,iBAAiB,EAAO,EAAA;AACpD,YAAA,IAAI,CAACG,MAAAA,CAAOC,QAAQ,CAAC,IAAI,CAACP,MAAM,CAAA,EAAG;gBACjC,IAAI,CAACA,MAAM,CAACC,iBAAiB,GAAGO,iBAAAA,CAC9BP,iBAAAA,IAAqB,IAAI,CAACD,MAAM,CAACC,iBAAiB,CAAA;gBAEpD,IAAI,CAACD,MAAM,CAACG,iBAAiB,GAAGM,yBAAAA,CAC9BN,iBAAAA,IAAqB,IAAI,CAACH,MAAM,CAACG,iBAAiB,CAAA;AAEpDG,gBAAAA,MAAAA,CAAOI,MAAM,CAAC,IAAI,CAACV,MAAM,CAAA;AAC3B,YAAA;AACF,QAAA,CAAA;AACA;;;;AAIC,QACDW,wBAAuBC,MAAW,EAAA;AAChC,YAAA,IAAI,CAACA,MAAAA,IAAUA,MAAAA,CAAOC,MAAM,KAAK,CAAA,EAAG;gBAClC,MAAM,IAAIhB,eAAAA,CAAgBiB,MAAAA,CAAOC,uBAAuB,CAAA;AAC1D,YAAA;YACA,IAAIH,MAAAA,CAAOC,MAAM,GAAG,IAAI,CAACb,MAAM,CAACG,iBAAiB,EAAE;gBACjD,MAAM,IAAIN,eAAAA,CAAgBiB,MAAAA,CAAOE,YAAY,CAAA;AAC/C,YAAA;;AAEA,YAAA,MAAMC,aAAaL,MAAAA,CAAOM,GAAG,CAAC,CAACC,KAAAA,GAAeA,MAAMC,IAAI,CAAA;AACxD,YAAA,IAAIC,KAAKJ,UAAAA,CAAAA,CAAYJ,MAAM,KAAKI,UAAAA,CAAWJ,MAAM,EAAE;gBACjD,MAAM,IAAIhB,eAAAA,CAAgBiB,MAAAA,CAAOQ,qBAAqB,CAAA;AACxD,YAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMC,2BAAAA,CAAAA,CAA4BC,UAAe,EAAEC,gBAAAA,GAAmB,CAAC,EAAA;YACrE,MAAMC,aAAAA,GAAgBC,WAAW,QAAA,EAAU;AAAE5B,gBAAAA;AAAO,aAAA,CAAA;AACpD,YAAA,MAAM6B,mBAAAA,GAAsB,MAAMF,aAAAA,CAAcG,KAAK,CAAC;AAAEL,gBAAAA;AAAW,aAAA,CAAA;AAEnE,YAAA,IAAII,sBAAsBH,gBAAAA,GAAmB,IAAI,CAACzB,MAAM,CAACG,iBAAiB,EAAE;gBAC1E,MAAM,IAAIN,eAAAA,CAAgBiB,MAAAA,CAAOE,YAAY,CAAA;AAC/C,YAAA;AACF,QAAA,CAAA;AAEA;;;;;QAMA,MAAMc,qBAAAA,CAAAA,CAAsBC,mBAAAA,GAAsB,CAAC,EAAA;YACjD,MAAMC,gBAAAA,GAAmBL,WAAW,WAAA,EAAa;AAAE5B,gBAAAA;AAAO,aAAA,CAAA;YAC1D,MAAMkC,cAAAA,GAAiB,MAAMD,gBAAAA,CAAiBH,KAAK,EAAA;AACnD,YAAA,IAAII,iBAAiBF,mBAAAA,GAAsB,IAAI,CAAC/B,MAAM,CAACC,iBAAiB,EAAE;gBACxE,MAAM,IAAIJ,eAAAA,CAAgBiB,MAAAA,CAAOoB,eAAe,CAAA;AAClD,YAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}