diff --git a/packages/core/admin/ee/server/services/review-workflows/review-workflows.js b/packages/core/admin/ee/server/services/review-workflows/review-workflows.js index d8b650298b..6d2c9be7a7 100644 --- a/packages/core/admin/ee/server/services/review-workflows/review-workflows.js +++ b/packages/core/admin/ee/server/services/review-workflows/review-workflows.js @@ -1,54 +1,49 @@ 'use strict'; -const { WORKFLOW_MODEL_UID, STAGE_MODEL_UID } = require('../../constants/workflows'); +const { getService } = require('../../utils'); -module.exports = ({ strapi }) => ({ - async bootstrap() { - const wfCount = await strapi.entityService.count(WORKFLOW_MODEL_UID); - const stagesCount = await strapi.entityService.count(STAGE_MODEL_UID); +// Map every stage in the array to be ordered in the relation +function buildStagesConnectArray(stages) { + return stages.map((stage, index) => { + const connect = { + id: stage.id, + position: {}, + }; - if (wfCount + stagesCount === 0) { - const defaultStages = require('../../constants/default-stages.json'); - const defaultWorkflow = require('../../constants/default-workflow.json'); - - await strapi.query('admin::workflow-stage').createMany({ data: defaultStages }); - - const stages = await strapi - .query('admin::workflow-stage') - .findMany({ limit: 4, select: ['id'] }); - - const workflow = { - ...defaultWorkflow, - stages: { - connect: [ - { - id: stages[0].id, - position: { - start: true, - }, - }, - { - id: stages[1].id, - position: { - after: stages[0].id, - }, - }, - { - id: stages[2].id, - position: { - after: stages[1].id, - }, - }, - { - id: stages[3].id, - position: { - after: stages[2].id, - }, - }, - ], - }, - }; - await strapi.query('admin::workflow').create({ data: workflow }); + if (index === 0) { + connect.position.start = true; + } else { + connect.position.after = stages[index - 1].id; } - }, -}); + return connect; + }); +} + +module.exports = ({ strapi }) => { + const workflowsService = getService('workflows', { strapi }); + const stagesService = getService('stages', { strapi }); + + return { + async bootstrap() { + const wfCount = await workflowsService.count(); + const stagesCount = await stagesService.count(); + + // Check if there is nothing about review-workflow in DB + // If any, the feature has already been initialized with a workflow and stages + if (wfCount === 0 && stagesCount === 0) { + const defaultStages = require('../../constants/default-stages.json'); + const defaultWorkflow = require('../../constants/default-workflow.json'); + + const stages = await stagesService.createMany(defaultStages, { fields: ['id'] }); + const workflow = { + ...defaultWorkflow, + stages: { + connect: buildStagesConnectArray(stages), + }, + }; + + await workflowsService.create(workflow); + } + }, + }; +}; diff --git a/packages/core/admin/ee/server/services/review-workflows/stages.js b/packages/core/admin/ee/server/services/review-workflows/stages.js index 0d15d88ae5..e351ded055 100644 --- a/packages/core/admin/ee/server/services/review-workflows/stages.js +++ b/packages/core/admin/ee/server/services/review-workflows/stages.js @@ -18,4 +18,19 @@ module.exports = ({ strapi }) => ({ }; return strapi.entityService.findOne(STAGE_MODEL_UID, id, params); }, + + createMany(stagesList, { fields }) { + const params = { + select: fields, + }; + return Promise.all( + stagesList.map((stage) => + strapi.entityService.create(STAGE_MODEL_UID, { data: stage, ...params }) + ) + ); + }, + + count() { + return strapi.entityService.count(STAGE_MODEL_UID); + }, }); diff --git a/packages/core/admin/ee/server/services/review-workflows/workflows.js b/packages/core/admin/ee/server/services/review-workflows/workflows.js index 2af7153b8e..d6749cc1b8 100644 --- a/packages/core/admin/ee/server/services/review-workflows/workflows.js +++ b/packages/core/admin/ee/server/services/review-workflows/workflows.js @@ -10,4 +10,12 @@ module.exports = ({ strapi }) => ({ findById(id, opts) { return strapi.entityService.findOne(WORKFLOW_MODEL_UID, id, opts); }, + + create(workflowData) { + return strapi.entityService.create(WORKFLOW_MODEL_UID, { data: workflowData }); + }, + + count() { + return strapi.entityService.count(WORKFLOW_MODEL_UID); + }, }); diff --git a/packages/core/admin/ee/server/utils/index.js b/packages/core/admin/ee/server/utils/index.js index dc2a8cd02e..0ab28d2609 100644 --- a/packages/core/admin/ee/server/utils/index.js +++ b/packages/core/admin/ee/server/utils/index.js @@ -1,6 +1,6 @@ 'use strict'; -const getService = (name) => { +const getService = (name, { strapi } = { strapi: global.strapi }) => { return strapi.service(`admin::${name}`); }; module.exports = {