{"version":3,"file":"release-action.mjs","sources":["../../../server/src/services/release-action.ts"],"sourcesContent":["import { errors, async } from '@strapi/utils';\n\nimport type { Core, Internal, Modules, UID, Data } from '@strapi/types';\n\nimport _ from 'lodash/fp';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\n\nimport type {\n  CreateReleaseAction,\n  GetReleaseActions,\n  ReleaseAction,\n  ReleaseActionGroupBy,\n  UpdateReleaseAction,\n  DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport type { Entity } from '../../../shared/types';\nimport { getService, getDraftEntryValidStatus, getEntry, getEntryStatus } from '../utils';\n\nconst getGroupName = (queryValue: string) => {\n  switch (queryValue) {\n    case 'contentType':\n      return 'contentType.displayName';\n    case 'type':\n      return 'type';\n    case 'locale':\n      return _.getOr('No locale', 'locale.name');\n    default:\n      return 'contentType.displayName';\n  }\n};\n\nexport interface Locale extends Entity {\n  name: string;\n  code: string;\n}\n\ntype LocaleDictionary = {\n  [key: Locale['code']]: Pick<Locale, 'name' | 'code'>;\n};\n\nconst createReleaseActionService = ({ strapi }: { strapi: Core.Strapi }) => {\n  const getLocalesDataForActions = async () => {\n    if (!strapi.plugin('i18n')) {\n      return {};\n    }\n\n    const allLocales: Locale[] = (await strapi.plugin('i18n').service('locales').find()) || [];\n    return allLocales.reduce<LocaleDictionary>((acc, locale) => {\n      acc[locale.code] = { name: locale.name, code: locale.code };\n\n      return acc;\n    }, {});\n  };\n\n  const getContentTypesDataForActions = async (\n    contentTypesUids: ReleaseAction['contentType'][]\n  ) => {\n    const contentManagerContentTypeService = strapi\n      .plugin('content-manager')\n      .service('content-types');\n\n    const contentTypesData: Record<\n      Internal.UID.ContentType,\n      { mainField: string; displayName: string }\n    > = {};\n    for (const contentTypeUid of contentTypesUids) {\n      const contentTypeConfig = await contentManagerContentTypeService.findConfiguration({\n        uid: contentTypeUid,\n      });\n\n      contentTypesData[contentTypeUid] = {\n        mainField: contentTypeConfig.settings.mainField,\n        displayName: strapi.getModel(contentTypeUid).info.displayName,\n      };\n    }\n\n    return contentTypesData;\n  };\n\n  return {\n    async create(\n      releaseId: CreateReleaseAction.Request['params']['releaseId'],\n      action: CreateReleaseAction.Request['body'],\n      { disableUpdateReleaseStatus = false }: { disableUpdateReleaseStatus?: boolean } = {}\n    ) {\n      const { validateEntryData, validateUniqueEntry } = getService('release-validation', {\n        strapi,\n      });\n\n      await Promise.all([\n        validateEntryData(action.contentType, action.entryDocumentId),\n        validateUniqueEntry(releaseId, action),\n      ]);\n\n      // If we are adding a singleType, we need to append the documentId of that singleType\n      const model = strapi.contentType(action.contentType);\n      if (model.kind === 'singleType') {\n        const document = await strapi.db.query(model.uid).findOne({ select: ['documentId'] });\n\n        if (!document) {\n          throw new errors.NotFoundError(`No entry found for contentType ${action.contentType}`);\n        }\n\n        action.entryDocumentId = document.documentId;\n      }\n\n      const release = await strapi.db\n        .query(RELEASE_MODEL_UID)\n        .findOne({ where: { id: releaseId } });\n\n      if (!release) {\n        throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n      }\n\n      if (release.releasedAt) {\n        throw new errors.ValidationError('Release already published');\n      }\n\n      // If the action is a publish, check if the entry is valid\n      // If the action is an unpublish, skip the validation\n      const actionStatus =\n        action.type === 'publish'\n          ? await getDraftEntryValidStatus(\n              {\n                contentType: action.contentType,\n                documentId: action.entryDocumentId,\n                locale: action.locale,\n              },\n              {\n                strapi,\n              }\n            )\n          : true;\n\n      const releaseAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).create({\n        data: {\n          ...action,\n          release: release.id,\n          isEntryValid: actionStatus,\n        },\n        populate: { release: { select: ['id'] } },\n      });\n\n      if (!disableUpdateReleaseStatus) {\n        getService('release', { strapi }).updateReleaseStatus(release.id);\n      }\n\n      return releaseAction;\n    },\n\n    async findPage(\n      releaseId: GetReleaseActions.Request['params']['releaseId'],\n      query?: GetReleaseActions.Request['query']\n    ) {\n      const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n        where: { id: releaseId },\n        select: ['id'],\n      });\n\n      if (!release) {\n        throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n      }\n\n      const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n      const { results: actions, pagination } = await strapi.db\n        .query(RELEASE_ACTION_MODEL_UID)\n        .findPage({\n          ...dbQuery,\n          where: {\n            release: releaseId,\n          },\n        });\n\n      // For each contentType on the release, we create a custom populate object for nested relations\n      const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n\n      const actionsWithEntry = await async.map(actions, async (action: ReleaseAction) => {\n        // @ts-expect-error - Core.Service type is not a function\n        const populate = await populateBuilderService(action.contentType)\n          .populateDeep(Infinity)\n          .build();\n\n        const entry = await getEntry(\n          {\n            contentType: action.contentType,\n            documentId: action.entryDocumentId,\n            locale: action.locale,\n            populate,\n            status: action.type === 'publish' ? 'draft' : 'published',\n          },\n          { strapi }\n        );\n\n        return {\n          ...action,\n          entry,\n          status: entry ? await getEntryStatus(action.contentType, entry) : null,\n        };\n      });\n\n      return {\n        results: actionsWithEntry,\n        pagination,\n      };\n    },\n\n    async groupActions(actions: ReleaseAction[], groupBy: ReleaseActionGroupBy) {\n      const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n        if (!acc.includes(action.contentType)) {\n          acc.push(action.contentType);\n        }\n\n        return acc;\n      }, []);\n      const allReleaseContentTypesDictionary = await getContentTypesDataForActions(contentTypeUids);\n      const allLocalesDictionary = await getLocalesDataForActions();\n\n      const formattedData = actions.map((action: ReleaseAction) => {\n        const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];\n\n        return {\n          ...action,\n          locale: action.locale ? allLocalesDictionary[action.locale] : null,\n          contentType: {\n            displayName,\n            mainFieldValue: action.entry[mainField],\n            uid: action.contentType,\n          },\n        };\n      });\n\n      const groupName = getGroupName(groupBy);\n      return _.groupBy(groupName)(formattedData);\n    },\n\n    async getContentTypeModelsFromActions(actions: ReleaseAction[]) {\n      const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n        if (!acc.includes(action.contentType)) {\n          acc.push(action.contentType);\n        }\n\n        return acc;\n      }, []);\n\n      const workflowsService = strapi.plugin('review-workflows').service('workflows');\n\n      const contentTypeModelsMap = await async.reduce(contentTypeUids)(\n        async (\n          accPromise: Promise<GetReleaseActions.Response['meta']['contentTypes']>,\n          contentTypeUid: ReleaseAction['contentType']\n        ) => {\n          const acc = await accPromise;\n          const contentTypeModel = strapi.getModel(contentTypeUid);\n\n          // Workflows service may not be available depending on the license\n          const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n            populate: 'stageRequiredToPublish',\n          });\n\n          acc[contentTypeUid] = {\n            ...contentTypeModel,\n            hasReviewWorkflow: !!workflow,\n            stageRequiredToPublish: workflow?.stageRequiredToPublish,\n          };\n\n          return acc;\n        },\n        {}\n      );\n\n      return contentTypeModelsMap;\n    },\n\n    async countActions(\n      query: Modules.EntityService.Params.Pick<typeof RELEASE_ACTION_MODEL_UID, 'filters'>\n    ) {\n      const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n\n      return strapi.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);\n    },\n\n    async update(\n      actionId: UpdateReleaseAction.Request['params']['actionId'],\n      releaseId: UpdateReleaseAction.Request['params']['releaseId'],\n      update: UpdateReleaseAction.Request['body']\n    ) {\n      const action = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findOne({\n        where: {\n          id: actionId,\n          release: {\n            id: releaseId,\n            releasedAt: {\n              $null: true,\n            },\n          },\n        },\n      });\n\n      if (!action) {\n        throw new errors.NotFoundError(\n          `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`\n        );\n      }\n\n      const actionStatus =\n        update.type === 'publish'\n          ? await getDraftEntryValidStatus(\n              {\n                contentType: action.contentType,\n                documentId: action.entryDocumentId,\n                locale: action.locale,\n              },\n              {\n                strapi,\n              }\n            )\n          : true;\n\n      const updatedAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n        where: {\n          id: actionId,\n          release: {\n            id: releaseId,\n            releasedAt: {\n              $null: true,\n            },\n          },\n        },\n        data: {\n          ...update,\n          isEntryValid: actionStatus,\n        },\n      });\n\n      getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n      return updatedAction;\n    },\n\n    async delete(\n      actionId: DeleteReleaseAction.Request['params']['actionId'],\n      releaseId: DeleteReleaseAction.Request['params']['releaseId']\n    ) {\n      const deletedAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).delete({\n        where: {\n          id: actionId,\n          release: {\n            id: releaseId,\n            releasedAt: {\n              $null: true,\n            },\n          },\n        },\n      });\n\n      if (!deletedAction) {\n        throw new errors.NotFoundError(\n          `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`\n        );\n      }\n\n      getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n      return deletedAction;\n    },\n\n    async validateActionsByContentTypes(contentTypeUids: UID.ContentType[]) {\n      const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n        where: {\n          contentType: {\n            $in: contentTypeUids,\n          },\n          // We only want to validate actions that are going to be published\n          type: 'publish',\n          release: {\n            releasedAt: {\n              $null: true,\n            },\n          },\n        },\n        populate: { release: true },\n      });\n\n      const releasesUpdated: Data.ID[] = [];\n\n      await async.map(actions, async (action: ReleaseAction) => {\n        const isValid = await getDraftEntryValidStatus(\n          {\n            contentType: action.contentType,\n            documentId: action.entryDocumentId,\n            locale: action.locale,\n          },\n          { strapi }\n        );\n\n        await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n          where: {\n            id: action.id,\n          },\n          data: {\n            isEntryValid: isValid,\n          },\n        });\n\n        if (!releasesUpdated.includes(action.release.id)) {\n          releasesUpdated.push(action.release.id);\n        }\n\n        return {\n          id: action.id,\n          isEntryValid: isValid,\n        };\n      });\n\n      if (releasesUpdated.length > 0) {\n        await async.map(releasesUpdated, async (releaseId: number) => {\n          await getService('release', { strapi }).updateReleaseStatus(releaseId);\n        });\n      }\n    },\n  };\n};\n\nexport type ReleaseActionService = ReturnType<typeof createReleaseActionService>;\n\nexport default createReleaseActionService;\n"],"names":["getGroupName","queryValue","_","getOr","createReleaseActionService","strapi","getLocalesDataForActions","plugin","allLocales","service","find","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","action","disableUpdateReleaseStatus","validateEntryData","validateUniqueEntry","getService","Promise","all","contentType","entryDocumentId","model","kind","document","db","query","findOne","select","errors","NotFoundError","documentId","release","RELEASE_MODEL_UID","where","id","releasedAt","ValidationError","actionStatus","type","getDraftEntryValidStatus","releaseAction","RELEASE_ACTION_MODEL_UID","data","isEntryValid","populate","updateReleaseStatus","findPage","dbQuery","get","transform","results","actions","pagination","populateBuilderService","actionsWithEntry","async","map","populateDeep","Infinity","build","entry","getEntry","status","getEntryStatus","groupActions","groupBy","contentTypeUids","includes","push","allReleaseContentTypesDictionary","allLocalesDictionary","formattedData","mainFieldValue","groupName","getContentTypeModelsFromActions","workflowsService","contentTypeModelsMap","accPromise","contentTypeModel","workflow","getAssignedWorkflow","hasReviewWorkflow","stageRequiredToPublish","countActions","count","update","actionId","$null","updatedAction","delete","deletedAction","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}