@strapi/content-releases 5.52.3 → 5.53.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.
Files changed (52) hide show
  1. package/dist/server/audit-logs.js +182 -0
  2. package/dist/server/audit-logs.js.map +1 -0
  3. package/dist/server/audit-logs.mjs +175 -0
  4. package/dist/server/audit-logs.mjs.map +1 -0
  5. package/dist/server/bootstrap.js +6 -0
  6. package/dist/server/bootstrap.js.map +1 -1
  7. package/dist/server/bootstrap.mjs +6 -0
  8. package/dist/server/bootstrap.mjs.map +1 -1
  9. package/dist/server/constants.js +20 -0
  10. package/dist/server/constants.js.map +1 -1
  11. package/dist/server/constants.mjs +20 -1
  12. package/dist/server/constants.mjs.map +1 -1
  13. package/dist/server/controllers/release.js +9 -21
  14. package/dist/server/controllers/release.js.map +1 -1
  15. package/dist/server/controllers/release.mjs +9 -21
  16. package/dist/server/controllers/release.mjs.map +1 -1
  17. package/dist/server/controllers/settings.js +0 -1
  18. package/dist/server/controllers/settings.js.map +1 -1
  19. package/dist/server/controllers/settings.mjs +0 -1
  20. package/dist/server/controllers/settings.mjs.map +1 -1
  21. package/dist/server/services/release-action.js +59 -3
  22. package/dist/server/services/release-action.js.map +1 -1
  23. package/dist/server/services/release-action.mjs +60 -4
  24. package/dist/server/services/release-action.mjs.map +1 -1
  25. package/dist/server/services/release.js +110 -10
  26. package/dist/server/services/release.js.map +1 -1
  27. package/dist/server/services/release.mjs +111 -11
  28. package/dist/server/services/release.mjs.map +1 -1
  29. package/dist/server/services/scheduling.js +7 -2
  30. package/dist/server/services/scheduling.js.map +1 -1
  31. package/dist/server/services/scheduling.mjs +7 -2
  32. package/dist/server/services/scheduling.mjs.map +1 -1
  33. package/dist/server/services/settings.js +29 -1
  34. package/dist/server/services/settings.js.map +1 -1
  35. package/dist/server/services/settings.mjs +29 -1
  36. package/dist/server/services/settings.mjs.map +1 -1
  37. package/dist/server/src/audit-logs.d.ts +99 -0
  38. package/dist/server/src/audit-logs.d.ts.map +1 -0
  39. package/dist/server/src/bootstrap.d.ts.map +1 -1
  40. package/dist/server/src/constants.d.ts +20 -0
  41. package/dist/server/src/constants.d.ts.map +1 -1
  42. package/dist/server/src/controllers/release.d.ts.map +1 -1
  43. package/dist/server/src/index.d.ts +8 -1
  44. package/dist/server/src/index.d.ts.map +1 -1
  45. package/dist/server/src/services/index.d.ts +8 -1
  46. package/dist/server/src/services/index.d.ts.map +1 -1
  47. package/dist/server/src/services/release-action.d.ts.map +1 -1
  48. package/dist/server/src/services/release.d.ts +8 -1
  49. package/dist/server/src/services/release.d.ts.map +1 -1
  50. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  51. package/dist/server/src/services/settings.d.ts.map +1 -1
  52. package/package.json +7 -7
@@ -269,30 +269,18 @@ const releaseController = {
269
269
  const releaseService = index.getService('release', {
270
270
  strapi
271
271
  });
272
- const releaseActionService = index.getService('release-action', {
273
- strapi
274
- });
275
- const release = await releaseService.publish(id);
276
- const [countPublishActions, countUnpublishActions] = await Promise.all([
277
- releaseActionService.countActions({
278
- filters: {
279
- release: id,
280
- type: 'publish'
281
- }
282
- }),
283
- releaseActionService.countActions({
284
- filters: {
285
- release: id,
286
- type: 'unpublish'
287
- }
288
- })
289
- ]);
272
+ // The service audits the run itself, whoever the caller is
273
+ const { release, counts, countsError } = await releaseService.publish(id);
274
+ // The publish is committed and audited; the response still needs the counts
275
+ if (!counts) {
276
+ throw countsError ?? new Error('Failed to count the release entries');
277
+ }
290
278
  ctx.body = {
291
279
  data: release,
292
280
  meta: {
293
- totalEntries: countPublishActions + countUnpublishActions,
294
- totalPublishedEntries: countPublishActions,
295
- totalUnpublishedEntries: countUnpublishActions
281
+ totalEntries: counts.published + counts.unpublished,
282
+ totalPublishedEntries: counts.published,
283
+ totalUnpublishedEntries: counts.unpublished
296
284
  }
297
285
  };
298
286
  }
