@strapi/content-releases 5.52.2 → 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 (56) hide show
  1. package/dist/admin/pages/ReleasesPage.js +0 -1
  2. package/dist/admin/pages/ReleasesPage.js.map +1 -1
  3. package/dist/admin/pages/ReleasesPage.mjs +0 -1
  4. package/dist/admin/pages/ReleasesPage.mjs.map +1 -1
  5. package/dist/server/audit-logs.js +182 -0
  6. package/dist/server/audit-logs.js.map +1 -0
  7. package/dist/server/audit-logs.mjs +175 -0
  8. package/dist/server/audit-logs.mjs.map +1 -0
  9. package/dist/server/bootstrap.js +6 -0
  10. package/dist/server/bootstrap.js.map +1 -1
  11. package/dist/server/bootstrap.mjs +6 -0
  12. package/dist/server/bootstrap.mjs.map +1 -1
  13. package/dist/server/constants.js +20 -0
  14. package/dist/server/constants.js.map +1 -1
  15. package/dist/server/constants.mjs +20 -1
  16. package/dist/server/constants.mjs.map +1 -1
  17. package/dist/server/controllers/release.js +9 -21
  18. package/dist/server/controllers/release.js.map +1 -1
  19. package/dist/server/controllers/release.mjs +9 -21
  20. package/dist/server/controllers/release.mjs.map +1 -1
  21. package/dist/server/controllers/settings.js +0 -1
  22. package/dist/server/controllers/settings.js.map +1 -1
  23. package/dist/server/controllers/settings.mjs +0 -1
  24. package/dist/server/controllers/settings.mjs.map +1 -1
  25. package/dist/server/services/release-action.js +59 -3
  26. package/dist/server/services/release-action.js.map +1 -1
  27. package/dist/server/services/release-action.mjs +60 -4
  28. package/dist/server/services/release-action.mjs.map +1 -1
  29. package/dist/server/services/release.js +110 -10
  30. package/dist/server/services/release.js.map +1 -1
  31. package/dist/server/services/release.mjs +111 -11
  32. package/dist/server/services/release.mjs.map +1 -1
  33. package/dist/server/services/scheduling.js +7 -2
  34. package/dist/server/services/scheduling.js.map +1 -1
  35. package/dist/server/services/scheduling.mjs +7 -2
  36. package/dist/server/services/scheduling.mjs.map +1 -1
  37. package/dist/server/services/settings.js +29 -1
  38. package/dist/server/services/settings.js.map +1 -1
  39. package/dist/server/services/settings.mjs +29 -1
  40. package/dist/server/services/settings.mjs.map +1 -1
  41. package/dist/server/src/audit-logs.d.ts +99 -0
  42. package/dist/server/src/audit-logs.d.ts.map +1 -0
  43. package/dist/server/src/bootstrap.d.ts.map +1 -1
  44. package/dist/server/src/constants.d.ts +20 -0
  45. package/dist/server/src/constants.d.ts.map +1 -1
  46. package/dist/server/src/controllers/release.d.ts.map +1 -1
  47. package/dist/server/src/index.d.ts +8 -1
  48. package/dist/server/src/index.d.ts.map +1 -1
  49. package/dist/server/src/services/index.d.ts +8 -1
  50. package/dist/server/src/services/index.d.ts.map +1 -1
  51. package/dist/server/src/services/release-action.d.ts.map +1 -1
  52. package/dist/server/src/services/release.d.ts +8 -1
  53. package/dist/server/src/services/release.d.ts.map +1 -1
  54. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  55. package/dist/server/src/services/settings.d.ts.map +1 -1
  56. package/package.json +7 -7
@@ -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":";;;;;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,WAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAMS,QAAQ,MAAMV,kBAAAA,CAAmBa,aAAa,CAACd,IAAIW,KAAK,CAAA;AAE9D,QAAA,MAAMI,oCAAAA,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,OAAOC,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,WAAW,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,iBAAAA,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,WAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;QACtD,MAAMwD,oBAAAA,GAAuB7C,WAAW,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,MAAAA,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,MAAAA,CAAO0C,eAAe,CAAC,mCAAA,CAAA;AACnC,QAAA;QAEA,MAAMtD,cAAAA,GAAiBC,WAAW,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,eAAAA,CAAgBF,WAAAA,CAAAA;QAEtB,MAAMlE,cAAAA,GAAiBC,WAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,OAAAA,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,OAAAA;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,eAAAA,CAAgBF,WAAAA,CAAAA;QAEtB,MAAMlE,cAAAA,GAAiBC,WAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACtD,QAAA,MAAM+C,UAAU,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,OAAAA;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,WAAW,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,WAAW,SAAA,EAAW;AAAEX,YAAAA;AAAO,SAAA,CAAA;QACtD,MAAMwD,oBAAAA,GAAuB7C,WAAW,gBAAA,EAAkB;AAAEX,YAAAA;AAAO,SAAA,CAAA;AACnE,QAAA,MAAM+C,OAAAA,GAAU,MAAMrC,cAAAA,CAAeyE,OAAO,CAACvC,EAAAA,CAAAA;AAE7C,QAAA,MAAM,CAACwC,mBAAAA,EAAqBC,qBAAAA,CAAsB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AACrE/B,YAAAA,oBAAAA,CAAqBC,YAAY,CAAC;gBAChClB,OAAAA,EAAS;oBACPQ,OAAAA,EAASH,EAAAA;oBACT4C,IAAAA,EAAM;AACR;AACF,aAAA,CAAA;AACAhC,YAAAA,oBAAAA,CAAqBC,YAAY,CAAC;gBAChClB,OAAAA,EAAS;oBACPQ,OAAAA,EAASH,EAAAA;oBACT4C,IAAAA,EAAM;AACR;AACF,aAAA;AACD,SAAA,CAAA;AAED1F,QAAAA,GAAAA,CAAI0C,IAAI,GAAG;YACTC,IAAAA,EAAMM,OAAAA;YACNK,IAAAA,EAAM;AACJqC,gBAAAA,YAAAA,EAAcL,mBAAAA,GAAsBC,qBAAAA;gBACpCK,qBAAAA,EAAuBN,mBAAAA;gBACvBO,uBAAAA,EAAyBN;AAC3B;AACF,SAAA;AACF,IAAA;AACF;;;;"}
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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"}
@@ -1,6 +1,7 @@
1
1
  import { async, errors } from '@strapi/utils';
