{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep, filter, pipe, map } from 'lodash/fp';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateStageAttribute from './migrations/shorten-stage-attribute';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n  ENTITY_STAGE_ATTRIBUTE,\n  ENTITY_ASSIGNEE_ATTRIBUTE,\n  STAGE_MODEL_UID,\n  MAX_WORKFLOWS,\n  MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n  Object.assign(contentType.attributes, {\n    [attributeName]: {\n      writable: true,\n      private: false,\n      configurable: false,\n      visible: false,\n      useJoinTable: true, // We want a join table to persist data when downgrading to CE\n      type: 'relation',\n      relation: 'oneToOne',\n      target,\n    },\n  });\n\n  return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n  const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n  for (const contentTypeUID of contentTypeToExtend) {\n    strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n      // Set Stage attribute\n      setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n      // Set Assignee attribute\n      setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n    });\n  }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n *            It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n  const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n  return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n    const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n      // Persist the stage join table\n      const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n      const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n      return {\n        name: joinTableName,\n        dependsOn: [{ name: tableName }],\n      };\n    };\n\n    const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n      // Persist the assignee join table\n      const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n      const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n      return {\n        name: joinTableName,\n        dependsOn: [{ name: tableName }],\n      };\n    };\n\n    const enabledRWContentTypes = pipe([\n      getVisibleContentTypesUID,\n      filter((uid: UID.ContentType) => hasStageAttribute(contentTypes[uid])),\n    ])(contentTypes);\n\n    // Remove previously created join tables and persist the new ones\n    const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n    await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n    await persistTables(stageJoinTablesToPersist);\n\n    // Remove previously created join tables and persist the new ones\n    const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n    await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n    await persistTables(assigneeJoinTablesToPersist);\n  };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n  // Data Migrations\n  strapi.hook('strapi::content-types.beforeSync').register(migrateStageAttribute);\n  strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n  strapi\n    .hook('strapi::content-types.afterSync')\n    .register(migrateReviewWorkflowStagesColor)\n    .register(migrateReviewWorkflowStagesRoles)\n    .register(migrateReviewWorkflowStagesTransferToRoles)\n    .register(migrateReviewWorkflowName)\n    .register(migrateWorkflowsContentTypes)\n    .register(migrateDeletedCTInWorkflows);\n\n  // Middlewares\n  reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n  // Schema customization\n  extendReviewWorkflowContentTypes({ strapi });\n\n  // License limits\n  const reviewWorkflowsOptions = defaultsDeep(\n    {\n      numberOfWorkflows: MAX_WORKFLOWS,\n      stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n    },\n    strapi.ee.features.get('review-workflows')\n  );\n  const workflowsValidationService = getService('validation', { strapi });\n  workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","pipe","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateStageAttribute","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","ee","features","workflowsValidationService","getService"],"mappings":";;;;;;;;;;;;;AAwBA,MAAMA,WAAAA,GAAc,CAACC,aAAAA,EAAoBC,MAAAA,EAAaC,WAAAA,GAAAA;AACpDC,IAAAA,MAAAA,CAAOC,MAAM,CAACF,WAAAA,CAAYG,UAAU,EAAE;AACpC,QAAA,CAACL,gBAAgB;YACfM,QAAAA,EAAU,IAAA;YACVC,OAAAA,EAAS,KAAA;YACTC,YAAAA,EAAc,KAAA;YACdC,OAAAA,EAAS,KAAA;YACTC,YAAAA,EAAc,IAAA;YACdC,IAAAA,EAAM,UAAA;YACNC,QAAAA,EAAU,UAAA;AACVX,YAAAA;AACF;AACF,KAAA,CAAA;IAEA,OAAOC,WAAAA;AACT,CAAA;AAEA;;AAEC,IACD,SAASW,gCAAAA,CAAiC,EAAEC,MAAM,EAA2B,EAAA;IAC3E,MAAMC,mBAAAA,GAAsBC,yBAAAA,CAA0BF,MAAAA,CAAOG,YAAY,CAAA;IAEzE,KAAK,MAAMC,kBAAkBH,mBAAAA,CAAqB;AAChDD,QAAAA,MAAAA,CAAOK,GAAG,CAAC,eAAA,CAAA,CAAiBC,MAAM,CAACF,gBAAgB,CAAChB,WAAAA,GAAAA;;AAElDH,YAAAA,WAAAA,CAAYsB,wBAAwBC,eAAAA,EAAiBpB,WAAAA,CAAAA;;AAErDH,YAAAA,WAAAA,CAAYwB,2BAA2B,aAAA,EAAerB,WAAAA,CAAAA;AACxD,QAAA,CAAA,CAAA;AACF,IAAA;AACF;AAEA;;;;;AAKC,IACD,SAASsB,oBAAAA,CAAqB,EAAEV,MAAM,EAA2B,EAAA;AAC/D,IAAA,MAAM,EAAEW,+BAA+B,EAAEC,aAAa,EAAE,GAAGC,eAAAA,CAAgB,gBAAA,CAAA;IAE3E,OAAO,OAAO,EAAEV,YAAY,EAAkD,GAAA;AAC5E,QAAA,MAAMW,yBAAyB,CAACV,cAAAA,GAAAA;;AAE9B,YAAA,MAAM,EAAEb,UAAU,EAAEwB,SAAS,EAAE,GAAGf,MAAAA,CAAOgB,EAAE,CAACC,QAAQ,CAACZ,GAAG,CAACD,cAAAA,CAAAA;AACzD,YAAA,MAAMc,gBAAgB3B,UAAU,CAACgB,uBAAuB,CAACY,SAAS,CAACC,IAAI;YACvE,OAAO;gBACLA,IAAAA,EAAMF,aAAAA;gBACNG,SAAAA,EAAW;AAAC,oBAAA;wBAAED,IAAAA,EAAML;AAAU;AAAE;AAClC,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMO,4BAA4B,CAAClB,cAAAA,GAAAA;;AAEjC,YAAA,MAAM,EAAEb,UAAU,EAAEwB,SAAS,EAAE,GAAGf,MAAAA,CAAOgB,EAAE,CAACC,QAAQ,CAACZ,GAAG,CAACD,cAAAA,CAAAA;AACzD,YAAA,MAAMc,gBAAgB3B,UAAU,CAACkB,0BAA0B,CAACU,SAAS,CAACC,IAAI;YAC1E,OAAO;gBACLA,IAAAA,EAAMF,aAAAA;gBACNG,SAAAA,EAAW;AAAC,oBAAA;wBAAED,IAAAA,EAAML;AAAU;AAAE;AAClC,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMQ,wBAAwBC,IAAAA,CAAK;AACjCtB,YAAAA,yBAAAA;AACAuB,YAAAA,MAAAA,CAAO,CAACC,GAAAA,GAAyBC,iBAAAA,CAAkBxB,YAAY,CAACuB,GAAAA,CAAI,CAAA;SACrE,CAAA,CAAEvB,YAAAA,CAAAA;;QAGH,MAAMyB,wBAAAA,GAA2BL,qBAAAA,CAAsBM,GAAG,CAACf,sBAAAA,CAAAA;AAC3D,QAAA,MAAMH,+BAAAA,CAAgC,mBAAA,CAAA;AACtC,QAAA,MAAMC,aAAAA,CAAcgB,wBAAAA,CAAAA;;QAGpB,MAAME,2BAAAA,GAA8BP,qBAAAA,CAAsBM,GAAG,CAACP,yBAAAA,CAAAA;AAC9D,QAAA,MAAMX,+BAAAA,CAAgC,sBAAA,CAAA;AACtC,QAAA,MAAMC,aAAAA,CAAckB,2BAAAA,CAAAA;AACtB,IAAA,CAAA;AACF;AAEA,eAAe,CAAA,OAAO,EAAE9B,MAAM,EAA2B,GAAA;;AAEvDA,IAAAA,MAAAA,CAAO+B,IAAI,CAAC,kCAAA,CAAA,CAAoCC,QAAQ,CAACC,qBAAAA,CAAAA;AACzDjC,IAAAA,MAAAA,CAAO+B,IAAI,CAAC,iCAAA,CAAA,CAAmCC,QAAQ,CAACtB,oBAAAA,CAAqB;AAAEV,QAAAA;AAAO,KAAA,CAAA,CAAA;AACtFA,IAAAA,MAAAA,CACG+B,IAAI,CAAC,iCAAA,CAAA,CACLC,QAAQ,CAACE,gCAAAA,CAAAA,CACTF,QAAQ,CAACG,gCAAAA,CAAAA,CACTH,QAAQ,CAACI,0CAAAA,CAAAA,CACTJ,QAAQ,CAACK,yBAAAA,CAAAA,CACTL,QAAQ,CAACM,4BAAAA,CAAAA,CACTN,QAAQ,CAACO,2BAAAA,CAAAA;;AAGZC,IAAAA,0BAAAA,CAA2BC,qBAAqB,CAACzC,MAAAA,CAAAA;;IAGjDD,gCAAAA,CAAiC;AAAEC,QAAAA;AAAO,KAAA,CAAA;;AAG1C,IAAA,MAAM0C,yBAAyBC,YAAAA,CAC7B;QACEC,iBAAAA,EAAmBC,aAAAA;QACnBC,iBAAAA,EAAmBC;AACrB,KAAA,EACA/C,OAAOgD,EAAE,CAACC,QAAQ,CAAC5C,GAAG,CAAC,kBAAA,CAAA,CAAA;IAEzB,MAAM6C,0BAAAA,GAA6BC,WAAW,YAAA,EAAc;AAAEnD,QAAAA;AAAO,KAAA,CAAA;AACrEkD,IAAAA,0BAAAA,CAA2BlB,QAAQ,CAACU,sBAAAA,CAAAA;AACtC,CAAA;;;;"}