@@ -1 +1 @@
1
- {"version":3,"file":"release.js","sources":["../../../server/src/controllers/release.ts"],"sourcesContent":["import type Koa from 'koa';\nimport { errors } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { RELEASE_MODEL_UID } from '../constants';\nimport { validateRelease, validatefindByDocumentAttachedParams } from './validation/release';\nimport type {\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n GetReleases,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService } from '../utils';\n\ntype ReleaseWithPopulatedActions = Release & { actions: { count: number } };\n\nconst releaseController = {\n /**\n * Find releases based on documents attached or not to the release.\n * If `hasEntryAttached` is true, it will return all releases that have the entry attached.\n * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.\n */\n async findByDocumentAttached(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n await permissionsManager.validateQuery(ctx.query);\n const releaseService = getService('release', { strapi });\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n await validatefindByDocumentAttachedParams(query);\n\n // If entry is a singleType, we need to manually add the entryDocumentId to the query\n const model = strapi.getModel(query.contentType) as Schema.ContentType;\n if (model.kind && 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 ${query.contentType}`);\n }\n\n query.entryDocumentId = document.documentId;\n }\n\n const { contentType, hasEntryAttached, entryDocumentId, locale } = query;\n const isEntryAttached =\n typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;\n\n if (isEntryAttached) {\n const releases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n populate: {\n actions: {\n fields: ['type'],\n filters: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n },\n });\n\n ctx.body = { data: releases };\n } else {\n const relatedReleases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n });\n\n const releases = await releaseService.findMany({\n where: {\n $or: [\n {\n id: {\n $notIn: relatedReleases.map((release: any) => release.id),\n },\n },\n {\n actions: null,\n },\n ],\n releasedAt: null,\n },\n });\n ctx.body = { data: releases };\n }\n },\n\n async findPage(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n\n const releaseService = getService('release', { strapi });\n\n const query: GetReleases.Request['query'] = await permissionsManager.sanitizeQuery(ctx.query);\n const { results, pagination } = await releaseService.findPage(query);\n\n const data = results.map((release: ReleaseWithPopulatedActions) => {\n const { actions, ...releaseData } = release;\n\n return {\n ...releaseData,\n actions: {\n meta: {\n count: actions.count,\n },\n },\n };\n });\n\n const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({\n where: {\n releasedAt: null,\n },\n });\n\n ctx.body = { data, meta: { pagination, pendingReleasesCount } };\n },\n\n async findOne(ctx: Koa.Context) {\n const id: GetRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.findOne(id, { populate: ['createdBy'] });\n if (!release) {\n throw new errors.NotFoundError(`Release not found for id: ${id}`);\n }\n\n const count = await releaseActionService.countActions({\n filters: {\n release: id,\n },\n });\n const sanitizedRelease = {\n ...release,\n createdBy: release.createdBy\n ? strapi.service('admin::user').sanitizeUser(release.createdBy)\n : null,\n };\n\n // Format the data object\n const data = {\n ...sanitizedRelease,\n actions: {\n meta: {\n count,\n },\n },\n };\n\n ctx.body = { data };\n },\n\n async mapEntriesToReleases(ctx: Koa.Context) {\n const { contentTypeUid, documentIds, locale } = ctx.query;\n\n if (!contentTypeUid || !documentIds) {\n throw new errors.ValidationError('Missing required query parameters');\n }\n\n const releaseService = getService('release', { strapi });\n\n const releasesWithActions = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType: contentTypeUid,\n entryDocumentId: {\n $in: documentIds,\n },\n locale,\n },\n },\n populate: {\n actions: true,\n },\n });\n\n const mappedEntriesInReleases = releasesWithActions.reduce(\n (acc: MapEntriesToReleases.Response['data'], release: Release) => {\n release.actions.forEach((action) => {\n if (action.contentType !== contentTypeUid) {\n return;\n }\n\n if (locale && action.locale !== locale) {\n return;\n }\n\n if (!acc[action.entryDocumentId]) {\n acc[action.entryDocumentId] = [{ id: release.id, name: release.name }];\n } else {\n acc[action.entryDocumentId].push({ id: release.id, name: release.name });\n }\n });\n\n return acc;\n },\n {} as MapEntriesToReleases.Response['data']\n );\n\n ctx.body = {\n data: mappedEntriesInReleases,\n };\n },\n\n async create(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as CreateRelease.Request['body'];\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.create(releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(release),\n });\n },\n\n async update(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as UpdateRelease.Request['body'];\n const id: UpdateRelease.Request['params']['id'] = ctx.params.id;\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.update(id, releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(release),\n };\n },\n\n async delete(ctx: Koa.Context) {\n const id: DeleteRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.delete(id);\n\n ctx.body = {\n data: release,\n };\n },\n\n async publish(ctx: Koa.Context) {\n const id: PublishRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.publish(id);\n\n const [countPublishActions, countUnpublishActions] = await Promise.all([\n releaseActionService.countActions({\n filters: {\n release: id,\n type: 'publish',\n },\n }),\n releaseActionService.countActions({\n filters: {\n release: id,\n type: 'unpublish',\n },\n }),\n ]);\n\n ctx.body = {\n data: release,\n meta: {\n totalEntries: countPublishActions + countUnpublishActions,\n totalPublishedEntries: countPublishActions,\n totalUnpublishedEntries: countUnpublishActions,\n },\n };\n },\n};\n\nexport default releaseController;\n"],"names":["releaseController","findByDocumentAttached","ctx","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_MODEL_UID","validateQuery","query","releaseService","getService","sanitizeQuery","validatefindByDocumentAttachedParams","getModel","contentType","kind","document","db","uid","findOne","select","errors","NotFoundError","entryDocumentId","documentId","hasEntryAttached","locale","isEntryAttached","Boolean","JSON","parse","releases","findMany","where","releasedAt","actions","populate","fields","filters","body","data","relatedReleases","$or","id","$notIn","map","release","findPage","results","pagination","releaseData","meta","count","pendingReleasesCount","params","releaseActionService","countActions","sanitizedRelease","createdBy","sanitizeUser","mapEntriesToReleases","contentTypeUid","documentIds","ValidationError","releasesWithActions","$in","mappedEntriesInReleases","reduce","acc","forEach","action","name","push","create","user","releaseArgs","request","validateRelease","created","sanitizeOutput","update","delete","publish","countPublishActions","countUnpublishActions","Promise","all","type","totalEntries","totalPublishedEntries","totalUnpublishedEntries"],"mappings":"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"}
1
+ {"version":3,"file":"release.js","sources":["../../../server/src/controllers/release.ts"],"sourcesContent":["import type Koa from 'koa';\nimport { errors } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { RELEASE_MODEL_UID } from '../constants';\nimport { validateRelease, validatefindByDocumentAttachedParams } from './validation/release';\nimport type {\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n GetReleases,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService } from '../utils';\n\ntype ReleaseWithPopulatedActions = Release & { actions: { count: number } };\n\nconst releaseController = {\n /**\n * Find releases based on documents attached or not to the release.\n * If `hasEntryAttached` is true, it will return all releases that have the entry attached.\n * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.\n */\n async findByDocumentAttached(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n await permissionsManager.validateQuery(ctx.query);\n const releaseService = getService('release', { strapi });\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n await validatefindByDocumentAttachedParams(query);\n\n // If entry is a singleType, we need to manually add the entryDocumentId to the query\n const model = strapi.getModel(query.contentType) as Schema.ContentType;\n if (model.kind && 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 ${query.contentType}`);\n }\n\n query.entryDocumentId = document.documentId;\n }\n\n const { contentType, hasEntryAttached, entryDocumentId, locale } = query;\n const isEntryAttached =\n typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;\n\n if (isEntryAttached) {\n const releases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n populate: {\n actions: {\n fields: ['type'],\n filters: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n },\n });\n\n ctx.body = { data: releases };\n } else {\n const relatedReleases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n });\n\n const releases = await releaseService.findMany({\n where: {\n $or: [\n {\n id: {\n $notIn: relatedReleases.map((release: any) => release.id),\n },\n },\n {\n actions: null,\n },\n ],\n releasedAt: null,\n },\n });\n ctx.body = { data: releases };\n }\n },\n\n async findPage(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n\n const releaseService = getService('release', { strapi });\n\n const query: GetReleases.Request['query'] = await permissionsManager.sanitizeQuery(ctx.query);\n const { results, pagination } = await releaseService.findPage(query);\n\n const data = results.map((release: ReleaseWithPopulatedActions) => {\n const { actions, ...releaseData } = release;\n\n return {\n ...releaseData,\n actions: {\n meta: {\n count: actions.count,\n },\n },\n };\n });\n\n const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({\n where: {\n releasedAt: null,\n },\n });\n\n ctx.body = { data, meta: { pagination, pendingReleasesCount } };\n },\n\n async findOne(ctx: Koa.Context) {\n const id: GetRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.findOne(id, { populate: ['createdBy'] });\n if (!release) {\n throw new errors.NotFoundError(`Release not found for id: ${id}`);\n }\n\n const count = await releaseActionService.countActions({\n filters: {\n release: id,\n },\n });\n const sanitizedRelease = {\n ...release,\n createdBy: release.createdBy\n ? strapi.service('admin::user').sanitizeUser(release.createdBy)\n : null,\n };\n\n // Format the data object\n const data = {\n ...sanitizedRelease,\n actions: {\n meta: {\n count,\n },\n },\n };\n\n ctx.body = { data };\n },\n\n async mapEntriesToReleases(ctx: Koa.Context) {\n const { contentTypeUid, documentIds, locale } = ctx.query;\n\n if (!contentTypeUid || !documentIds) {\n throw new errors.ValidationError('Missing required query parameters');\n }\n\n const releaseService = getService('release', { strapi });\n\n const releasesWithActions = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType: contentTypeUid,\n entryDocumentId: {\n $in: documentIds,\n },\n locale,\n },\n },\n populate: {\n actions: true,\n },\n });\n\n const mappedEntriesInReleases = releasesWithActions.reduce(\n (acc: MapEntriesToReleases.Response['data'], release: Release) => {\n release.actions.forEach((action) => {\n if (action.contentType !== contentTypeUid) {\n return;\n }\n\n if (locale && action.locale !== locale) {\n return;\n }\n\n if (!acc[action.entryDocumentId]) {\n acc[action.entryDocumentId] = [{ id: release.id, name: release.name }];\n } else {\n acc[action.entryDocumentId].push({ id: release.id, name: release.name });\n }\n });\n\n return acc;\n },\n {} as MapEntriesToReleases.Response['data']\n );\n\n ctx.body = {\n data: mappedEntriesInReleases,\n };\n },\n\n async create(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as CreateRelease.Request['body'];\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.create(releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(release),\n });\n },\n\n async update(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as UpdateRelease.Request['body'];\n const id: UpdateRelease.Request['params']['id'] = ctx.params.id;\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n\n const release = await releaseService.update(id, releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(release),\n };\n },\n\n async delete(ctx: Koa.Context) {\n const id: DeleteRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.delete(id);\n\n ctx.body = {\n data: release,\n };\n },\n\n async publish(ctx: Koa.Context) {\n const id: PublishRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n\n // The service audits the run itself, whoever the caller is\n const { release, counts, countsError } = await releaseService.publish(id);\n\n // The publish is committed and audited; the response still needs the counts\n if (!counts) {\n throw countsError ?? new Error('Failed to count the release entries');\n }\n\n ctx.body = {\n data: release,\n meta: {\n totalEntries: counts.published + counts.unpublished,\n totalPublishedEntries: counts.published,\n totalUnpublishedEntries: counts.unpublished,\n },\n };\n },\n};\n\nexport default releaseController;\n"],"names":["releaseController","findByDocumentAttached","ctx","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_MODEL_UID","validateQuery","query","releaseService","getService","sanitizeQuery","validatefindByDocumentAttachedParams","getModel","contentType","kind","document","db","uid","findOne","select","errors","NotFoundError","entryDocumentId","documentId","hasEntryAttached","locale","isEntryAttached","Boolean","JSON","parse","releases","findMany","where","releasedAt","actions","populate","fields","filters","body","data","relatedReleases","$or","id","$notIn","map","release","findPage","results","pagination","releaseData","meta","count","pendingReleasesCount","params","releaseActionService","countActions","sanitizedRelease","createdBy","sanitizeUser","mapEntriesToReleases","contentTypeUid","documentIds","ValidationError","releasesWithActions","$in","mappedEntriesInReleases","reduce","acc","forEach","action","name","push","create","user","releaseArgs","request","validateRelease","created","sanitizeOutput","update","delete","publish","counts","countsError","Error","totalEntries","published","unpublished","totalPublishedEntries","totalUnpublishedEntries"],"mappings":";;;;;;;AAoBA,MAAMA,iBAAAA,GAAoB;AACxB;;;;MAKA,MAAMC,wBAAuBC,GAAgB,EAAA;AAC3C,QAAA,MAAMC,qBAAqBC,MAAAA,CAAOC,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAAAA,EAASL,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAAA,EAAOC;AACT,SAAA,CAAA;AACA,QAAA,MAAMR,kBAAAA,CAAmBS,aAAa,CAACV,GAAAA,CAAIW,KAAK,CAAA;QAChD,MAAMC,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAMS,QAAQ,MAAMV,kBAAAA,CAAmBa,aAAa,CAACd,IAAIW,KAAK,CAAA;AAE9D,QAAA,MAAMI,4CAAAA,CAAqCJ,KAAAA,CAAAA;;AAG3C,QAAA,MAAMH,KAAAA,GAAQN,MAAAA,CAAOc,QAAQ,CAACL,MAAMM,WAAW,CAAA;AAC/C,QAAA,IAAIT,MAAMU,IAAI,IAAIV,KAAAA,CAAMU,IAAI,KAAK,YAAA,EAAc;YAC7C,MAAMC,QAAAA,GAAW,MAAMjB,MAAAA,CAAOkB,EAAE,CAACT,KAAK,CAACH,KAAAA,CAAMa,GAAG,CAAA,CAAEC,OAAO,CAAC;gBAAEC,MAAAA,EAAQ;AAAC,oBAAA;AAAa;AAAC,aAAA,CAAA;AAEnF,YAAA,IAAI,CAACJ,QAAAA,EAAU;gBACb,MAAM,IAAIK,aAAOC,aAAa,CAAC,CAAC,+BAA+B,EAAEd,KAAAA,CAAMM,WAAW,CAAA,CAAE,CAAA;AACtF,YAAA;YAEAN,KAAAA,CAAMe,eAAe,GAAGP,QAAAA,CAASQ,UAAU;AAC7C,QAAA;QAEA,MAAM,EAAEV,WAAW,EAAEW,gBAAgB,EAAEF,eAAe,EAAEG,MAAM,EAAE,GAAGlB,KAAAA;QACnE,MAAMmB,eAAAA,GACJ,OAAOF,gBAAAA,KAAqB,QAAA,GAAWG,QAAQC,IAAAA,CAAKC,KAAK,CAACL,gBAAAA,CAAAA,CAAAA,GAAqB,KAAA;AAEjF,QAAA,IAAIE,eAAAA,EAAiB;AACnB,YAAA,MAAMI,QAAAA,GAAW,MAAMtB,cAAAA,CAAeuB,QAAQ,CAAC;gBAC7CC,KAAAA,EAAO;oBACLC,UAAAA,EAAY,IAAA;oBACZC,OAAAA,EAAS;AACPrB,wBAAAA,WAAAA;AACAS,wBAAAA,eAAAA,EAAiBA,eAAAA,IAAmB,IAAA;AACpCG,wBAAAA,MAAAA,EAAQA,MAAAA,IAAU;AACpB;AACF,iBAAA;gBACAU,QAAAA,EAAU;oBACRD,OAAAA,EAAS;wBACPE,MAAAA,EAAQ;AAAC,4BAAA;AAAO,yBAAA;wBAChBC,OAAAA,EAAS;AACPxB,4BAAAA,WAAAA;AACAS,4BAAAA,eAAAA,EAAiBA,eAAAA,IAAmB,IAAA;AACpCG,4BAAAA,MAAAA,EAAQA,MAAAA,IAAU;AACpB;AACF;AACF;AACF,aAAA,CAAA;AAEA7B,YAAAA,GAAAA,CAAI0C,IAAI,GAAG;gBAAEC,IAAAA,EAAMT;AAAS,aAAA;QAC9B,CAAA,MAAO;AACL,YAAA,MAAMU,eAAAA,GAAkB,MAAMhC,cAAAA,CAAeuB,QAAQ,CAAC;gBACpDC,KAAAA,EAAO;oBACLC,UAAAA,EAAY,IAAA;oBACZC,OAAAA,EAAS;AACPrB,wBAAAA,WAAAA;AACAS,wBAAAA,eAAAA,EAAiBA,eAAAA,IAAmB,IAAA;AACpCG,wBAAAA,MAAAA,EAAQA,MAAAA,IAAU;AACpB;AACF;AACF,aAAA,CAAA;AAEA,YAAA,MAAMK,QAAAA,GAAW,MAAMtB,cAAAA,CAAeuB,QAAQ,CAAC;gBAC7CC,KAAAA,EAAO;oBACLS,GAAAA,EAAK;AACH,wBAAA;4BACEC,EAAAA,EAAI;AACFC,gCAAAA,MAAAA,EAAQH,gBAAgBI,GAAG,CAAC,CAACC,OAAAA,GAAiBA,QAAQH,EAAE;AAC1D;AACF,yBAAA;AACA,wBAAA;4BACER,OAAAA,EAAS;AACX;AACD,qBAAA;oBACDD,UAAAA,EAAY;AACd;AACF,aAAA,CAAA;AACArC,YAAAA,GAAAA,CAAI0C,IAAI,GAAG;gBAAEC,IAAAA,EAAMT;AAAS,aAAA;AAC9B,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMgB,UAASlD,GAAgB,EAAA;AAC7B,QAAA,MAAMC,qBAAqBC,MAAAA,CAAOC,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAAAA,EAASL,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAAA,EAAOC;AACT,SAAA,CAAA;AAEA,QAAA,MAAMR,kBAAAA,CAAmBS,aAAa,CAACV,GAAAA,CAAIW,KAAK,CAAA;QAEhD,MAAMC,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AAEtD,QAAA,MAAMS,QAAsC,MAAMV,kBAAAA,CAAmBa,aAAa,CAACd,IAAIW,KAAK,CAAA;QAC5F,MAAM,EAAEwC,OAAO,EAAEC,UAAU,EAAE,GAAG,MAAMxC,cAAAA,CAAesC,QAAQ,CAACvC,KAAAA,CAAAA;AAE9D,QAAA,MAAMgC,IAAAA,GAAOQ,OAAAA,CAAQH,GAAG,CAAC,CAACC,OAAAA,GAAAA;AACxB,YAAA,MAAM,EAAEX,OAAO,EAAE,GAAGe,aAAa,GAAGJ,OAAAA;YAEpC,OAAO;AACL,gBAAA,GAAGI,WAAW;gBACdf,OAAAA,EAAS;oBACPgB,IAAAA,EAAM;AACJC,wBAAAA,KAAAA,EAAOjB,QAAQiB;AACjB;AACF;AACF,aAAA;AACF,QAAA,CAAA,CAAA;QAEA,MAAMC,oBAAAA,GAAuB,MAAMtD,MAAAA,CAAOkB,EAAE,CAACT,KAAK,CAACF,2BAAAA,CAAAA,CAAmB8C,KAAK,CAAC;YAC1EnB,KAAAA,EAAO;gBACLC,UAAAA,EAAY;AACd;AACF,SAAA,CAAA;AAEArC,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;AAAEC,YAAAA,IAAAA;YAAMW,IAAAA,EAAM;AAAEF,gBAAAA,UAAAA;AAAYI,gBAAAA;AAAqB;AAAE,SAAA;AAChE,IAAA,CAAA;AAEA,IAAA,MAAMlC,SAAQtB,GAAgB,EAAA;AAC5B,QAAA,MAAM8C,EAAAA,GAAyC9C,GAAAA,CAAIyD,MAAM,CAACX,EAAE;QAE5D,MAAMlC,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;QACtD,MAAMwD,oBAAAA,GAAuB7C,iBAAW,gBAAA,EAAkB;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACnE,QAAA,MAAM+C,OAAAA,GAAU,MAAMrC,cAAAA,CAAeU,OAAO,CAACwB,EAAAA,EAAI;YAAEP,QAAAA,EAAU;AAAC,gBAAA;AAAY;AAAC,SAAA,CAAA;AAC3E,QAAA,IAAI,CAACU,OAAAA,EAAS;AACZ,YAAA,MAAM,IAAIzB,YAAAA,CAAOC,aAAa,CAAC,CAAC,0BAA0B,EAAEqB,EAAAA,CAAAA,CAAI,CAAA;AAClE,QAAA;AAEA,QAAA,MAAMS,KAAAA,GAAQ,MAAMG,oBAAAA,CAAqBC,YAAY,CAAC;YACpDlB,OAAAA,EAAS;gBACPQ,OAAAA,EAASH;AACX;AACF,SAAA,CAAA;AACA,QAAA,MAAMc,gBAAAA,GAAmB;AACvB,YAAA,GAAGX,OAAO;YACVY,SAAAA,EAAWZ,OAAAA,CAAQY,SAAS,GACxB3D,MAAAA,CAAOC,OAAO,CAAC,aAAA,CAAA,CAAe2D,YAAY,CAACb,OAAAA,CAAQY,SAAS,CAAA,GAC5D;AACN,SAAA;;AAGA,QAAA,MAAMlB,IAAAA,GAAO;AACX,YAAA,GAAGiB,gBAAgB;YACnBtB,OAAAA,EAAS;gBACPgB,IAAAA,EAAM;AACJC,oBAAAA;AACF;AACF;AACF,SAAA;AAEAvD,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;AAAEC,YAAAA;AAAK,SAAA;AACpB,IAAA,CAAA;AAEA,IAAA,MAAMoB,sBAAqB/D,GAAgB,EAAA;QACzC,MAAM,EAAEgE,cAAc,EAAEC,WAAW,EAAEpC,MAAM,EAAE,GAAG7B,GAAAA,CAAIW,KAAK;QAEzD,IAAI,CAACqD,cAAAA,IAAkB,CAACC,WAAAA,EAAa;YACnC,MAAM,IAAIzC,YAAAA,CAAO0C,eAAe,CAAC,mCAAA,CAAA;AACnC,QAAA;QAEA,MAAMtD,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AAEtD,QAAA,MAAMiE,mBAAAA,GAAsB,MAAMvD,cAAAA,CAAeuB,QAAQ,CAAC;YACxDC,KAAAA,EAAO;gBACLC,UAAAA,EAAY,IAAA;gBACZC,OAAAA,EAAS;oBACPrB,WAAAA,EAAa+C,cAAAA;oBACbtC,eAAAA,EAAiB;wBACf0C,GAAAA,EAAKH;AACP,qBAAA;AACApC,oBAAAA;AACF;AACF,aAAA;YACAU,QAAAA,EAAU;gBACRD,OAAAA,EAAS;AACX;AACF,SAAA,CAAA;AAEA,QAAA,MAAM+B,uBAAAA,GAA0BF,mBAAAA,CAAoBG,MAAM,CACxD,CAACC,GAAAA,EAA4CtB,OAAAA,GAAAA;AAC3CA,YAAAA,OAAAA,CAAQX,OAAO,CAACkC,OAAO,CAAC,CAACC,MAAAA,GAAAA;gBACvB,IAAIA,MAAAA,CAAOxD,WAAW,KAAK+C,cAAAA,EAAgB;AACzC,oBAAA;AACF,gBAAA;AAEA,gBAAA,IAAInC,MAAAA,IAAU4C,MAAAA,CAAO5C,MAAM,KAAKA,MAAAA,EAAQ;AACtC,oBAAA;AACF,gBAAA;AAEA,gBAAA,IAAI,CAAC0C,GAAG,CAACE,MAAAA,CAAO/C,eAAe,CAAC,EAAE;AAChC6C,oBAAAA,GAAG,CAACE,MAAAA,CAAO/C,eAAe,CAAC,GAAG;AAAC,wBAAA;AAAEoB,4BAAAA,EAAAA,EAAIG,QAAQH,EAAE;AAAE4B,4BAAAA,IAAAA,EAAMzB,QAAQyB;AAAK;AAAE,qBAAA;gBACxE,CAAA,MAAO;AACLH,oBAAAA,GAAG,CAACE,MAAAA,CAAO/C,eAAe,CAAC,CAACiD,IAAI,CAAC;AAAE7B,wBAAAA,EAAAA,EAAIG,QAAQH,EAAE;AAAE4B,wBAAAA,IAAAA,EAAMzB,QAAQyB;AAAK,qBAAA,CAAA;AACxE,gBAAA;AACF,YAAA,CAAA,CAAA;YAEA,OAAOH,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAGHvE,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAAA,EAAM0B;AACR,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAO5E,GAAgB,EAAA;AAC3B,QAAA,MAAM6E,IAAAA,GAAiB7E,GAAAA,CAAIM,KAAK,CAACuE,IAAI;AACrC,QAAA,MAAMC,WAAAA,GAAc9E,GAAAA,CAAI+E,OAAO,CAACrC,IAAI;AAEpC,QAAA,MAAMsC,uBAAAA,CAAgBF,WAAAA,CAAAA;QAEtB,MAAMlE,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,SAAAA,GAAU,MAAMrC,cAAAA,CAAegE,MAAM,CAACE,WAAAA,EAAa;AAAED,YAAAA;AAAK,SAAA,CAAA;AAEhE,QAAA,MAAM5E,qBAAqBC,MAAAA,CAAOC,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAAAA,EAASL,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAAA,EAAOC;AACT,SAAA,CAAA;AAEAT,QAAAA,GAAAA,CAAIiF,OAAO,CAAC;YACVtC,IAAAA,EAAM,MAAM1C,kBAAAA,CAAmBiF,cAAc,CAACjC,SAAAA;AAChD,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMkC,QAAOnF,GAAgB,EAAA;AAC3B,QAAA,MAAM6E,IAAAA,GAAiB7E,GAAAA,CAAIM,KAAK,CAACuE,IAAI;AACrC,QAAA,MAAMC,WAAAA,GAAc9E,GAAAA,CAAI+E,OAAO,CAACrC,IAAI;AACpC,QAAA,MAAMI,EAAAA,GAA4C9C,GAAAA,CAAIyD,MAAM,CAACX,EAAE;AAE/D,QAAA,MAAMkC,uBAAAA,CAAgBF,WAAAA,CAAAA;QAEtB,MAAMlE,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AAEtD,QAAA,MAAM+C,YAAU,MAAMrC,cAAAA,CAAeuE,MAAM,CAACrC,IAAIgC,WAAAA,EAAa;AAAED,YAAAA;AAAK,SAAA,CAAA;AAEpE,QAAA,MAAM5E,qBAAqBC,MAAAA,CAAOC,OAAO,CAAC,mBAAA,CAAA,CAAqBC,wBAAwB,CAAC;YACtFC,OAAAA,EAASL,GAAAA,CAAIM,KAAK,CAACC,WAAW;YAC9BC,KAAAA,EAAOC;AACT,SAAA,CAAA;AAEAT,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAAA,EAAM,MAAM1C,kBAAAA,CAAmBiF,cAAc,CAACjC,SAAAA;AAChD,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMmC,QAAOpF,GAAgB,EAAA;AAC3B,QAAA,MAAM8C,EAAAA,GAA4C9C,GAAAA,CAAIyD,MAAM,CAACX,EAAE;QAE/D,MAAMlC,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,OAAAA,GAAU,MAAMrC,cAAAA,CAAewE,MAAM,CAACtC,EAAAA,CAAAA;AAE5C9C,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAAA,EAAMM;AACR,SAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMoC,SAAQrF,GAAgB,EAAA;AAC5B,QAAA,MAAM8C,EAAAA,GAA6C9C,GAAAA,CAAIyD,MAAM,CAACX,EAAE;QAEhE,MAAMlC,cAAAA,GAAiBC,iBAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;;QAGtD,MAAM,EAAE+C,OAAO,EAAEqC,MAAM,EAAEC,WAAW,EAAE,GAAG,MAAM3E,cAAAA,CAAeyE,OAAO,CAACvC,EAAAA,CAAAA;;AAGtE,QAAA,IAAI,CAACwC,MAAAA,EAAQ;YACX,MAAMC,WAAAA,IAAe,IAAIC,KAAAA,CAAM,qCAAA,CAAA;AACjC,QAAA;AAEAxF,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAAA,EAAMM,OAAAA;YACNK,IAAAA,EAAM;AACJmC,gBAAAA,YAAAA,EAAcH,MAAAA,CAAOI,SAAS,GAAGJ,MAAAA,CAAOK,WAAW;AACnDC,gBAAAA,qBAAAA,EAAuBN,OAAOI,SAAS;AACvCG,gBAAAA,uBAAAA,EAAyBP,OAAOK;AAClC;AACF,SAAA;AACF,IAAA;AACF;;;;"}
@@ -267,30 +267,18 @@ const releaseController = {
267
267
  const releaseService = getService('release', {
268
268
  strapi
269
269
  });
270
- const releaseActionService = getService('release-action', {
271
- strapi
272
- });
273
- const release = await releaseService.publish(id);
274
- const [countPublishActions, countUnpublishActions] = await Promise.all([
275
- releaseActionService.countActions({
276
- filters: {
277
- release: id,
278
- type: 'publish'
279
- }
280
- }),
281
- releaseActionService.countActions({
282
- filters: {
283
- release: id,
284
- type: 'unpublish'
285
- }
286
- })
287
- ]);
270
+ // The service audits the run itself, whoever the caller is
271
+ const { release, counts, countsError } = await releaseService.publish(id);
272
+ // The publish is committed and audited; the response still needs the counts
273
+ if (!counts) {
274
+ throw countsError ?? new Error('Failed to count the release entries');
275
+ }
288
276
  ctx.body = {
289
277
  data: release,
290
278
  meta: {
291
- totalEntries: countPublishActions + countUnpublishActions,
292
- totalPublishedEntries: countPublishActions,
293
- totalUnpublishedEntries: countUnpublishActions
279
+ totalEntries: counts.published + counts.unpublished,
280
+ totalPublishedEntries: counts.published,
281
+ totalUnpublishedEntries: counts.unpublished
294
282
  }
295
283
  };
296
284
  }