2
2
  import _ from 'lodash/fp';
3
- import { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants.mjs';
3
+ import { RELEASE_ACTION_MODEL_UID, AUDITED_EVENTS, RELEASE_MODEL_UID } from '../constants.mjs';
4
+ import { emitAuditOnCommit } from '../audit-logs.mjs';
4
5
  import { getDraftEntryValidStatus, getService, getEntry, getEntryStatus } from '../utils/index.mjs';
5
6
 
6
7
  const getGroupName = (queryValue)=>{
@@ -104,6 +105,17 @@ const createReleaseActionService = ({ strapi })=>{
104
105
  strapi
105
106
  }).updateReleaseStatus(release.id);
106
107
  }
108
+ await emitAuditOnCommit({
109
+ strapi
110
+ }, AUDITED_EVENTS.RELEASE_ENTRY_ADD, {
111
+ releaseId: release.id,
112
+ name: release.name,
113
+ actionId: releaseAction.id,
114
+ type: releaseAction.type,
115
+ contentType: releaseAction.contentType,
116
+ entryDocumentId: releaseAction.entryDocumentId,
117
+ locale: releaseAction.locale
118
+ });
107
119
  return releaseAction;
108
120
  },
109
121
  async findPage (releaseId, query) {
@@ -212,6 +224,14 @@ const createReleaseActionService = ({ strapi })=>{
212
224
  $null: true
213
225
  }
214
226
  }
227
+ },
228
+ populate: {
229
+ release: {
230
+ select: [
231
+ 'id',
232
+ 'name'
233
+ ]
234
+ }
215
235
  }
216
236
  });
217
237
  if (!action) {
@@ -234,18 +254,34 @@ const createReleaseActionService = ({ strapi })=>{
234
254
  }
235
255
  }
236
256
  },
257
+ // Only the field the PUT contract allows. Changing the entry is remove + add.
237
258
  data: {
238
- ...update,
259
+ type: update.type,
239
260
  isEntryValid: actionStatus
240
261
  }
241
262
  });
242
263
  getService('release', {
243
264
  strapi
244
265
  }).updateReleaseStatus(releaseId);
266
+ // isEntryValid is recalculated, not edited: only the type change is audited
267
+ if (updatedAction && action.type !== updatedAction.type) {
268
+ await emitAuditOnCommit({
269
+ strapi
270
+ }, AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {
271
+ releaseId: action.release?.id ?? Number(releaseId),
272
+ name: action.release?.name,
273
+ actionId: updatedAction.id,
274
+ contentType: updatedAction.contentType,
275
+ entryDocumentId: updatedAction.entryDocumentId,
276
+ locale: updatedAction.locale,
277
+ from: action.type,
278
+ to: updatedAction.type
279
+ });
280
+ }
245
281
  return updatedAction;
246
282
  },
247
283
  async delete (actionId, releaseId) {
248
- const deletedAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).delete({
284
+ const deletedRow = await strapi.db.query(RELEASE_ACTION_MODEL_UID).delete({
249
285
  where: {
250
286
  id: actionId,
251
287
  release: {
@@ -254,14 +290,34 @@ const createReleaseActionService = ({ strapi })=>{
254
290
  $null: true
255
291
  }
256
292
  }
293
+ },
294
+ populate: {
295
+ release: {
296
+ select: [
297
+ 'id',
298
+ 'name'
299
+ ]
300
+ }
257
301
  }
258
302
  });
259
- if (!deletedAction) {
303
+ if (!deletedRow) {
260
304
  throw new errors.NotFoundError(`Action with id ${actionId} not found in release with id ${releaseId} or it is already published`);
261
305
  }
306
+ const { release: populatedRelease, ...deletedAction } = deletedRow;
262
307
  getService('release', {
263
308
  strapi
264
309
  }).updateReleaseStatus(releaseId);
310
+ await emitAuditOnCommit({
311
+ strapi
312
+ }, AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {
313
+ releaseId: populatedRelease?.id ?? Number(releaseId),
314
+ name: populatedRelease?.name,
315
+ actionId: deletedAction.id,
316
+ type: deletedAction.type,
317
+ contentType: deletedAction.contentType,
318
+ entryDocumentId: deletedAction.entryDocumentId,
319
+ locale: deletedAction.locale
320
+ });
265
321
  return deletedAction;
266
322
  },
267
323
  async validateActionsByContentTypes (contentTypeUids) {