@strapi/content-releases 5.59.0 → 5.61.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.
@@ -1 +1 @@
1
- {"version":3,"file":"release-action.js","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';\n\nimport { AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { emitAuditOnCommit } from '../audit-logs';\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 (action: { locale?: Locale | null }) => _.get(action, 'locale.name', 'No locale');\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 const allLocales = await strapi.localization.getLocales();\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 await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_ADD, {\n releaseId: release.id,\n name: release.name,\n actionId: releaseAction.id,\n type: releaseAction.type,\n contentType: releaseAction.contentType,\n entryDocumentId: releaseAction.entryDocumentId,\n locale: releaseAction.locale,\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(formattedData, groupName);\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 populate: { release: { select: ['id', 'name'] } },\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 // Only the field the PUT contract allows. Changing the entry is remove + add.\n data: {\n type: update.type,\n isEntryValid: actionStatus,\n },\n });\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n // isEntryValid is recalculated, not edited: only the type change is audited\n if (updatedAction && action.type !== updatedAction.type) {\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {\n releaseId: action.release?.id ?? Number(releaseId),\n name: action.release?.name,\n actionId: updatedAction.id,\n contentType: updatedAction.contentType,\n entryDocumentId: updatedAction.entryDocumentId,\n locale: updatedAction.locale,\n from: action.type,\n to: updatedAction.type,\n });\n }\n\n return updatedAction;\n },\n\n async delete(\n actionId: DeleteReleaseAction.Request['params']['actionId'],\n releaseId: DeleteReleaseAction.Request['params']['releaseId']\n ) {\n const deletedRow = 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 populate: { release: { select: ['id', 'name'] } },\n });\n\n if (!deletedRow) {\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 { release: populatedRelease, ...deletedAction } = deletedRow;\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {\n releaseId: populatedRelease?.id ?? Number(releaseId),\n name: populatedRelease?.name,\n actionId: deletedAction.id,\n type: deletedAction.type,\n contentType: deletedAction.contentType,\n entryDocumentId: deletedAction.entryDocumentId,\n locale: deletedAction.locale,\n });\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","action","_","get","createReleaseActionService","strapi","getLocalesDataForActions","allLocales","localization","getLocales","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","plugin","service","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","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","emitAuditOnCommit","AUDITED_EVENTS","RELEASE_ENTRY_ADD","actionId","findPage","dbQuery","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","$null","updatedAction","RELEASE_ENTRY_UPDATE","Number","from","to","delete","deletedRow","populatedRelease","deletedAction","RELEASE_ENTRY_REMOVE","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}
1
+ {"version":3,"file":"release-action.js","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';\n\nimport { AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { emitAuditOnCommit } from '../audit-logs';\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 (action: { locale?: Locale | null }) => _.get(action, 'locale.name', 'No locale');\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 const allLocales = await strapi.localization.getLocales();\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 validateEntryData(action.contentType, action.entryDocumentId);\n await validateUniqueEntry(releaseId, action);\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 await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_ADD, {\n releaseId: release.id,\n name: release.name,\n actionId: releaseAction.id,\n type: releaseAction.type,\n contentType: releaseAction.contentType,\n entryDocumentId: releaseAction.entryDocumentId,\n locale: releaseAction.locale,\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(formattedData, groupName);\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 populate: { release: { select: ['id', 'name'] } },\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 // Only the field the PUT contract allows. Changing the entry is remove + add.\n data: {\n type: update.type,\n isEntryValid: actionStatus,\n },\n });\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n // isEntryValid is recalculated, not edited: only the type change is audited\n if (updatedAction && action.type !== updatedAction.type) {\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {\n releaseId: action.release?.id ?? Number(releaseId),\n name: action.release?.name,\n actionId: updatedAction.id,\n contentType: updatedAction.contentType,\n entryDocumentId: updatedAction.entryDocumentId,\n locale: updatedAction.locale,\n from: action.type,\n to: updatedAction.type,\n });\n }\n\n return updatedAction;\n },\n\n async delete(\n actionId: DeleteReleaseAction.Request['params']['actionId'],\n releaseId: DeleteReleaseAction.Request['params']['releaseId']\n ) {\n const deletedRow = 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 populate: { release: { select: ['id', 'name'] } },\n });\n\n if (!deletedRow) {\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 { release: populatedRelease, ...deletedAction } = deletedRow;\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {\n releaseId: populatedRelease?.id ?? Number(releaseId),\n name: populatedRelease?.name,\n actionId: deletedAction.id,\n type: deletedAction.type,\n contentType: deletedAction.contentType,\n entryDocumentId: deletedAction.entryDocumentId,\n locale: deletedAction.locale,\n });\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","action","_","get","createReleaseActionService","strapi","getLocalesDataForActions","allLocales","localization","getLocales","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","plugin","service","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","disableUpdateReleaseStatus","validateEntryData","validateUniqueEntry","getService","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","emitAuditOnCommit","AUDITED_EVENTS","RELEASE_ENTRY_ADD","actionId","findPage","dbQuery","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","$null","updatedAction","RELEASE_ENTRY_UPDATE","Number","from","to","delete","deletedRow","populatedRelease","deletedAction","RELEASE_ENTRY_REMOVE","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}
@@ -46,10 +46,8 @@ const createReleaseActionService = ({ strapi })=>{
46
46
  const { validateEntryData, validateUniqueEntry } = getService('release-validation', {
47
47
  strapi
48
48
  });
49
- await Promise.all([
50
- validateEntryData(action.contentType, action.entryDocumentId),
51
- validateUniqueEntry(releaseId, action)
52
- ]);
49
+ validateEntryData(action.contentType, action.entryDocumentId);
50
+ await validateUniqueEntry(releaseId, action);
53
51
  // If we are adding a singleType, we need to append the documentId of that singleType
54
52
  const model = strapi.contentType(action.contentType);
55
53
  if (model.kind === 'singleType') {
@@ -1 +1 @@
1
- {"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';\n\nimport { AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { emitAuditOnCommit } from '../audit-logs';\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 (action: { locale?: Locale | null }) => _.get(action, 'locale.name', 'No locale');\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 const allLocales = await strapi.localization.getLocales();\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 await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_ADD, {\n releaseId: release.id,\n name: release.name,\n actionId: releaseAction.id,\n type: releaseAction.type,\n contentType: releaseAction.contentType,\n entryDocumentId: releaseAction.entryDocumentId,\n locale: releaseAction.locale,\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(formattedData, groupName);\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 populate: { release: { select: ['id', 'name'] } },\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 // Only the field the PUT contract allows. Changing the entry is remove + add.\n data: {\n type: update.type,\n isEntryValid: actionStatus,\n },\n });\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n // isEntryValid is recalculated, not edited: only the type change is audited\n if (updatedAction && action.type !== updatedAction.type) {\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {\n releaseId: action.release?.id ?? Number(releaseId),\n name: action.release?.name,\n actionId: updatedAction.id,\n contentType: updatedAction.contentType,\n entryDocumentId: updatedAction.entryDocumentId,\n locale: updatedAction.locale,\n from: action.type,\n to: updatedAction.type,\n });\n }\n\n return updatedAction;\n },\n\n async delete(\n actionId: DeleteReleaseAction.Request['params']['actionId'],\n releaseId: DeleteReleaseAction.Request['params']['releaseId']\n ) {\n const deletedRow = 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 populate: { release: { select: ['id', 'name'] } },\n });\n\n if (!deletedRow) {\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 { release: populatedRelease, ...deletedAction } = deletedRow;\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {\n releaseId: populatedRelease?.id ?? Number(releaseId),\n name: populatedRelease?.name,\n actionId: deletedAction.id,\n type: deletedAction.type,\n contentType: deletedAction.contentType,\n entryDocumentId: deletedAction.entryDocumentId,\n locale: deletedAction.locale,\n });\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","action","_","get","createReleaseActionService","strapi","getLocalesDataForActions","allLocales","localization","getLocales","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","plugin","service","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","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","emitAuditOnCommit","AUDITED_EVENTS","RELEASE_ENTRY_ADD","actionId","findPage","dbQuery","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","$null","updatedAction","RELEASE_ENTRY_UPDATE","Number","from","to","delete","deletedRow","populatedRelease","deletedAction","RELEASE_ENTRY_REMOVE","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}
1
+ {"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';\n\nimport { AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { emitAuditOnCommit } from '../audit-logs';\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 (action: { locale?: Locale | null }) => _.get(action, 'locale.name', 'No locale');\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 const allLocales = await strapi.localization.getLocales();\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 validateEntryData(action.contentType, action.entryDocumentId);\n await validateUniqueEntry(releaseId, action);\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 await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_ADD, {\n releaseId: release.id,\n name: release.name,\n actionId: releaseAction.id,\n type: releaseAction.type,\n contentType: releaseAction.contentType,\n entryDocumentId: releaseAction.entryDocumentId,\n locale: releaseAction.locale,\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(formattedData, groupName);\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 populate: { release: { select: ['id', 'name'] } },\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 // Only the field the PUT contract allows. Changing the entry is remove + add.\n data: {\n type: update.type,\n isEntryValid: actionStatus,\n },\n });\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n // isEntryValid is recalculated, not edited: only the type change is audited\n if (updatedAction && action.type !== updatedAction.type) {\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {\n releaseId: action.release?.id ?? Number(releaseId),\n name: action.release?.name,\n actionId: updatedAction.id,\n contentType: updatedAction.contentType,\n entryDocumentId: updatedAction.entryDocumentId,\n locale: updatedAction.locale,\n from: action.type,\n to: updatedAction.type,\n });\n }\n\n return updatedAction;\n },\n\n async delete(\n actionId: DeleteReleaseAction.Request['params']['actionId'],\n releaseId: DeleteReleaseAction.Request['params']['releaseId']\n ) {\n const deletedRow = 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 populate: { release: { select: ['id', 'name'] } },\n });\n\n if (!deletedRow) {\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 { release: populatedRelease, ...deletedAction } = deletedRow;\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {\n releaseId: populatedRelease?.id ?? Number(releaseId),\n name: populatedRelease?.name,\n actionId: deletedAction.id,\n type: deletedAction.type,\n contentType: deletedAction.contentType,\n entryDocumentId: deletedAction.entryDocumentId,\n locale: deletedAction.locale,\n });\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","action","_","get","createReleaseActionService","strapi","getLocalesDataForActions","allLocales","localization","getLocales","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","plugin","service","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","disableUpdateReleaseStatus","validateEntryData","validateUniqueEntry","getService","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","emitAuditOnCommit","AUDITED_EVENTS","RELEASE_ENTRY_ADD","actionId","findPage","dbQuery","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","$null","updatedAction","RELEASE_ENTRY_UPDATE","Number","from","to","delete","deletedRow","populatedRelease","deletedAction","RELEASE_ENTRY_REMOVE","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var utils = require('@strapi/utils');
4
+ var auditLogs = require('../audit-logs.js');
4
5
  var constants = require('../constants.js');
5
6
  var index = require('../utils/index.js');
6
- var auditLogs = require('../audit-logs.js');
7
7
 
8
8
  const createReleaseService = ({ strapi })=>{
9
9
  const dispatchWebhook = (event, { isPublished, release, error })=>{
@@ -258,6 +258,28 @@ const createReleaseService = ({ strapi })=>{
258
258
  const contentTypeUids = index.getPublishOrderForContentTypes(Object.keys(formattedActions), {
259
259
  strapi
260
260
  });
261
+ const deduplicateReleaseWebhooks = strapi.config.get('server.webhooks.deduplicateReleaseWebhooks', false) === true;
262
+ const runReleaseAction = async (releaseAction, work)=>{
263
+ if (!deduplicateReleaseWebhooks) {
264
+ return work();
265
+ }
266
+ const locale = strapi.localization.isLocalizedContentType(strapi.contentTypes[releaseAction.uid]) ? releaseAction.locale || await strapi.localization.getDefaultLocale() : undefined;
267
+ const context = strapi.requestContext.get();
268
+ return strapi.requestContext.run({
269
+ ...context,
270
+ request: context?.request ?? {
271
+ url: ''
272
+ },
273
+ state: {
274
+ ...context?.state,
275
+ releaseId,
276
+ releaseAction: {
277
+ ...releaseAction,
278
+ locale: locale ?? undefined
279
+ }
280
+ }
281
+ }, work);
282
+ };
261
283
  await strapi.db.transaction(async ()=>{
262
284
  for (const contentTypeUid of contentTypeUids){
263
285
  const contentType = contentTypeUid;
@@ -267,10 +289,22 @@ const createReleaseService = ({ strapi })=>{
267
289
  // leave inconsistent FK rows when one branch deletes a row another branch is
268
290
  // about to reference.
269
291
  for (const params of publish){
270
- await strapi.documents(contentType).publish(params);
292
+ await runReleaseAction({
293
+ uid: contentType,
294
+ ...params,
295
+ event: 'entry.publish'
296
+ }, async ()=>{
297
+ await strapi.documents(contentType).publish(params);
298
+ });
271
299
  }
272
300
  for (const params of unpublish){
273
- await strapi.documents(contentType).unpublish(params);
301
+ await runReleaseAction({
302
+ uid: contentType,
303
+ ...params,
304
+ event: 'entry.unpublish'
305
+ }, async ()=>{
306
+ await strapi.documents(contentType).unpublish(params);
307
+ });
274
308
  }
275
309
  }
276
310
  });
@@ -1 +1 @@
1
- {"version":3,"file":"release.js","sources":["../../../server/src/services/release.ts"],"sourcesContent":["import { setCreatorFields, errors, emitAudit } from '@strapi/utils';\n\nimport type { Core, Struct, UID, Data } from '@strapi/types';\n\nimport {\n ALLOWED_WEBHOOK_EVENTS,\n AUDITED_EVENTS,\n RELEASE_ACTION_MODEL_UID,\n RELEASE_MODEL_UID,\n} from '../constants';\nimport type {\n GetReleases,\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n} from '../../../shared/contracts/releases';\nimport type { ReleaseAction } from '../../../shared/contracts/release-actions';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService, getPublishOrderForContentTypes } from '../utils';\nimport { getReleaseChanges } from '../audit-logs';\n\nconst createReleaseService = ({ strapi }: { strapi: Core.Strapi }) => {\n const dispatchWebhook = (\n event: string,\n { isPublished, release, error }: { isPublished: boolean; release?: any; error?: unknown }\n ) => {\n strapi.eventHub.emit(event, {\n isPublished,\n error,\n release,\n });\n };\n\n /**\n * Given a release id, it returns the actions formatted ready to be used to publish them.\n * We split them by contentType and type (publish/unpublish) and extract only the documentIds and locales.\n */\n const getFormattedActions = async (releaseId: Release['id']) => {\n const actions = (await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n release: {\n id: releaseId,\n },\n },\n })) as ReleaseAction[];\n\n if (actions.length === 0) {\n throw new errors.ValidationError('No entries to publish');\n }\n\n /**\n * We separate publish and unpublish actions, grouping them by contentType and extracting only their documentIds and locales.\n */\n const formattedActions: {\n [key: UID.ContentType]: {\n publish: { documentId: ReleaseAction['entryDocumentId']; locale?: string }[];\n unpublish: { documentId: ReleaseAction['entryDocumentId']; locale?: string }[];\n };\n } = {};\n\n for (const action of actions) {\n const contentTypeUid: UID.ContentType = action.contentType;\n\n if (!formattedActions[contentTypeUid]) {\n formattedActions[contentTypeUid] = {\n publish: [],\n unpublish: [],\n };\n }\n\n formattedActions[contentTypeUid][action.type].push({\n documentId: action.entryDocumentId,\n locale: action.locale,\n });\n }\n\n return formattedActions;\n };\n\n return {\n async create(releaseData: CreateRelease.Request['body'], { user }: { user: UserInfo }) {\n const releaseWithCreatorFields = await setCreatorFields({ user })(releaseData);\n\n const {\n validatePendingReleasesLimit,\n validateUniqueNameForPendingRelease,\n validateScheduledAtIsLaterThanNow,\n } = getService('release-validation', { strapi });\n\n await Promise.all([\n validatePendingReleasesLimit(),\n validateUniqueNameForPendingRelease(releaseWithCreatorFields.name),\n validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt),\n ]);\n\n const release = await strapi.db.query(RELEASE_MODEL_UID).create({\n data: {\n ...releaseWithCreatorFields,\n status: 'empty',\n },\n });\n\n // Audited before scheduling: a scheduling failure shouldn't leave the write\n // unrecorded.\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_CREATE, {\n releaseId: release.id,\n name: release.name,\n ...(release.scheduledAt && {\n scheduledAt: release.scheduledAt,\n timezone: release.timezone,\n }),\n });\n\n if (releaseWithCreatorFields.scheduledAt) {\n const schedulingService = getService('scheduling', { strapi });\n\n await schedulingService.set(release.id, release.scheduledAt);\n }\n\n strapi.telemetry.send('didCreateContentRelease');\n\n return release;\n },\n\n async findOne(id: GetRelease.Request['params']['id'], query = {}) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query);\n const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n ...dbQuery,\n where: { id },\n });\n\n return release;\n },\n\n findPage(query?: GetReleases.Request['query']) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_MODEL_UID).findPage({\n ...dbQuery,\n populate: {\n actions: {\n count: true,\n },\n },\n });\n },\n\n findMany(query?: any) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_MODEL_UID).findMany({\n ...dbQuery,\n });\n },\n\n async update(\n id: Data.ID,\n releaseData: UpdateRelease.Request['body'],\n { user }: { user: UserInfo }\n ) {\n const releaseWithCreatorFields = await setCreatorFields({ user, isEdition: true })(\n releaseData\n );\n\n const { validateUniqueNameForPendingRelease, validateScheduledAtIsLaterThanNow } = getService(\n 'release-validation',\n { strapi }\n );\n\n await Promise.all([\n validateUniqueNameForPendingRelease(releaseWithCreatorFields.name, id),\n validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt),\n ]);\n\n const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({ where: { id } });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${id}`);\n }\n\n if (release.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n const updatedRelease = await strapi.db.query(RELEASE_MODEL_UID).update({\n where: { id },\n data: releaseWithCreatorFields,\n });\n\n // Audited before scheduling, against the pre-image read next to the write.\n // A write that matched no row (deleted in between) has nothing to report.\n if (updatedRelease) {\n const changes = getReleaseChanges(release, updatedRelease);\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_UPDATE, {\n releaseId: updatedRelease.id,\n name: updatedRelease.name,\n changes,\n });\n }\n }\n\n const schedulingService = getService('scheduling', { strapi });\n\n if (releaseData.scheduledAt) {\n // set function always cancel the previous job if it exists, so we can call it directly\n await schedulingService.set(id, releaseData.scheduledAt);\n } else if (release.scheduledAt) {\n // When user don't send a scheduledAt and we have one on the release, means that user want to unschedule it\n schedulingService.cancel(id);\n }\n\n this.updateReleaseStatus(id);\n\n strapi.telemetry.send('didUpdateContentRelease');\n\n return updatedRelease;\n },\n\n async getAllComponents() {\n const contentManagerComponentsService = strapi\n .plugin('content-manager')\n .service('components');\n\n const components = await contentManagerComponentsService.findAllComponents();\n\n const componentsMap = components.reduce(\n (\n acc: { [key: Struct.ComponentSchema['uid']]: Struct.ComponentSchema },\n component: Struct.ComponentSchema\n ) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n return componentsMap;\n },\n\n async delete(releaseId: DeleteRelease.Request['params']['id']) {\n const release: Release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n where: { id: releaseId },\n populate: {\n actions: {\n select: ['id'],\n },\n },\n });\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 // Only delete the release and its actions is you in fact can delete all the actions and the release\n // Otherwise, if the transaction fails it throws an error\n await strapi.db.transaction(async () => {\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: {\n id: {\n $in: release.actions.map((action) => action.id),\n },\n },\n });\n\n await strapi.db.query(RELEASE_MODEL_UID).delete({\n where: {\n id: releaseId,\n },\n });\n });\n\n if (release.scheduledAt) {\n const schedulingService = getService('scheduling', { strapi });\n await schedulingService.cancel(release.id);\n }\n\n strapi.telemetry.send('didDeleteContentRelease');\n\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_DELETE, {\n releaseId: release.id,\n name: release.name,\n });\n\n return release;\n },\n\n async publish(releaseId: PublishRelease.Request['params']['id']) {\n const {\n release,\n error,\n lockedRelease,\n }: {\n release: Pick<Release, 'id' | 'releasedAt' | 'status'> | null;\n error: unknown;\n lockedRelease: Pick<Release, 'id' | 'name'>;\n } = await strapi.db.transaction(async ({ trx }) => {\n /**\n * We lock the release in this transaction, so any other process trying to publish it will wait until this transaction is finished\n * In this transaction we don't care about rollback, becasue we want to persist the lock until the end and if it fails we want to change the release status to failed\n */\n const lockedRelease = (await strapi.db\n ?.queryBuilder(RELEASE_MODEL_UID)\n .where({ id: releaseId })\n .select(['id', 'name', 'releasedAt', 'status'])\n .first()\n .transacting(trx)\n .forUpdate()\n .execute()) as Pick<Release, 'id' | 'name' | 'releasedAt' | 'status'> | undefined;\n\n if (!lockedRelease) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n if (lockedRelease.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n if (lockedRelease.status === 'failed') {\n throw new errors.ValidationError('Release failed to publish');\n }\n\n try {\n strapi.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);\n\n const formattedActions = await getFormattedActions(releaseId);\n\n // Publish content types in dependency order so that when entity A has a relation\n // to entity B, B is published first to keep this relation.\n const contentTypeUids = getPublishOrderForContentTypes(\n Object.keys(formattedActions) as UID.ContentType[],\n { strapi }\n );\n\n await strapi.db.transaction(async () => {\n for (const contentTypeUid of contentTypeUids) {\n const contentType = contentTypeUid as UID.ContentType;\n const { publish, unpublish } = formattedActions[contentType];\n\n // Serialize within a content type: concurrent publishes of related documents\n // can race on shared join-table state (notably self-referential relations) and\n // leave inconsistent FK rows when one branch deletes a row another branch is\n // about to reference.\n for (const params of publish) {\n await strapi.documents(contentType).publish(params);\n }\n\n for (const params of unpublish) {\n await strapi.documents(contentType).unpublish(params);\n }\n }\n });\n\n const release = await strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'done',\n releasedAt: new Date(),\n },\n });\n\n dispatchWebhook(ALLOWED_WEBHOOK_EVENTS.RELEASES_PUBLISH, {\n isPublished: true,\n release,\n });\n\n strapi.telemetry.send('didPublishContentRelease');\n\n return { release, error: null, lockedRelease };\n } catch (error) {\n dispatchWebhook(ALLOWED_WEBHOOK_EVENTS.RELEASES_PUBLISH, {\n isPublished: false,\n error,\n });\n\n // We need to run the update in the same transaction because the release is locked\n await strapi.db\n ?.queryBuilder(RELEASE_MODEL_UID)\n .where({ id: releaseId })\n .update({\n status: 'failed',\n })\n .transacting(trx)\n .execute();\n\n // At this point, we don't want to throw the error because if that happen we rollback the change in the release status\n // We want to throw the error after the transaction is finished, so we return the error\n return {\n release: null,\n // A rejection can carry any value, even null: never mistake it for success\n error: error ?? new Error('Release publish failed with an empty error'),\n lockedRelease,\n };\n }\n });\n\n // The 'failed' status is already committed, so this emit cannot be rolled back.\n // Pre-flight rejections threw before the run and never reach it.\n if (error !== null) {\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_TRIGGER, {\n releaseId: lockedRelease.id,\n name: lockedRelease.name,\n outcome: 'failure',\n // The error's name and nothing else from it: driver errors can carry row\n // contents in their properties\n reason: error instanceof Error ? error.name : 'Error',\n });\n\n // Swallowing a non-Error throwable would report the publish as successful\n if (error instanceof Error) {\n throw error;\n }\n throw new Error('Release publish failed', { cause: error });\n }\n\n // Counted after the publish, while the actions still exist.\n // A count failure doesn't fail the committed publish: the error is returned.\n const releaseActionService = getService('release-action', { strapi });\n let counts = null;\n let countsError: Error | null = null;\n\n try {\n const [published, unpublished] = await Promise.all([\n releaseActionService.countActions({ filters: { release: releaseId, type: 'publish' } }),\n releaseActionService.countActions({\n filters: { release: releaseId, type: 'unpublish' },\n }),\n ]);\n counts = { published, unpublished };\n } catch (err) {\n countsError = err instanceof Error ? err : new Error(String(err), { cause: err });\n strapi.log.error(\n `Failed to count the entries for the release.trigger entry of release ${releaseId}`,\n { error: countsError }\n );\n }\n\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_TRIGGER, {\n releaseId: lockedRelease.id,\n name: lockedRelease.name,\n outcome: 'success',\n published: counts?.published,\n unpublished: counts?.unpublished,\n });\n\n return { release, counts, countsError };\n },\n\n async updateReleaseStatus(releaseId: Release['id']) {\n const releaseActionService = getService('release-action', { strapi });\n\n const [totalActions, invalidActions] = await Promise.all([\n releaseActionService.countActions({\n filters: {\n release: releaseId,\n },\n }),\n releaseActionService.countActions({\n filters: {\n release: releaseId,\n isEntryValid: false,\n },\n }),\n ]);\n\n if (totalActions > 0) {\n if (invalidActions > 0) {\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'blocked',\n },\n });\n }\n\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'ready',\n },\n });\n }\n\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'empty',\n },\n });\n },\n };\n};\n\nexport type ReleaseService = ReturnType<typeof createReleaseService>;\n\nexport default createReleaseService;\n"],"names":["createReleaseService","strapi","dispatchWebhook","event","isPublished","release","error","eventHub","emit","getFormattedActions","releaseId","actions","db","query","RELEASE_ACTION_MODEL_UID","findMany","where","id","length","errors","ValidationError","formattedActions","action","contentTypeUid","contentType","publish","unpublish","type","push","documentId","entryDocumentId","locale","create","releaseData","user","releaseWithCreatorFields","setCreatorFields","validatePendingReleasesLimit","validateUniqueNameForPendingRelease","validateScheduledAtIsLaterThanNow","getService","Promise","all","name","scheduledAt","RELEASE_MODEL_UID","data","status","emitAudit","AUDITED_EVENTS","RELEASE_CREATE","timezone","schedulingService","set","telemetry","send","findOne","dbQuery","get","transform","findPage","populate","count","update","isEdition","NotFoundError","releasedAt","updatedRelease","changes","getReleaseChanges","Object","keys","RELEASE_UPDATE","cancel","updateReleaseStatus","getAllComponents","contentManagerComponentsService","plugin","service","components","findAllComponents","componentsMap","reduce","acc","component","uid","delete","select","transaction","deleteMany","$in","map","RELEASE_DELETE","lockedRelease","trx","queryBuilder","first","transacting","forUpdate","execute","log","info","contentTypeUids","getPublishOrderForContentTypes","params","documents","Date","ALLOWED_WEBHOOK_EVENTS","RELEASES_PUBLISH","Error","RELEASE_TRIGGER","outcome","reason","cause","releaseActionService","counts","countsError","published","unpublished","countActions","filters","err","String","totalActions","invalidActions","isEntryValid"],"mappings":"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"}
1
+ {"version":3,"file":"release.js","sources":["../../../server/src/services/release.ts"],"sourcesContent":["import type { Core, Data, Modules, Struct, UID } from '@strapi/types';\nimport { emitAudit, errors, setCreatorFields } from '@strapi/utils';\nimport type { ParameterizedContext } from 'koa';\nimport type { ReleaseAction } from '../../../shared/contracts/release-actions';\nimport type {\n GetReleases,\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getReleaseChanges } from '../audit-logs';\nimport {\n ALLOWED_WEBHOOK_EVENTS,\n AUDITED_EVENTS,\n RELEASE_ACTION_MODEL_UID,\n RELEASE_MODEL_UID,\n} from '../constants';\nimport { getPublishOrderForContentTypes, getService } from '../utils';\n\nconst createReleaseService = ({ strapi }: { strapi: Core.Strapi }) => {\n const dispatchWebhook = (\n event: string,\n { isPublished, release, error }: { isPublished: boolean; release?: any; error?: unknown }\n ) => {\n strapi.eventHub.emit(event, {\n isPublished,\n error,\n release,\n });\n };\n\n /**\n * Given a release id, it returns the actions formatted ready to be used to publish them.\n * We split them by contentType and type (publish/unpublish) and extract only the documentIds and locales.\n */\n const getFormattedActions = async (releaseId: Release['id']) => {\n const actions = (await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n release: {\n id: releaseId,\n },\n },\n })) as ReleaseAction[];\n\n if (actions.length === 0) {\n throw new errors.ValidationError('No entries to publish');\n }\n\n /**\n * We separate publish and unpublish actions, grouping them by contentType and extracting only their documentIds and locales.\n */\n const formattedActions: {\n [key: UID.ContentType]: {\n publish: { documentId: ReleaseAction['entryDocumentId']; locale?: string }[];\n unpublish: { documentId: ReleaseAction['entryDocumentId']; locale?: string }[];\n };\n } = {};\n\n for (const action of actions) {\n const contentTypeUid: UID.ContentType = action.contentType;\n\n if (!formattedActions[contentTypeUid]) {\n formattedActions[contentTypeUid] = {\n publish: [],\n unpublish: [],\n };\n }\n\n formattedActions[contentTypeUid][action.type].push({\n documentId: action.entryDocumentId,\n locale: action.locale,\n });\n }\n\n return formattedActions;\n };\n\n return {\n async create(releaseData: CreateRelease.Request['body'], { user }: { user: UserInfo }) {\n const releaseWithCreatorFields = await setCreatorFields({ user })(releaseData);\n\n const {\n validatePendingReleasesLimit,\n validateUniqueNameForPendingRelease,\n validateScheduledAtIsLaterThanNow,\n } = getService('release-validation', { strapi });\n\n await Promise.all([\n validatePendingReleasesLimit(),\n validateUniqueNameForPendingRelease(releaseWithCreatorFields.name),\n validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt),\n ]);\n\n const release = await strapi.db.query(RELEASE_MODEL_UID).create({\n data: {\n ...releaseWithCreatorFields,\n status: 'empty',\n },\n });\n\n // Audited before scheduling: a scheduling failure shouldn't leave the write\n // unrecorded.\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_CREATE, {\n releaseId: release.id,\n name: release.name,\n ...(release.scheduledAt && {\n scheduledAt: release.scheduledAt,\n timezone: release.timezone,\n }),\n });\n\n if (releaseWithCreatorFields.scheduledAt) {\n const schedulingService = getService('scheduling', { strapi });\n\n await schedulingService.set(release.id, release.scheduledAt);\n }\n\n strapi.telemetry.send('didCreateContentRelease');\n\n return release;\n },\n\n async findOne(id: GetRelease.Request['params']['id'], query = {}) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query);\n const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n ...dbQuery,\n where: { id },\n });\n\n return release;\n },\n\n findPage(query?: GetReleases.Request['query']) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_MODEL_UID).findPage({\n ...dbQuery,\n populate: {\n actions: {\n count: true,\n },\n },\n });\n },\n\n findMany(query?: any) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_MODEL_UID).findMany({\n ...dbQuery,\n });\n },\n\n async update(\n id: Data.ID,\n releaseData: UpdateRelease.Request['body'],\n { user }: { user: UserInfo }\n ) {\n const releaseWithCreatorFields = await setCreatorFields({ user, isEdition: true })(\n releaseData\n );\n\n const { validateUniqueNameForPendingRelease, validateScheduledAtIsLaterThanNow } = getService(\n 'release-validation',\n { strapi }\n );\n\n await Promise.all([\n validateUniqueNameForPendingRelease(releaseWithCreatorFields.name, id),\n validateScheduledAtIsLaterThanNow(releaseWithCreatorFields.scheduledAt),\n ]);\n\n const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({ where: { id } });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${id}`);\n }\n\n if (release.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n const updatedRelease = await strapi.db.query(RELEASE_MODEL_UID).update({\n where: { id },\n data: releaseWithCreatorFields,\n });\n\n // Audited before scheduling, against the pre-image read next to the write.\n // A write that matched no row (deleted in between) has nothing to report.\n if (updatedRelease) {\n const changes = getReleaseChanges(release, updatedRelease);\n\n if (Object.keys(changes).length > 0) {\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_UPDATE, {\n releaseId: updatedRelease.id,\n name: updatedRelease.name,\n changes,\n });\n }\n }\n\n const schedulingService = getService('scheduling', { strapi });\n\n if (releaseData.scheduledAt) {\n // set function always cancel the previous job if it exists, so we can call it directly\n await schedulingService.set(id, releaseData.scheduledAt);\n } else if (release.scheduledAt) {\n // When user don't send a scheduledAt and we have one on the release, means that user want to unschedule it\n schedulingService.cancel(id);\n }\n\n this.updateReleaseStatus(id);\n\n strapi.telemetry.send('didUpdateContentRelease');\n\n return updatedRelease;\n },\n\n async getAllComponents() {\n const contentManagerComponentsService = strapi\n .plugin('content-manager')\n .service('components');\n\n const components = await contentManagerComponentsService.findAllComponents();\n\n const componentsMap = components.reduce(\n (\n acc: { [key: Struct.ComponentSchema['uid']]: Struct.ComponentSchema },\n component: Struct.ComponentSchema\n ) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n return componentsMap;\n },\n\n async delete(releaseId: DeleteRelease.Request['params']['id']) {\n const release: Release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n where: { id: releaseId },\n populate: {\n actions: {\n select: ['id'],\n },\n },\n });\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 // Only delete the release and its actions is you in fact can delete all the actions and the release\n // Otherwise, if the transaction fails it throws an error\n await strapi.db.transaction(async () => {\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: {\n id: {\n $in: release.actions.map((action) => action.id),\n },\n },\n });\n\n await strapi.db.query(RELEASE_MODEL_UID).delete({\n where: {\n id: releaseId,\n },\n });\n });\n\n if (release.scheduledAt) {\n const schedulingService = getService('scheduling', { strapi });\n await schedulingService.cancel(release.id);\n }\n\n strapi.telemetry.send('didDeleteContentRelease');\n\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_DELETE, {\n releaseId: release.id,\n name: release.name,\n });\n\n return release;\n },\n\n async publish(releaseId: PublishRelease.Request['params']['id']) {\n const {\n release,\n error,\n lockedRelease,\n }: {\n release: Pick<Release, 'id' | 'releasedAt' | 'status'> | null;\n error: unknown;\n lockedRelease: Pick<Release, 'id' | 'name'>;\n } = await strapi.db.transaction(async ({ trx }) => {\n /**\n * We lock the release in this transaction, so any other process trying to publish it will wait until this transaction is finished\n * In this transaction we don't care about rollback, becasue we want to persist the lock until the end and if it fails we want to change the release status to failed\n */\n const lockedRelease = (await strapi.db\n ?.queryBuilder(RELEASE_MODEL_UID)\n .where({ id: releaseId })\n .select(['id', 'name', 'releasedAt', 'status'])\n .first()\n .transacting(trx)\n .forUpdate()\n .execute()) as Pick<Release, 'id' | 'name' | 'releasedAt' | 'status'> | undefined;\n\n if (!lockedRelease) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n if (lockedRelease.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n if (lockedRelease.status === 'failed') {\n throw new errors.ValidationError('Release failed to publish');\n }\n\n try {\n strapi.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);\n\n const formattedActions = await getFormattedActions(releaseId);\n\n // Publish content types in dependency order so that when entity A has a relation\n // to entity B, B is published first to keep this relation.\n const contentTypeUids = getPublishOrderForContentTypes(\n Object.keys(formattedActions) as UID.ContentType[],\n { strapi }\n );\n\n const deduplicateReleaseWebhooks =\n strapi.config.get<boolean>('server.webhooks.deduplicateReleaseWebhooks', false) ===\n true;\n const runReleaseAction = async (\n releaseAction: Modules.WebhookRunner.ReleaseAction,\n work: () => Promise<void>\n ) => {\n if (!deduplicateReleaseWebhooks) {\n return work();\n }\n\n const locale = strapi.localization.isLocalizedContentType(\n strapi.contentTypes[releaseAction.uid]\n )\n ? releaseAction.locale || (await strapi.localization.getDefaultLocale())\n : undefined;\n const context = strapi.requestContext.get();\n\n return strapi.requestContext.run(\n {\n ...context,\n request: context?.request ?? { url: '' },\n state: {\n ...context?.state,\n releaseId,\n releaseAction: { ...releaseAction, locale: locale ?? undefined },\n },\n } as ParameterizedContext,\n work\n );\n };\n\n await strapi.db.transaction(async () => {\n for (const contentTypeUid of contentTypeUids) {\n const contentType = contentTypeUid as UID.ContentType;\n const { publish, unpublish } = formattedActions[contentType];\n\n // Serialize within a content type: concurrent publishes of related documents\n // can race on shared join-table state (notably self-referential relations) and\n // leave inconsistent FK rows when one branch deletes a row another branch is\n // about to reference.\n for (const params of publish) {\n await runReleaseAction(\n { uid: contentType, ...params, event: 'entry.publish' },\n async () => {\n await strapi.documents(contentType).publish(params);\n }\n );\n }\n\n for (const params of unpublish) {\n await runReleaseAction(\n { uid: contentType, ...params, event: 'entry.unpublish' },\n async () => {\n await strapi.documents(contentType).unpublish(params);\n }\n );\n }\n }\n });\n\n const release = await strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'done',\n releasedAt: new Date(),\n },\n });\n\n dispatchWebhook(ALLOWED_WEBHOOK_EVENTS.RELEASES_PUBLISH, {\n isPublished: true,\n release,\n });\n\n strapi.telemetry.send('didPublishContentRelease');\n\n return { release, error: null, lockedRelease };\n } catch (error) {\n dispatchWebhook(ALLOWED_WEBHOOK_EVENTS.RELEASES_PUBLISH, {\n isPublished: false,\n error,\n });\n\n // We need to run the update in the same transaction because the release is locked\n await strapi.db\n ?.queryBuilder(RELEASE_MODEL_UID)\n .where({ id: releaseId })\n .update({\n status: 'failed',\n })\n .transacting(trx)\n .execute();\n\n // At this point, we don't want to throw the error because if that happen we rollback the change in the release status\n // We want to throw the error after the transaction is finished, so we return the error\n return {\n release: null,\n // A rejection can carry any value, even null: never mistake it for success\n error: error ?? new Error('Release publish failed with an empty error'),\n lockedRelease,\n };\n }\n });\n\n // The 'failed' status is already committed, so this emit cannot be rolled back.\n // Pre-flight rejections threw before the run and never reach it.\n if (error !== null) {\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_TRIGGER, {\n releaseId: lockedRelease.id,\n name: lockedRelease.name,\n outcome: 'failure',\n // The error's name and nothing else from it: driver errors can carry row\n // contents in their properties\n reason: error instanceof Error ? error.name : 'Error',\n });\n\n // Swallowing a non-Error throwable would report the publish as successful\n if (error instanceof Error) {\n throw error;\n }\n throw new Error('Release publish failed', { cause: error });\n }\n\n // Counted after the publish, while the actions still exist.\n // A count failure doesn't fail the committed publish: the error is returned.\n const releaseActionService = getService('release-action', { strapi });\n let counts = null;\n let countsError: Error | null = null;\n\n try {\n const [published, unpublished] = await Promise.all([\n releaseActionService.countActions({ filters: { release: releaseId, type: 'publish' } }),\n releaseActionService.countActions({\n filters: { release: releaseId, type: 'unpublish' },\n }),\n ]);\n counts = { published, unpublished };\n } catch (err) {\n countsError = err instanceof Error ? err : new Error(String(err), { cause: err });\n strapi.log.error(\n `Failed to count the entries for the release.trigger entry of release ${releaseId}`,\n { error: countsError }\n );\n }\n\n await emitAudit({ strapi }, AUDITED_EVENTS.RELEASE_TRIGGER, {\n releaseId: lockedRelease.id,\n name: lockedRelease.name,\n outcome: 'success',\n published: counts?.published,\n unpublished: counts?.unpublished,\n });\n\n return { release, counts, countsError };\n },\n\n async updateReleaseStatus(releaseId: Release['id']) {\n const releaseActionService = getService('release-action', { strapi });\n\n const [totalActions, invalidActions] = await Promise.all([\n releaseActionService.countActions({\n filters: {\n release: releaseId,\n },\n }),\n releaseActionService.countActions({\n filters: {\n release: releaseId,\n isEntryValid: false,\n },\n }),\n ]);\n\n if (totalActions > 0) {\n if (invalidActions > 0) {\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'blocked',\n },\n });\n }\n\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'ready',\n },\n });\n }\n\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: releaseId,\n },\n data: {\n status: 'empty',\n },\n });\n },\n };\n};\n\nexport type ReleaseService = ReturnType<typeof createReleaseService>;\n\nexport default createReleaseService;\n"],"names":["createReleaseService","strapi","dispatchWebhook","event","isPublished","release","error","eventHub","emit","getFormattedActions","releaseId","actions","db","query","RELEASE_ACTION_MODEL_UID","findMany","where","id","length","errors","ValidationError","formattedActions","action","contentTypeUid","contentType","publish","unpublish","type","push","documentId","entryDocumentId","locale","create","releaseData","user","releaseWithCreatorFields","setCreatorFields","validatePendingReleasesLimit","validateUniqueNameForPendingRelease","validateScheduledAtIsLaterThanNow","getService","Promise","all","name","scheduledAt","RELEASE_MODEL_UID","data","status","emitAudit","AUDITED_EVENTS","RELEASE_CREATE","timezone","schedulingService","set","telemetry","send","findOne","dbQuery","get","transform","findPage","populate","count","update","isEdition","NotFoundError","releasedAt","updatedRelease","changes","getReleaseChanges","Object","keys","RELEASE_UPDATE","cancel","updateReleaseStatus","getAllComponents","contentManagerComponentsService","plugin","service","components","findAllComponents","componentsMap","reduce","acc","component","uid","delete","select","transaction","deleteMany","$in","map","RELEASE_DELETE","lockedRelease","trx","queryBuilder","first","transacting","forUpdate","execute","log","info","contentTypeUids","getPublishOrderForContentTypes","deduplicateReleaseWebhooks","config","runReleaseAction","releaseAction","work","localization","isLocalizedContentType","contentTypes","getDefaultLocale","undefined","context","requestContext","run","request","url","state","params","documents","Date","ALLOWED_WEBHOOK_EVENTS","RELEASES_PUBLISH","Error","RELEASE_TRIGGER","outcome","reason","cause","releaseActionService","counts","countsError","published","unpublished","countActions","filters","err","String","totalActions","invalidActions","isEntryValid"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { errors, emitAudit, setCreatorFields } from '@strapi/utils';
2
+ import { getReleaseChanges } from '../audit-logs.mjs';
2
3
  import { RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS, AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID } from '../constants.mjs';
3
4
  import { getService, getPublishOrderForContentTypes } from '../utils/index.mjs';
4
- import { getReleaseChanges } from '../audit-logs.mjs';
5
5
 
6
6
  const createReleaseService = ({ strapi })=>{
7
7
  const dispatchWebhook = (event, { isPublished, release, error })=>{
@@ -256,6 +256,28 @@ const createReleaseService = ({ strapi })=>{
256
256
  const contentTypeUids = getPublishOrderForContentTypes(Object.keys(formattedActions), {
257
257
  strapi
258
258
  });
259
+ const deduplicateReleaseWebhooks = strapi.config.get('server.webhooks.deduplicateReleaseWebhooks', false) === true;
260
+ const runReleaseAction = async (releaseAction, work)=>{
261
+ if (!deduplicateReleaseWebhooks) {
262
+ return work();
263
+ }
264
+ const locale = strapi.localization.isLocalizedContentType(strapi.contentTypes[releaseAction.uid]) ? releaseAction.locale || await strapi.localization.getDefaultLocale() : undefined;
265
+ const context = strapi.requestContext.get();
266
+ return strapi.requestContext.run({
267
+ ...context,
268
+ request: context?.request ?? {
269
+ url: ''
270
+ },
271
+ state: {
272
+ ...context?.state,
273
+ releaseId,
274
+ releaseAction: {
275
+ ...releaseAction,
276
+ locale: locale ?? undefined
277
+ }
278
+ }
279
+ }, work);
280
+ };
259
281
  await strapi.db.transaction(async ()=>{
260
282
  for (const contentTypeUid of contentTypeUids){
261
283
  const contentType = contentTypeUid;
@@ -265,10 +287,22 @@ const createReleaseService = ({ strapi })=>{
265
287
  // leave inconsistent FK rows when one branch deletes a row another branch is
266
288
  // about to reference.
267
289
  for (const params of publish){
268
- await strapi.documents(contentType).publish(params);
290
+ await runReleaseAction({
291
+ uid: contentType,
292
+ ...params,
293
+ event: 'entry.publish'
294
+ }, async ()=>{
295
+ await strapi.documents(contentType).publish(params);
296
+ });
269
297
  }
270
298
  for (const params of unpublish){
271
- await strapi.documents(contentType).unpublish(params);
299
+ await runReleaseAction({
300
+ uid: contentType,
301
+ ...params,
302
+ event: 'entry.unpublish'
303
+ }, async ()=>{
304
+ await strapi.documents(contentType).unpublish(params);
305
+ });
272
306
  }
273
307
  }
274
308
  });