@@ -1 +1 @@
1
- {"version":3,"file":"release.mjs","sources":["../../../server/src/controllers/release.ts"],"sourcesContent":["import type Koa from 'koa';\nimport { errors } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { RELEASE_MODEL_UID } from '../constants';\nimport { validateRelease, validatefindByDocumentAttachedParams } from './validation/release';\nimport type {\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n GetReleases,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService } from '../utils';\n\ntype ReleaseWithPopulatedActions = Release & { actions: { count: number } };\n\nconst releaseController = {\n /**\n * Find releases based on documents attached or not to the release.\n * If `hasEntryAttached` is true, it will return all releases that have the entry attached.\n * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.\n */\n async findByDocumentAttached(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n await permissionsManager.validateQuery(ctx.query);\n const releaseService = getService('release', { strapi });\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n await validatefindByDocumentAttachedParams(query);\n\n // If entry is a singleType, we need to manually add the entryDocumentId to the query\n const model = strapi.getModel(query.contentType) as Schema.ContentType;\n if (model.kind && 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 ${query.contentType}`);\n }\n\n query.entryDocumentId = document.documentId;\n }\n\n const { contentType, hasEntryAttached, entryDocumentId, locale } = query;\n const isEntryAttached =\n typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;\n\n if (isEntryAttached) {\n const releases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n populate: {\n actions: {\n fields: ['type'],\n filters: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n },\n });\n\n ctx.body = { data: releases };\n } else {\n const relatedReleases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n });\n\n const releases = await releaseService.findMany({\n where: {\n $or: [\n {\n id: {\n $notIn: relatedReleases.map((release: any) => release.id),\n },\n },\n {\n actions: null,\n },\n ],\n releasedAt: null,\n },\n });\n ctx.body = { data: releases };\n }\n },\n\n async findPage(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n\n const releaseService = getService('release', { strapi });\n\n const query: GetReleases.Request['query'] = await permissionsManager.sanitizeQuery(ctx.query);\n const { results, pagination } = await releaseService.findPage(query);\n\n const data = results.map((release: ReleaseWithPopulatedActions) => {\n const { actions, ...releaseData } = release;\n\n return {\n ...releaseData,\n actions: {\n meta: {\n count: actions.count,\n },\n },\n };\n });\n\n const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({\n where: {\n releasedAt: null,\n },\n });\n\n ctx.body = { data, meta: { pagination, pendingReleasesCount } };\n },\n\n async findOne(ctx: Koa.Context) {\n const id: GetRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.findOne(id, { populate: ['createdBy'] });\n if (!release) {\n throw new errors.NotFoundError(`Release not found for id: ${id}`);\n }\n\n const count = await releaseActionService.countActions({\n filters: {\n release: id,\n },\n });\n const sanitizedRelease = {\n ...release,\n createdBy: release.createdBy\n ? strapi.service('admin::user').sanitizeUser(release.createdBy)\n : null,\n };\n\n // Format the data object\n const data = {\n ...sanitizedRelease,\n actions: {\n meta: {\n count,\n },\n },\n };\n\n ctx.body = { data };\n },\n\n async mapEntriesToReleases(ctx: Koa.Context) {\n const { contentTypeUid, documentIds, locale } = ctx.query;\n\n if (!contentTypeUid || !documentIds) {\n throw new errors.ValidationError('Missing required query parameters');\n }\n\n const releaseService = getService('release', { strapi });\n\n const releasesWithActions = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType: contentTypeUid,\n entryDocumentId: {\n $in: documentIds,\n },\n locale,\n },\n },\n populate: {\n actions: true,\n },\n });\n\n const mappedEntriesInReleases = releasesWithActions.reduce(\n (acc: MapEntriesToReleases.Response['data'], release: Release) => {\n release.actions.forEach((action) => {\n if (action.contentType !== contentTypeUid) {\n return;\n }\n\n if (locale && action.locale !== locale) {\n return;\n }\n\n if (!acc[action.entryDocumentId]) {\n acc[action.entryDocumentId] = [{ id: release.id, name: release.name }];\n } else {\n acc[action.entryDocumentId].push({ id: release.id, name: release.name });\n }\n });\n\n return acc;\n },\n {} as MapEntriesToReleases.Response['data']\n );\n\n ctx.body = {\n data: mappedEntriesInReleases,\n };\n },\n\n async create(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as CreateRelease.Request['body'];\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.create(releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(release),\n });\n },\n\n async update(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as UpdateRelease.Request['body'];\n const id: UpdateRelease.Request['params']['id'] = ctx.params.id;\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.update(id, releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(release),\n };\n },\n\n async delete(ctx: Koa.Context) {\n const id: DeleteRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.delete(id);\n\n ctx.body = {\n data: release,\n };\n },\n\n async publish(ctx: Koa.Context) {\n const id: PublishRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.publish(id);\n\n const [countPublishActions, countUnpublishActions] = await Promise.all([\n releaseActionService.countActions({\n filters: {\n release: id,\n type: 'publish',\n },\n }),\n releaseActionService.countActions({\n filters: {\n release: id,\n type: 'unpublish',\n },\n }),\n ]);\n\n ctx.body = {\n data: release,\n meta: {\n totalEntries: countPublishActions + countUnpublishActions,\n totalPublishedEntries: countPublishActions,\n totalUnpublishedEntries: countUnpublishActions,\n },\n };\n },\n};\n\nexport default releaseController;\n"],"names":["releaseController","findByDocumentAttached","ctx","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_MODEL_UID","validateQuery","query","releaseService","getService","sanitizeQuery","validatefindByDocumentAttachedParams","getModel","contentType","kind","document","db","uid","findOne","select","errors","NotFoundError","entryDocumentId","documentId","hasEntryAttached","locale","isEntryAttached","Boolean","JSON","parse","releases","findMany","where","releasedAt","actions","populate","fields","filters","body","data","relatedReleases","$or","id","$notIn","map","release","findPage","results","pagination","releaseData","meta","count","pendingReleasesCount","params","releaseActionService","countActions","sanitizedRelease","createdBy","sanitizeUser","mapEntriesToReleases","contentTypeUid","documentIds","ValidationError","releasesWithActions","$in","mappedEntriesInReleases","reduce","acc","forEach","action","name","push","create","user","releaseArgs","request","validateRelease","created","sanitizeOutput","update","delete","publish","countPublishActions","countUnpublishActions","Promise","all","type","totalEntries","totalPublishedEntries","totalUnpublishedEntries"],"mappings":"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"}
1
+ {"version":3,"file":"release.mjs","sources":["../../../server/src/controllers/release.ts"],"sourcesContent":["import type Koa from 'koa';\nimport { errors } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { RELEASE_MODEL_UID } from '../constants';\nimport { validateRelease, validatefindByDocumentAttachedParams } from './validation/release';\nimport type {\n CreateRelease,\n UpdateRelease,\n PublishRelease,\n GetRelease,\n Release,\n DeleteRelease,\n GetReleases,\n MapEntriesToReleases,\n} from '../../../shared/contracts/releases';\nimport type { UserInfo } from '../../../shared/types';\nimport { getService } from '../utils';\n\ntype ReleaseWithPopulatedActions = Release & { actions: { count: number } };\n\nconst releaseController = {\n /**\n * Find releases based on documents attached or not to the release.\n * If `hasEntryAttached` is true, it will return all releases that have the entry attached.\n * If `hasEntryAttached` is false, it will return all releases that don't have the entry attached.\n */\n async findByDocumentAttached(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n await permissionsManager.validateQuery(ctx.query);\n const releaseService = getService('release', { strapi });\n const query = await permissionsManager.sanitizeQuery(ctx.query);\n\n await validatefindByDocumentAttachedParams(query);\n\n // If entry is a singleType, we need to manually add the entryDocumentId to the query\n const model = strapi.getModel(query.contentType) as Schema.ContentType;\n if (model.kind && 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 ${query.contentType}`);\n }\n\n query.entryDocumentId = document.documentId;\n }\n\n const { contentType, hasEntryAttached, entryDocumentId, locale } = query;\n const isEntryAttached =\n typeof hasEntryAttached === 'string' ? Boolean(JSON.parse(hasEntryAttached)) : false;\n\n if (isEntryAttached) {\n const releases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n populate: {\n actions: {\n fields: ['type'],\n filters: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n },\n });\n\n ctx.body = { data: releases };\n } else {\n const relatedReleases = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entryDocumentId ?? null,\n locale: locale ?? null,\n },\n },\n });\n\n const releases = await releaseService.findMany({\n where: {\n $or: [\n {\n id: {\n $notIn: relatedReleases.map((release: any) => release.id),\n },\n },\n {\n actions: null,\n },\n ],\n releasedAt: null,\n },\n });\n ctx.body = { data: releases };\n }\n },\n\n async findPage(ctx: Koa.Context) {\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n await permissionsManager.validateQuery(ctx.query);\n\n const releaseService = getService('release', { strapi });\n\n const query: GetReleases.Request['query'] = await permissionsManager.sanitizeQuery(ctx.query);\n const { results, pagination } = await releaseService.findPage(query);\n\n const data = results.map((release: ReleaseWithPopulatedActions) => {\n const { actions, ...releaseData } = release;\n\n return {\n ...releaseData,\n actions: {\n meta: {\n count: actions.count,\n },\n },\n };\n });\n\n const pendingReleasesCount = await strapi.db.query(RELEASE_MODEL_UID).count({\n where: {\n releasedAt: null,\n },\n });\n\n ctx.body = { data, meta: { pagination, pendingReleasesCount } };\n },\n\n async findOne(ctx: Koa.Context) {\n const id: GetRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const releaseActionService = getService('release-action', { strapi });\n const release = await releaseService.findOne(id, { populate: ['createdBy'] });\n if (!release) {\n throw new errors.NotFoundError(`Release not found for id: ${id}`);\n }\n\n const count = await releaseActionService.countActions({\n filters: {\n release: id,\n },\n });\n const sanitizedRelease = {\n ...release,\n createdBy: release.createdBy\n ? strapi.service('admin::user').sanitizeUser(release.createdBy)\n : null,\n };\n\n // Format the data object\n const data = {\n ...sanitizedRelease,\n actions: {\n meta: {\n count,\n },\n },\n };\n\n ctx.body = { data };\n },\n\n async mapEntriesToReleases(ctx: Koa.Context) {\n const { contentTypeUid, documentIds, locale } = ctx.query;\n\n if (!contentTypeUid || !documentIds) {\n throw new errors.ValidationError('Missing required query parameters');\n }\n\n const releaseService = getService('release', { strapi });\n\n const releasesWithActions = await releaseService.findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType: contentTypeUid,\n entryDocumentId: {\n $in: documentIds,\n },\n locale,\n },\n },\n populate: {\n actions: true,\n },\n });\n\n const mappedEntriesInReleases = releasesWithActions.reduce(\n (acc: MapEntriesToReleases.Response['data'], release: Release) => {\n release.actions.forEach((action) => {\n if (action.contentType !== contentTypeUid) {\n return;\n }\n\n if (locale && action.locale !== locale) {\n return;\n }\n\n if (!acc[action.entryDocumentId]) {\n acc[action.entryDocumentId] = [{ id: release.id, name: release.name }];\n } else {\n acc[action.entryDocumentId].push({ id: release.id, name: release.name });\n }\n });\n\n return acc;\n },\n {} as MapEntriesToReleases.Response['data']\n );\n\n ctx.body = {\n data: mappedEntriesInReleases,\n };\n },\n\n async create(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as CreateRelease.Request['body'];\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.create(releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.created({\n data: await permissionsManager.sanitizeOutput(release),\n });\n },\n\n async update(ctx: Koa.Context) {\n const user: UserInfo = ctx.state.user;\n const releaseArgs = ctx.request.body as UpdateRelease.Request['body'];\n const id: UpdateRelease.Request['params']['id'] = ctx.params.id;\n\n await validateRelease(releaseArgs);\n\n const releaseService = getService('release', { strapi });\n\n const release = await releaseService.update(id, releaseArgs, { user });\n\n const permissionsManager = strapi.service('admin::permission').createPermissionsManager({\n ability: ctx.state.userAbility,\n model: RELEASE_MODEL_UID,\n });\n\n ctx.body = {\n data: await permissionsManager.sanitizeOutput(release),\n };\n },\n\n async delete(ctx: Koa.Context) {\n const id: DeleteRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n const release = await releaseService.delete(id);\n\n ctx.body = {\n data: release,\n };\n },\n\n async publish(ctx: Koa.Context) {\n const id: PublishRelease.Request['params']['id'] = ctx.params.id;\n\n const releaseService = getService('release', { strapi });\n\n // The service audits the run itself, whoever the caller is\n const { release, counts, countsError } = await releaseService.publish(id);\n\n // The publish is committed and audited; the response still needs the counts\n if (!counts) {\n throw countsError ?? new Error('Failed to count the release entries');\n }\n\n ctx.body = {\n data: release,\n meta: {\n totalEntries: counts.published + counts.unpublished,\n totalPublishedEntries: counts.published,\n totalUnpublishedEntries: counts.unpublished,\n },\n };\n },\n};\n\nexport default releaseController;\n"],"names":["releaseController","findByDocumentAttached","ctx","permissionsManager","strapi","service","createPermissionsManager","ability","state","userAbility","model","RELEASE_MODEL_UID","validateQuery","query","releaseService","getService","sanitizeQuery","validatefindByDocumentAttachedParams","getModel","contentType","kind","document","db","uid","findOne","select","errors","NotFoundError","entryDocumentId","documentId","hasEntryAttached","locale","isEntryAttached","Boolean","JSON","parse","releases","findMany","where","releasedAt","actions","populate","fields","filters","body","data","relatedReleases","$or","id","$notIn","map","release","findPage","results","pagination","releaseData","meta","count","pendingReleasesCount","params","releaseActionService","countActions","sanitizedRelease","createdBy","sanitizeUser","mapEntriesToReleases","contentTypeUid","documentIds","ValidationError","releasesWithActions","$in","mappedEntriesInReleases","reduce","acc","forEach","action","name","push","create","user","releaseArgs","request","validateRelease","created","sanitizeOutput","update","delete","publish","counts","countsError","Error","totalEntries","published","unpublished","totalPublishedEntries","totalUnpublishedEntries"],"mappings":"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"}
@@ -19,7 +19,6 @@ const settingsController = {
19
19
  // Data validation
20
20
  const settingsBody = ctx.request.body;
21
21
  const settings$1 = await settings.validateSettings(settingsBody);
22
- // Update
23
22
  const settingsService = index.getService('settings', {
24
23
  strapi
25
24
  });
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sources":["../../../server/src/controllers/settings.ts"],"sourcesContent":["/**\n * Used to store user configurations related to releases.\n * E.g the default timezone for the release schedule.\n */\nimport type Koa from 'koa';\n\nimport type { GetSettings, UpdateSettings, Settings } from '../../../shared/contracts/settings';\nimport { getService } from '../utils';\nimport { validateSettings } from './validation/settings';\n\nconst settingsController = {\n async find(ctx: Koa.Context) {\n // Get settings\n const settingsService = getService('settings', { strapi });\n const settings = await settingsService.find();\n\n // Response\n ctx.body = { data: settings } satisfies GetSettings.Response;\n },\n\n async update(ctx: Koa.Context) {\n // Data validation\n const settingsBody = ctx.request.body;\n const settings = (await validateSettings(settingsBody)) as Settings;\n\n // Update\n const settingsService = getService('settings', { strapi });\n const updatedSettings = await settingsService.update({ settings });\n\n // Response\n ctx.body = { data: updatedSettings } satisfies UpdateSettings.Response;\n },\n};\n\nexport default settingsController;\n"],"names":["settingsController","find","ctx","settingsService","getService","strapi","settings","body","data","update","settingsBody","request","validateSettings","updatedSettings"],"mappings":";;;;;AAUA,MAAMA,kBAAAA,GAAqB;AACzB,IAAA,MAAMC,MAAKC,GAAgB,EAAA;;QAEzB,MAAMC,eAAAA,GAAkBC,iBAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;QACxD,MAAMC,QAAAA,GAAW,MAAMH,eAAAA,CAAgBF,IAAI,EAAA;;AAG3CC,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMF;AAAS,SAAA;AAC9B,IAAA,CAAA;AAEA,IAAA,MAAMG,QAAOP,GAAgB,EAAA;;AAE3B,QAAA,MAAMQ,YAAAA,GAAeR,GAAAA,CAAIS,OAAO,CAACJ,IAAI;QACrC,MAAMD,UAAAA,GAAY,MAAMM,yBAAAA,CAAiBF,YAAAA,CAAAA;;QAGzC,MAAMP,eAAAA,GAAkBC,iBAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;AACxD,QAAA,MAAMQ,eAAAA,GAAkB,MAAMV,eAAAA,CAAgBM,MAAM,CAAC;AAAEH,sBAAAA;AAAS,SAAA,CAAA;;AAGhEJ,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMK;AAAgB,SAAA;AACrC,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"settings.js","sources":["../../../server/src/controllers/settings.ts"],"sourcesContent":["/**\n * Used to store user configurations related to releases.\n * E.g the default timezone for the release schedule.\n */\nimport type Koa from 'koa';\n\nimport type { GetSettings, UpdateSettings, Settings } from '../../../shared/contracts/settings';\nimport { getService } from '../utils';\nimport { validateSettings } from './validation/settings';\n\nconst settingsController = {\n async find(ctx: Koa.Context) {\n // Get settings\n const settingsService = getService('settings', { strapi });\n const settings = await settingsService.find();\n\n // Response\n ctx.body = { data: settings } satisfies GetSettings.Response;\n },\n\n async update(ctx: Koa.Context) {\n // Data validation\n const settingsBody = ctx.request.body;\n const settings = (await validateSettings(settingsBody)) as Settings;\n\n const settingsService = getService('settings', { strapi });\n\n const updatedSettings = await settingsService.update({ settings });\n\n // Response\n ctx.body = { data: updatedSettings } satisfies UpdateSettings.Response;\n },\n};\n\nexport default settingsController;\n"],"names":["settingsController","find","ctx","settingsService","getService","strapi","settings","body","data","update","settingsBody","request","validateSettings","updatedSettings"],"mappings":";;;;;AAUA,MAAMA,kBAAAA,GAAqB;AACzB,IAAA,MAAMC,MAAKC,GAAgB,EAAA;;QAEzB,MAAMC,eAAAA,GAAkBC,iBAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;QACxD,MAAMC,QAAAA,GAAW,MAAMH,eAAAA,CAAgBF,IAAI,EAAA;;AAG3CC,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMF;AAAS,SAAA;AAC9B,IAAA,CAAA;AAEA,IAAA,MAAMG,QAAOP,GAAgB,EAAA;;AAE3B,QAAA,MAAMQ,YAAAA,GAAeR,GAAAA,CAAIS,OAAO,CAACJ,IAAI;QACrC,MAAMD,UAAAA,GAAY,MAAMM,yBAAAA,CAAiBF,YAAAA,CAAAA;QAEzC,MAAMP,eAAAA,GAAkBC,iBAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;AAExD,QAAA,MAAMQ,eAAAA,GAAkB,MAAMV,eAAAA,CAAgBM,MAAM,CAAC;AAAEH,sBAAAA;AAAS,SAAA,CAAA;;AAGhEJ,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMK;AAAgB,SAAA;AACrC,IAAA;AACF;;;;"}
@@ -17,7 +17,6 @@ const settingsController = {
17
17
  // Data validation
18
18
  const settingsBody = ctx.request.body;
19
19
  const settings = await validateSettings(settingsBody);
20
- // Update
21
20
  const settingsService = getService('settings', {
22
21
  strapi
23
22
  });
@@ -1 +1 @@
1
- {"version":3,"file":"settings.mjs","sources":["../../../server/src/controllers/settings.ts"],"sourcesContent":["/**\n * Used to store user configurations related to releases.\n * E.g the default timezone for the release schedule.\n */\nimport type Koa from 'koa';\n\nimport type { GetSettings, UpdateSettings, Settings } from '../../../shared/contracts/settings';\nimport { getService } from '../utils';\nimport { validateSettings } from './validation/settings';\n\nconst settingsController = {\n async find(ctx: Koa.Context) {\n // Get settings\n const settingsService = getService('settings', { strapi });\n const settings = await settingsService.find();\n\n // Response\n ctx.body = { data: settings } satisfies GetSettings.Response;\n },\n\n async update(ctx: Koa.Context) {\n // Data validation\n const settingsBody = ctx.request.body;\n const settings = (await validateSettings(settingsBody)) as Settings;\n\n // Update\n const settingsService = getService('settings', { strapi });\n const updatedSettings = await settingsService.update({ settings });\n\n // Response\n ctx.body = { data: updatedSettings } satisfies UpdateSettings.Response;\n },\n};\n\nexport default settingsController;\n"],"names":["settingsController","find","ctx","settingsService","getService","strapi","settings","body","data","update","settingsBody","request","validateSettings","updatedSettings"],"mappings":";;;AAUA,MAAMA,kBAAAA,GAAqB;AACzB,IAAA,MAAMC,MAAKC,GAAgB,EAAA;;QAEzB,MAAMC,eAAAA,GAAkBC,WAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;QACxD,MAAMC,QAAAA,GAAW,MAAMH,eAAAA,CAAgBF,IAAI,EAAA;;AAG3CC,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMF;AAAS,SAAA;AAC9B,IAAA,CAAA;AAEA,IAAA,MAAMG,QAAOP,GAAgB,EAAA;;AAE3B,QAAA,MAAMQ,YAAAA,GAAeR,GAAAA,CAAIS,OAAO,CAACJ,IAAI;QACrC,MAAMD,QAAAA,GAAY,MAAMM,gBAAAA,CAAiBF,YAAAA,CAAAA;;QAGzC,MAAMP,eAAAA,GAAkBC,WAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;AACxD,QAAA,MAAMQ,eAAAA,GAAkB,MAAMV,eAAAA,CAAgBM,MAAM,CAAC;AAAEH,YAAAA;AAAS,SAAA,CAAA;;AAGhEJ,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMK;AAAgB,SAAA;AACrC,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"settings.mjs","sources":["../../../server/src/controllers/settings.ts"],"sourcesContent":["/**\n * Used to store user configurations related to releases.\n * E.g the default timezone for the release schedule.\n */\nimport type Koa from 'koa';\n\nimport type { GetSettings, UpdateSettings, Settings } from '../../../shared/contracts/settings';\nimport { getService } from '../utils';\nimport { validateSettings } from './validation/settings';\n\nconst settingsController = {\n async find(ctx: Koa.Context) {\n // Get settings\n const settingsService = getService('settings', { strapi });\n const settings = await settingsService.find();\n\n // Response\n ctx.body = { data: settings } satisfies GetSettings.Response;\n },\n\n async update(ctx: Koa.Context) {\n // Data validation\n const settingsBody = ctx.request.body;\n const settings = (await validateSettings(settingsBody)) as Settings;\n\n const settingsService = getService('settings', { strapi });\n\n const updatedSettings = await settingsService.update({ settings });\n\n // Response\n ctx.body = { data: updatedSettings } satisfies UpdateSettings.Response;\n },\n};\n\nexport default settingsController;\n"],"names":["settingsController","find","ctx","settingsService","getService","strapi","settings","body","data","update","settingsBody","request","validateSettings","updatedSettings"],"mappings":";;;AAUA,MAAMA,kBAAAA,GAAqB;AACzB,IAAA,MAAMC,MAAKC,GAAgB,EAAA;;QAEzB,MAAMC,eAAAA,GAAkBC,WAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;QACxD,MAAMC,QAAAA,GAAW,MAAMH,eAAAA,CAAgBF,IAAI,EAAA;;AAG3CC,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMF;AAAS,SAAA;AAC9B,IAAA,CAAA;AAEA,IAAA,MAAMG,QAAOP,GAAgB,EAAA;;AAE3B,QAAA,MAAMQ,YAAAA,GAAeR,GAAAA,CAAIS,OAAO,CAACJ,IAAI;QACrC,MAAMD,QAAAA,GAAY,MAAMM,gBAAAA,CAAiBF,YAAAA,CAAAA;QAEzC,MAAMP,eAAAA,GAAkBC,WAAW,UAAA,EAAY;AAAEC,YAAAA;AAAO,SAAA,CAAA;AAExD,QAAA,MAAMQ,eAAAA,GAAkB,MAAMV,eAAAA,CAAgBM,MAAM,CAAC;AAAEH,YAAAA;AAAS,SAAA,CAAA;;AAGhEJ,QAAAA,GAAAA,CAAIK,IAAI,GAAG;YAAEC,IAAAA,EAAMK;AAAgB,SAAA;AACrC,IAAA;AACF;;;;"}
@@ -3,6 +3,7 @@
3
3
  var utils = require('@strapi/utils');
4
4
  var _ = require('lodash/fp');
5
5
  var constants = require('../constants.js');
6
+ var auditLogs = require('../audit-logs.js');
6
7
  var index = require('../utils/index.js');
7
8
 
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -110,6 +111,17 @@ const createReleaseActionService = ({ strapi })=>{
110
111
  strapi
111
112
  }).updateReleaseStatus(release.id);
112
113
  }
114
+ await auditLogs.emitAuditOnCommit({
115
+ strapi
116
+ }, constants.AUDITED_EVENTS.RELEASE_ENTRY_ADD, {
117
+ releaseId: release.id,
118
+ name: release.name,
119
+ actionId: releaseAction.id,
120
+ type: releaseAction.type,
121
+ contentType: releaseAction.contentType,
122
+ entryDocumentId: releaseAction.entryDocumentId,
123
+ locale: releaseAction.locale
124
+ });
113
125
  return releaseAction;
114
126
  },
115
127
  async findPage (releaseId, query) {
@@ -218,6 +230,14 @@ const createReleaseActionService = ({ strapi })=>{
218
230
  $null: true
219
231
  }
220
232
  }
233
+ },
234
+ populate: {
235
+ release: {
236
+ select: [
237
+ 'id',
238
+ 'name'
239
+ ]
240
+ }
221
241
  }
222
242
  });
223
243
  if (!action) {
@@ -240,18 +260,34 @@ const createReleaseActionService = ({ strapi })=>{
240
260
  }
241
261
  }
242
262
  },
263
+ // Only the field the PUT contract allows. Changing the entry is remove + add.
243
264
  data: {
244
- ...update,
265
+ type: update.type,
245
266
  isEntryValid: actionStatus
246
267
  }
247
268
  });
248
269
  index.getService('release', {
249
270
  strapi
250
271
  }).updateReleaseStatus(releaseId);
272
+ // isEntryValid is recalculated, not edited: only the type change is audited
273
+ if (updatedAction && action.type !== updatedAction.type) {
274
+ await auditLogs.emitAuditOnCommit({
275
+ strapi
276
+ }, constants.AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {
277
+ releaseId: action.release?.id ?? Number(releaseId),
278
+ name: action.release?.name,
279
+ actionId: updatedAction.id,
280
+ contentType: updatedAction.contentType,
281
+ entryDocumentId: updatedAction.entryDocumentId,
282
+ locale: updatedAction.locale,
283
+ from: action.type,
284
+ to: updatedAction.type
285
+ });
286
+ }
251
287
  return updatedAction;
252
288
  },
253
289
  async delete (actionId, releaseId) {
254
- const deletedAction = await strapi.db.query(constants.RELEASE_ACTION_MODEL_UID).delete({
290
+ const deletedRow = await strapi.db.query(constants.RELEASE_ACTION_MODEL_UID).delete({
255
291
  where: {
256
292
  id: actionId,
257
293
  release: {
@@ -260,14 +296,34 @@ const createReleaseActionService = ({ strapi })=>{
260
296
  $null: true
261
297
  }
262
298
  }
299
+ },
300
+ populate: {
301
+ release: {
302
+ select: [
303
+ 'id',
304
+ 'name'
305
+ ]
306
+ }
263
307
  }
264
308
  });
265
- if (!deletedAction) {
309
+ if (!deletedRow) {
266
310
  throw new utils.errors.NotFoundError(`Action with id ${actionId} not found in release with id ${releaseId} or it is already published`);
267
311
  }
312
+ const { release: populatedRelease, ...deletedAction } = deletedRow;
268
313
  index.getService('release', {
269
314
  strapi
270
315
  }).updateReleaseStatus(releaseId);
316
+ await auditLogs.emitAuditOnCommit({
317
+ strapi
318
+ }, constants.AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {
319
+ releaseId: populatedRelease?.id ?? Number(releaseId),
320
+ name: populatedRelease?.name,
321
+ actionId: deletedAction.id,
322
+ type: deletedAction.type,
323
+ contentType: deletedAction.contentType,
324
+ entryDocumentId: deletedAction.entryDocumentId,
325
+ locale: deletedAction.locale
326
+ });
271
327
  return deletedAction;
272
328
  },
273
329
  async validateActionsByContentTypes (contentTypeUids) {
@@ -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/fp';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\n\nimport type {\n CreateReleaseAction,\n GetReleaseActions,\n ReleaseAction,\n ReleaseActionGroupBy,\n UpdateReleaseAction,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport type { Entity } from '../../../shared/types';\nimport { getService, getDraftEntryValidStatus, getEntry, getEntryStatus } from '../utils';\n\nconst getGroupName = (queryValue: string) => {\n switch (queryValue) {\n case 'contentType':\n return 'contentType.displayName';\n case 'type':\n return 'type';\n case 'locale':\n return _.getOr('No locale', 'locale.name');\n default:\n return 'contentType.displayName';\n }\n};\n\nexport interface Locale extends Entity {\n name: string;\n code: string;\n}\n\ntype LocaleDictionary = {\n [key: Locale['code']]: Pick<Locale, 'name' | 'code'>;\n};\n\nconst createReleaseActionService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getLocalesDataForActions = async () => {\n if (!strapi.plugin('i18n')) {\n return {};\n }\n\n const allLocales: Locale[] = (await strapi.plugin('i18n').service('locales').find()) || [];\n return allLocales.reduce<LocaleDictionary>((acc, locale) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n }, {});\n };\n\n const getContentTypesDataForActions = async (\n contentTypesUids: ReleaseAction['contentType'][]\n ) => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n\n const contentTypesData: Record<\n Internal.UID.ContentType,\n { mainField: string; displayName: string }\n > = {};\n for (const contentTypeUid of contentTypesUids) {\n const contentTypeConfig = await contentManagerContentTypeService.findConfiguration({\n uid: contentTypeUid,\n });\n\n contentTypesData[contentTypeUid] = {\n mainField: contentTypeConfig.settings.mainField,\n displayName: strapi.getModel(contentTypeUid).info.displayName,\n };\n }\n\n return contentTypesData;\n };\n\n return {\n async create(\n releaseId: CreateReleaseAction.Request['params']['releaseId'],\n action: CreateReleaseAction.Request['body'],\n { disableUpdateReleaseStatus = false }: { disableUpdateReleaseStatus?: boolean } = {}\n ) {\n const { validateEntryData, validateUniqueEntry } = getService('release-validation', {\n strapi,\n });\n\n await Promise.all([\n validateEntryData(action.contentType, action.entryDocumentId),\n validateUniqueEntry(releaseId, action),\n ]);\n\n // If we are adding a singleType, we need to append the documentId of that singleType\n const model = strapi.contentType(action.contentType);\n if (model.kind === 'singleType') {\n const document = await strapi.db.query(model.uid).findOne({ select: ['documentId'] });\n\n if (!document) {\n throw new errors.NotFoundError(`No entry found for contentType ${action.contentType}`);\n }\n\n action.entryDocumentId = document.documentId;\n }\n\n const release = await strapi.db\n .query(RELEASE_MODEL_UID)\n .findOne({ where: { id: releaseId } });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n if (release.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n // If the action is a publish, check if the entry is valid\n // If the action is an unpublish, skip the validation\n const actionStatus =\n action.type === 'publish'\n ? await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n {\n strapi,\n }\n )\n : true;\n\n const releaseAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).create({\n data: {\n ...action,\n release: release.id,\n isEntryValid: actionStatus,\n },\n populate: { release: { select: ['id'] } },\n });\n\n if (!disableUpdateReleaseStatus) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n\n return releaseAction;\n },\n\n async findPage(\n releaseId: GetReleaseActions.Request['params']['releaseId'],\n query?: GetReleaseActions.Request['query']\n ) {\n const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n where: { id: releaseId },\n select: ['id'],\n });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n const { results: actions, pagination } = await strapi.db\n .query(RELEASE_ACTION_MODEL_UID)\n .findPage({\n ...dbQuery,\n where: {\n release: releaseId,\n },\n });\n\n // For each contentType on the release, we create a custom populate object for nested relations\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n\n const actionsWithEntry = await async.map(actions, async (action: ReleaseAction) => {\n // @ts-expect-error - Core.Service type is not a function\n const populate = await populateBuilderService(action.contentType)\n .populateDeep(Infinity)\n .build();\n\n const entry = await getEntry(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n populate,\n status: action.type === 'publish' ? 'draft' : 'published',\n },\n { strapi }\n );\n\n return {\n ...action,\n entry,\n status: entry ? await getEntryStatus(action.contentType, entry) : null,\n };\n });\n\n return {\n results: actionsWithEntry,\n pagination,\n };\n },\n\n async groupActions(actions: ReleaseAction[], groupBy: ReleaseActionGroupBy) {\n const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n if (!acc.includes(action.contentType)) {\n acc.push(action.contentType);\n }\n\n return acc;\n }, []);\n const allReleaseContentTypesDictionary = await getContentTypesDataForActions(contentTypeUids);\n const allLocalesDictionary = await getLocalesDataForActions();\n\n const formattedData = actions.map((action: ReleaseAction) => {\n const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];\n\n return {\n ...action,\n locale: action.locale ? allLocalesDictionary[action.locale] : null,\n contentType: {\n displayName,\n mainFieldValue: action.entry[mainField],\n uid: action.contentType,\n },\n };\n });\n\n const groupName = getGroupName(groupBy);\n return _.groupBy(groupName)(formattedData);\n },\n\n async getContentTypeModelsFromActions(actions: ReleaseAction[]) {\n const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n if (!acc.includes(action.contentType)) {\n acc.push(action.contentType);\n }\n\n return acc;\n }, []);\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n\n const contentTypeModelsMap = await async.reduce(contentTypeUids)(\n async (\n accPromise: Promise<GetReleaseActions.Response['meta']['contentTypes']>,\n contentTypeUid: ReleaseAction['contentType']\n ) => {\n const acc = await accPromise;\n const contentTypeModel = strapi.getModel(contentTypeUid);\n\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n acc[contentTypeUid] = {\n ...contentTypeModel,\n hasReviewWorkflow: !!workflow,\n stageRequiredToPublish: workflow?.stageRequiredToPublish,\n };\n\n return acc;\n },\n {}\n );\n\n return contentTypeModelsMap;\n },\n\n async countActions(\n query: Modules.EntityService.Params.Pick<typeof RELEASE_ACTION_MODEL_UID, 'filters'>\n ) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);\n },\n\n async update(\n actionId: UpdateReleaseAction.Request['params']['actionId'],\n releaseId: UpdateReleaseAction.Request['params']['releaseId'],\n update: UpdateReleaseAction.Request['body']\n ) {\n const action = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findOne({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n });\n\n if (!action) {\n throw new errors.NotFoundError(\n `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`\n );\n }\n\n const actionStatus =\n update.type === 'publish'\n ? await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n {\n strapi,\n }\n )\n : true;\n\n const updatedAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n data: {\n ...update,\n isEntryValid: actionStatus,\n },\n });\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n return updatedAction;\n },\n\n async delete(\n actionId: DeleteReleaseAction.Request['params']['actionId'],\n releaseId: DeleteReleaseAction.Request['params']['releaseId']\n ) {\n const deletedAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).delete({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n });\n\n if (!deletedAction) {\n throw new errors.NotFoundError(\n `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`\n );\n }\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n return deletedAction;\n },\n\n async validateActionsByContentTypes(contentTypeUids: UID.ContentType[]) {\n const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n contentType: {\n $in: contentTypeUids,\n },\n // We only want to validate actions that are going to be published\n type: 'publish',\n release: {\n releasedAt: {\n $null: true,\n },\n },\n },\n populate: { release: true },\n });\n\n const releasesUpdated: Data.ID[] = [];\n\n await async.map(actions, async (action: ReleaseAction) => {\n const isValid = await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n { strapi }\n );\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: action.id,\n },\n data: {\n isEntryValid: isValid,\n },\n });\n\n if (!releasesUpdated.includes(action.release.id)) {\n releasesUpdated.push(action.release.id);\n }\n\n return {\n id: action.id,\n isEntryValid: isValid,\n };\n });\n\n if (releasesUpdated.length > 0) {\n await async.map(releasesUpdated, async (releaseId: number) => {\n await getService('release', { strapi }).updateReleaseStatus(releaseId);\n });\n }\n },\n };\n};\n\nexport type ReleaseActionService = ReturnType<typeof createReleaseActionService>;\n\nexport default createReleaseActionService;\n"],"names":["getGroupName","queryValue","_","getOr","createReleaseActionService","strapi","getLocalesDataForActions","plugin","allLocales","service","find","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","action","disableUpdateReleaseStatus","validateEntryData","validateUniqueEntry","getService","Promise","all","contentType","entryDocumentId","model","kind","document","db","query","findOne","select","errors","NotFoundError","documentId","release","RELEASE_MODEL_UID","where","id","releasedAt","ValidationError","actionStatus","type","getDraftEntryValidStatus","releaseAction","RELEASE_ACTION_MODEL_UID","data","isEntryValid","populate","updateReleaseStatus","findPage","dbQuery","get","transform","results","actions","pagination","populateBuilderService","actionsWithEntry","async","map","populateDeep","Infinity","build","entry","getEntry","status","getEntryStatus","groupActions","groupBy","contentTypeUids","includes","push","allReleaseContentTypesDictionary","allLocalesDictionary","formattedData","mainFieldValue","groupName","getContentTypeModelsFromActions","workflowsService","contentTypeModelsMap","accPromise","contentTypeModel","workflow","getAssignedWorkflow","hasReviewWorkflow","stageRequiredToPublish","countActions","count","update","actionId","$null","updatedAction","delete","deletedAction","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}
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/fp';\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 _.getOr('No locale', 'locale.name');\n default:\n return 'contentType.displayName';\n }\n};\n\nexport interface Locale extends Entity {\n name: string;\n code: string;\n}\n\ntype LocaleDictionary = {\n [key: Locale['code']]: Pick<Locale, 'name' | 'code'>;\n};\n\nconst createReleaseActionService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getLocalesDataForActions = async () => {\n if (!strapi.plugin('i18n')) {\n return {};\n }\n\n const allLocales: Locale[] = (await strapi.plugin('i18n').service('locales').find()) || [];\n return allLocales.reduce<LocaleDictionary>((acc, locale) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n }, {});\n };\n\n const getContentTypesDataForActions = async (\n contentTypesUids: ReleaseAction['contentType'][]\n ) => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n\n const contentTypesData: Record<\n Internal.UID.ContentType,\n { mainField: string; displayName: string }\n > = {};\n for (const contentTypeUid of contentTypesUids) {\n const contentTypeConfig = await contentManagerContentTypeService.findConfiguration({\n uid: contentTypeUid,\n });\n\n contentTypesData[contentTypeUid] = {\n mainField: contentTypeConfig.settings.mainField,\n displayName: strapi.getModel(contentTypeUid).info.displayName,\n };\n }\n\n return contentTypesData;\n };\n\n return {\n async create(\n releaseId: CreateReleaseAction.Request['params']['releaseId'],\n action: CreateReleaseAction.Request['body'],\n { disableUpdateReleaseStatus = false }: { disableUpdateReleaseStatus?: boolean } = {}\n ) {\n const { validateEntryData, validateUniqueEntry } = getService('release-validation', {\n strapi,\n });\n\n await Promise.all([\n validateEntryData(action.contentType, action.entryDocumentId),\n validateUniqueEntry(releaseId, action),\n ]);\n\n // If we are adding a singleType, we need to append the documentId of that singleType\n const model = strapi.contentType(action.contentType);\n if (model.kind === 'singleType') {\n const document = await strapi.db.query(model.uid).findOne({ select: ['documentId'] });\n\n if (!document) {\n throw new errors.NotFoundError(`No entry found for contentType ${action.contentType}`);\n }\n\n action.entryDocumentId = document.documentId;\n }\n\n const release = await strapi.db\n .query(RELEASE_MODEL_UID)\n .findOne({ where: { id: releaseId } });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n if (release.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n // If the action is a publish, check if the entry is valid\n // If the action is an unpublish, skip the validation\n const actionStatus =\n action.type === 'publish'\n ? await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n {\n strapi,\n }\n )\n : true;\n\n const releaseAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).create({\n data: {\n ...action,\n release: release.id,\n isEntryValid: actionStatus,\n },\n populate: { release: { select: ['id'] } },\n });\n\n if (!disableUpdateReleaseStatus) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n\n 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(groupName)(formattedData);\n },\n\n async getContentTypeModelsFromActions(actions: ReleaseAction[]) {\n const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n if (!acc.includes(action.contentType)) {\n acc.push(action.contentType);\n }\n\n return acc;\n }, []);\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n\n const contentTypeModelsMap = await async.reduce(contentTypeUids)(\n async (\n accPromise: Promise<GetReleaseActions.Response['meta']['contentTypes']>,\n contentTypeUid: ReleaseAction['contentType']\n ) => {\n const acc = await accPromise;\n const contentTypeModel = strapi.getModel(contentTypeUid);\n\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n acc[contentTypeUid] = {\n ...contentTypeModel,\n hasReviewWorkflow: !!workflow,\n stageRequiredToPublish: workflow?.stageRequiredToPublish,\n };\n\n return acc;\n },\n {}\n );\n\n return contentTypeModelsMap;\n },\n\n async countActions(\n query: Modules.EntityService.Params.Pick<typeof RELEASE_ACTION_MODEL_UID, 'filters'>\n ) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);\n },\n\n async update(\n actionId: UpdateReleaseAction.Request['params']['actionId'],\n releaseId: UpdateReleaseAction.Request['params']['releaseId'],\n update: UpdateReleaseAction.Request['body']\n ) {\n const action = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findOne({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n 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","_","getOr","createReleaseActionService","strapi","getLocalesDataForActions","plugin","allLocales","service","find","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","action","disableUpdateReleaseStatus","validateEntryData","validateUniqueEntry","getService","Promise","all","contentType","entryDocumentId","model","kind","document","db","query","findOne","select","errors","NotFoundError","documentId","release","RELEASE_MODEL_UID","where","id","releasedAt","ValidationError","actionStatus","type","getDraftEntryValidStatus","releaseAction","RELEASE_ACTION_MODEL_UID","data","isEntryValid","populate","updateReleaseStatus","emitAuditOnCommit","AUDITED_EVENTS","RELEASE_ENTRY_ADD","actionId","findPage","dbQuery","get","transform","results","actions","pagination","populateBuilderService","actionsWithEntry","async","map","populateDeep","Infinity","build","entry","getEntry","status","getEntryStatus","groupActions","groupBy","contentTypeUids","includes","push","allReleaseContentTypesDictionary","allLocalesDictionary","formattedData","mainFieldValue","groupName","getContentTypeModelsFromActions","workflowsService","contentTypeModelsMap","accPromise","contentTypeModel","workflow","getAssignedWorkflow","hasReviewWorkflow","stageRequiredToPublish","countActions","count","update","$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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"}