@strapi/content-releases 5.57.0 → 5.59.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 (40) hide show
  1. package/dist/admin/components/RelativeTime.js +2 -1
  2. package/dist/admin/components/RelativeTime.js.map +1 -1
  3. package/dist/admin/components/RelativeTime.mjs +2 -1
  4. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  5. package/dist/admin/pages/ReleasesPage.js +2 -1
  6. package/dist/admin/pages/ReleasesPage.js.map +1 -1
  7. package/dist/admin/pages/ReleasesPage.mjs +2 -1
  8. package/dist/admin/pages/ReleasesPage.mjs.map +1 -1
  9. package/dist/server/bootstrap.js +19 -21
  10. package/dist/server/bootstrap.js.map +1 -1
  11. package/dist/server/bootstrap.mjs +20 -22
  12. package/dist/server/bootstrap.mjs.map +1 -1
  13. package/dist/server/entitlements.js +21 -0
  14. package/dist/server/entitlements.js.map +1 -0
  15. package/dist/server/entitlements.mjs +19 -0
  16. package/dist/server/entitlements.mjs.map +1 -0
  17. package/dist/server/middlewares/documents.js +32 -15
  18. package/dist/server/middlewares/documents.js.map +1 -1
  19. package/dist/server/middlewares/documents.mjs +33 -16
  20. package/dist/server/middlewares/documents.mjs.map +1 -1
  21. package/dist/server/migrations/index.js +1 -1
  22. package/dist/server/migrations/index.js.map +1 -1
  23. package/dist/server/migrations/index.mjs +1 -1
  24. package/dist/server/migrations/index.mjs.map +1 -1
  25. package/dist/server/register.js +2 -0
  26. package/dist/server/register.js.map +1 -1
  27. package/dist/server/register.mjs +2 -0
  28. package/dist/server/register.mjs.map +1 -1
  29. package/dist/server/src/bootstrap.d.ts.map +1 -1
  30. package/dist/server/src/entitlements.d.ts +8 -0
  31. package/dist/server/src/entitlements.d.ts.map +1 -0
  32. package/dist/server/src/middlewares/documents.d.ts.map +1 -1
  33. package/dist/server/src/register.d.ts.map +1 -1
  34. package/dist/server/src/utils/index.d.ts +10 -0
  35. package/dist/server/src/utils/index.d.ts.map +1 -1
  36. package/dist/server/utils/index.js +23 -0
  37. package/dist/server/utils/index.js.map +1 -1
  38. package/dist/server/utils/index.mjs +23 -1
  39. package/dist/server/utils/index.mjs.map +1 -1
  40. package/package.json +7 -7
@@ -1,9 +1,9 @@
1
1
  import { ALLOWED_WEBHOOK_EVENTS, RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from './constants.mjs';
2
2
  import { registerAuditEvents } from './audit-logs.mjs';
3
- import { getService } from './utils/index.mjs';
3
+ import { getService, updateAffectedReleaseStatuses } from './utils/index.mjs';
4
4
  import { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents.mjs';
5
5
 
6
- const deleteReleasesActionsAndUpdateReleaseStatus = async (params)=>{
6
+ const deleteReleasesActionsAndUpdateReleaseStatus = async (params, strapi)=>{
7
7
  const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({
8
8
  where: {
9
9
  actions: params
@@ -13,57 +13,55 @@ const deleteReleasesActionsAndUpdateReleaseStatus = async (params)=>{
13
13
  where: params
14
14
  });
15
15
  // We update the status of each release after delete the actions
16
- for (const release of releases){
17
- getService('release', {
18
- strapi
19
- }).updateReleaseStatus(release.id);
20
- }
16
+ await updateAffectedReleaseStatuses(releases, {
17
+ strapi
18
+ });
21
19
  };
22
- const bootstrap = async ({ strapi: strapi1 })=>{
23
- if (strapi1.ee.features.isEnabled('cms-content-releases')) {
24
- const contentTypesWithDraftAndPublish = Object.keys(strapi1.contentTypes).filter((uid)=>strapi1.contentTypes[uid]?.options?.draftAndPublish);
25
- strapi1.db.lifecycles.subscribe({
20
+ const bootstrap = async ({ strapi })=>{
21
+ if (strapi.ee.features.isEnabled('cms-content-releases')) {
22
+ const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter((uid)=>strapi.contentTypes[uid]?.options?.draftAndPublish);
23
+ strapi.db.lifecycles.subscribe({
26
24
  models: contentTypesWithDraftAndPublish,
27
25
  /**
28
26
  * deleteMany is still used outside documents service, for example when deleting a locale
29
27
  */ async afterDeleteMany (event) {
30
28
  try {
31
- const model = strapi1.getModel(event.model.uid);
29
+ const model = strapi.getModel(event.model.uid);
32
30
  // @ts-expect-error TODO: lifecycles types looks like are not 100% finished
33
31
  if (model.kind === 'collectionType' && model.options?.draftAndPublish) {
34
32
  const { where } = event.params;
35
- deleteReleasesActionsAndUpdateReleaseStatus({
33
+ await deleteReleasesActionsAndUpdateReleaseStatus({
36
34
  contentType: model.uid,
37
35
  locale: where?.locale ?? null,
38
36
  ...where?.documentId && {
39
37
  entryDocumentId: where.documentId
40
38
  }
41
- });
39
+ }, strapi);
42
40
  }
43
41
  } catch (error) {
44
42
  // If an error happens we don't want to block the delete entry flow, but we log the error
45
- strapi1.log.error('Error while deleting release actions after entry deleteMany', {
43
+ strapi.log.error('Error while deleting release actions after entry deleteMany', {
46
44
  error
47
45
  });
48
46
  }
49
47
  }
50
48
  });
51
49
  // We register middleware to handle ReleaseActions when changes on documents are made
52
- strapi1.documents.use(deleteActionsOnDelete);
53
- strapi1.documents.use(updateActionsOnUpdate);
50
+ strapi.documents.use(deleteActionsOnDelete);
51
+ strapi.documents.use(updateActionsOnUpdate);
54
52
  getService('scheduling', {
55
- strapi: strapi1
53
+ strapi
56
54
  }).syncFromDatabase().catch((err)=>{
57
- strapi1.log.error('Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.');
55
+ strapi.log.error('Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.');
58
56
  throw err;
59
57
  });
60
58
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value])=>{
61
- strapi1.get('webhookStore').addAllowedEvent(key, value);
59
+ strapi.get('webhookStore').addAllowedEvent(key, value);
62
60
  });
63
61
  // Absent in CE, without the audit-logs license, or when disabled by config;
64
62
  // get() throws for services that were never added, so probe first.
65
- if (strapi1.has('audit-logs-lifecycle')) {
66
- registerAuditEvents(strapi1.get('audit-logs-lifecycle'));
63
+ if (strapi.has('audit-logs-lifecycle')) {
64
+ registerAuditEvents(strapi.get('audit-logs-lifecycle'));
67
65
  }
68
66
  }
69
67
  };
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (params: DeleteManyParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n deleteReleasesActionsAndUpdateReleaseStatus({\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n });\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","release","getService","updateReleaseStatus","id","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent","has","registerAuditEvents"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport type { Core, UID, Modules } from '@strapi/types';\n\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID, ALLOWED_WEBHOOK_EVENTS } from './constants';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService, updateAffectedReleaseStatuses } from './utils';\nimport { deleteActionsOnDelete, updateActionsOnUpdate } from './middlewares/documents';\n\ninterface DeleteManyParams {\n contentType: UID.ContentType;\n locale: string | null;\n entryDocumentId?: Modules.Documents.ID;\n}\n\nconst deleteReleasesActionsAndUpdateReleaseStatus = async (\n params: DeleteManyParams,\n strapi: Core.Strapi\n) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n // We update the status of each release after delete the actions\n await updateAffectedReleaseStatuses(releases, { strapi });\n};\n\nexport const bootstrap = async ({ strapi }: { strapi: Core.Strapi }) => {\n if (strapi.ee.features.isEnabled('cms-content-releases')) {\n const contentTypesWithDraftAndPublish = Object.keys(strapi.contentTypes).filter(\n (uid: any) => strapi.contentTypes[uid]?.options?.draftAndPublish\n );\n\n strapi.db.lifecycles.subscribe({\n models: contentTypesWithDraftAndPublish,\n\n /**\n * deleteMany is still used outside documents service, for example when deleting a locale\n */\n async afterDeleteMany(event) {\n try {\n const model = strapi.getModel(event.model.uid as UID.Schema);\n // @ts-expect-error TODO: lifecycles types looks like are not 100% finished\n if (model.kind === 'collectionType' && model.options?.draftAndPublish) {\n const { where } = event.params;\n\n await deleteReleasesActionsAndUpdateReleaseStatus(\n {\n contentType: model.uid,\n locale: where?.locale ?? null,\n ...(where?.documentId && { entryDocumentId: where.documentId }),\n },\n strapi\n );\n }\n } catch (error) {\n // If an error happens we don't want to block the delete entry flow, but we log the error\n strapi.log.error('Error while deleting release actions after entry deleteMany', {\n error,\n });\n }\n },\n });\n\n // We register middleware to handle ReleaseActions when changes on documents are made\n strapi.documents.use(deleteActionsOnDelete);\n strapi.documents.use(updateActionsOnUpdate);\n\n getService('scheduling', { strapi })\n .syncFromDatabase()\n .catch((err: Error) => {\n strapi.log.error(\n 'Error while syncing scheduled jobs from the database in the content-releases plugin. This could lead to errors in the releases scheduling.'\n );\n\n throw err;\n });\n\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n strapi.get('webhookStore').addAllowedEvent(key, value);\n });\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n }\n};\n"],"names":["deleteReleasesActionsAndUpdateReleaseStatus","params","strapi","releases","db","query","RELEASE_MODEL_UID","findMany","where","actions","RELEASE_ACTION_MODEL_UID","deleteMany","updateAffectedReleaseStatuses","bootstrap","ee","features","isEnabled","contentTypesWithDraftAndPublish","Object","keys","contentTypes","filter","uid","options","draftAndPublish","lifecycles","subscribe","models","afterDeleteMany","event","model","getModel","kind","contentType","locale","documentId","entryDocumentId","error","log","documents","use","deleteActionsOnDelete","updateActionsOnUpdate","getService","syncFromDatabase","catch","err","entries","ALLOWED_WEBHOOK_EVENTS","forEach","key","value","get","addAllowedEvent","has","registerAuditEvents"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Exposes the pending-release cap to the Plan card and the debug dump, defaulting the same way
5
+ * `validatePendingReleasesLimit` does. Registered whatever the boot-time license says, so a
6
+ * lapsed or later-renewed license still resolves.
7
+ */ const registerReleasesEntitlements = (strapi)=>{
8
+ strapi.ee.entitlements.register({
9
+ feature: 'cms-content-releases',
10
+ limits: [
11
+ {
12
+ key: 'maximumReleases',
13
+ unit: 'count',
14
+ get: (feature)=>(typeof feature === 'object' ? feature.options?.maximumReleases : undefined) || 3
15
+ }
16
+ ]
17
+ });
18
+ };
19
+
20
+ exports.registerReleasesEntitlements = registerReleasesEntitlements;
21
+ //# sourceMappingURL=entitlements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.js","sources":["../../server/src/entitlements.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * Exposes the pending-release cap to the Plan card and the debug dump, defaulting the same way\n * `validatePendingReleasesLimit` does. Registered whatever the boot-time license says, so a\n * lapsed or later-renewed license still resolves.\n */\nexport const registerReleasesEntitlements = (strapi: Core.Strapi) => {\n strapi.ee.entitlements.register({\n feature: 'cms-content-releases',\n limits: [\n {\n key: 'maximumReleases',\n unit: 'count',\n get: (feature) =>\n (typeof feature === 'object' ? feature.options?.maximumReleases : undefined) || 3,\n },\n ],\n });\n};\n"],"names":["registerReleasesEntitlements","strapi","ee","entitlements","register","feature","limits","key","unit","get","options","maximumReleases","undefined"],"mappings":";;AAEA;;;;IAKO,MAAMA,4BAAAA,GAA+B,CAACC,MAAAA,GAAAA;AAC3CA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,QAAQ,CAAC;QAC9BC,OAAAA,EAAS,sBAAA;QACTC,MAAAA,EAAQ;AACN,YAAA;gBACEC,GAAAA,EAAK,iBAAA;gBACLC,IAAAA,EAAM,OAAA;AACNC,gBAAAA,GAAAA,EAAK,CAACJ,OAAAA,GACJ,CAAC,OAAOA,OAAAA,KAAY,QAAA,GAAWA,OAAAA,CAAQK,OAAO,EAAEC,eAAAA,GAAkBC,SAAQ,KAAM;AACpF;AACD;AACH,KAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Exposes the pending-release cap to the Plan card and the debug dump, defaulting the same way
3
+ * `validatePendingReleasesLimit` does. Registered whatever the boot-time license says, so a
4
+ * lapsed or later-renewed license still resolves.
5
+ */ const registerReleasesEntitlements = (strapi)=>{
6
+ strapi.ee.entitlements.register({
7
+ feature: 'cms-content-releases',
8
+ limits: [
9
+ {
10
+ key: 'maximumReleases',
11
+ unit: 'count',
12
+ get: (feature)=>(typeof feature === 'object' ? feature.options?.maximumReleases : undefined) || 3
13
+ }
14
+ ]
15
+ });
16
+ };
17
+
18
+ export { registerReleasesEntitlements };
19
+ //# sourceMappingURL=entitlements.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.mjs","sources":["../../server/src/entitlements.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\n/**\n * Exposes the pending-release cap to the Plan card and the debug dump, defaulting the same way\n * `validatePendingReleasesLimit` does. Registered whatever the boot-time license says, so a\n * lapsed or later-renewed license still resolves.\n */\nexport const registerReleasesEntitlements = (strapi: Core.Strapi) => {\n strapi.ee.entitlements.register({\n feature: 'cms-content-releases',\n limits: [\n {\n key: 'maximumReleases',\n unit: 'count',\n get: (feature) =>\n (typeof feature === 'object' ? feature.options?.maximumReleases : undefined) || 3,\n },\n ],\n });\n};\n"],"names":["registerReleasesEntitlements","strapi","ee","entitlements","register","feature","limits","key","unit","get","options","maximumReleases","undefined"],"mappings":"AAEA;;;;IAKO,MAAMA,4BAAAA,GAA+B,CAACC,MAAAA,GAAAA;AAC3CA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,QAAQ,CAAC;QAC9BC,OAAAA,EAAS,sBAAA;QACTC,MAAAA,EAAQ;AACN,YAAA;gBACEC,GAAAA,EAAK,iBAAA;gBACLC,IAAAA,EAAM,OAAA;AACNC,gBAAAA,GAAAA,EAAK,CAACJ,OAAAA,GACJ,CAAC,OAAOA,OAAAA,KAAY,QAAA,GAAWA,OAAAA,CAAQK,OAAO,EAAEC,eAAAA,GAAkBC,SAAQ,KAAM;AACpF;AACD;AACH,KAAA,CAAA;AACF;;;;"}
@@ -4,6 +4,29 @@ var utils = require('@strapi/utils');
4
4
  var constants = require('../constants.js');
5
5
  var index = require('../utils/index.js');
6
6
 
7
+ /**
8
+ * The locales a document delete removed, as a filter on release actions. Resolved the way the
9
+ * document service resolves the `locale` param of a delete.
10
+ */ const getDeletedLocalesFilter = async (contentType, locale)=>{
11
+ if (!strapi.localization.isLocalizedContentType(contentType) || locale === '*') {
12
+ return {};
13
+ }
14
+ if (Array.isArray(locale)) {
15
+ return {
16
+ locale: {
17
+ $in: locale
18
+ }
19
+ };
20
+ }
21
+ if (typeof locale === 'string' && locale !== '') {
22
+ return {
23
+ locale
24
+ };
25
+ }
26
+ return {
27
+ locale: await strapi.localization.getDefaultLocale()
28
+ };
29
+ };
7
30
  const updateActionsStatusAndUpdateReleaseStatus = async (contentType, entry)=>{
8
31
  const releases = await strapi.db.query(constants.RELEASE_MODEL_UID).findMany({
9
32
  where: {
@@ -28,11 +51,9 @@ const updateActionsStatusAndUpdateReleaseStatus = async (contentType, entry)=>{
28
51
  isEntryValid: entryStatus
29
52
  }
30
53
  });
31
- for (const release of releases){
32
- index.getService('release', {
33
- strapi
34
- }).updateReleaseStatus(release.id);
35
- }
54
+ await index.updateAffectedReleaseStatuses(releases, {
55
+ strapi
56
+ });
36
57
  };
37
58
  const deleteActionsAndUpdateReleaseStatus = async (params)=>{
38
59
  const releases = await strapi.db.query(constants.RELEASE_MODEL_UID).findMany({
@@ -43,11 +64,9 @@ const deleteActionsAndUpdateReleaseStatus = async (params)=>{
43
64
  await strapi.db.query(constants.RELEASE_ACTION_MODEL_UID).deleteMany({
44
65
  where: params
45
66
  });
46
- for (const release of releases){
47
- index.getService('release', {
48
- strapi
49
- }).updateReleaseStatus(release.id);
50
- }
67
+ await index.updateAffectedReleaseStatuses(releases, {
68
+ strapi
69
+ });
51
70
  };
52
71
  const deleteActionsOnDelete = async (ctx, next)=>{
53
72
  if (ctx.action !== 'delete') {
@@ -63,12 +82,10 @@ const deleteActionsOnDelete = async (ctx, next)=>{
63
82
  return result;
64
83
  }
65
84
  try {
66
- deleteActionsAndUpdateReleaseStatus({
85
+ await deleteActionsAndUpdateReleaseStatus({
67
86
  contentType,
68
87
  entryDocumentId: documentId,
69
- ...locale !== '*' && {
70
- locale
71
- }
88
+ ...await getDeletedLocalesFilter(ctx.contentType, locale)
72
89
  });
73
90
  } catch (error) {
74
91
  strapi.log.error('Error while deleting release actions after delete', {
@@ -90,7 +107,7 @@ const updateActionsOnUpdate = async (ctx, next)=>{
90
107
  return result;
91
108
  }
92
109
  try {
93
- updateActionsStatusAndUpdateReleaseStatus(contentType, result);
110
+ await updateActionsStatusAndUpdateReleaseStatus(contentType, result);
94
111
  } catch (error) {
95
112
  strapi.log.error('Error while updating release actions after update', {
96
113
  error
@@ -1 +1 @@
1
- {"version":3,"file":"documents.js","sources":["../../../server/src/middlewares/documents.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport { RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { getService, isEntryValid } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\ninterface ReleaseActionsParams {\n contentType: UID.ContentType;\n entryDocumentId?: Modules.Documents.ID;\n locale?: string;\n}\n\nconst updateActionsStatusAndUpdateReleaseStatus = async (\n contentType: UID.ContentType,\n entry: Modules.Documents.AnyDocument\n) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n },\n });\n\n const entryStatus = await isEntryValid(contentType, entry, { strapi });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).updateMany({\n where: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n data: {\n isEntryValid: entryStatus,\n },\n });\n\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nconst deleteActionsAndUpdateReleaseStatus = async (params: ReleaseActionsParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nconst deleteActionsOnDelete: Middleware = async (ctx, next) => {\n if (ctx.action !== 'delete') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n const { documentId, locale } = ctx.params;\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n try {\n deleteActionsAndUpdateReleaseStatus({\n contentType,\n entryDocumentId: documentId,\n ...(locale !== '*' && { locale }),\n });\n } catch (error) {\n strapi.log.error('Error while deleting release actions after delete', {\n error,\n });\n }\n\n return result;\n};\n\nconst updateActionsOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n\n const result = (await next()) as Modules.Documents.AnyDocument;\n\n if (!result) {\n return result;\n }\n\n try {\n updateActionsStatusAndUpdateReleaseStatus(contentType, result);\n } catch (error) {\n strapi.log.error('Error while updating release actions after update', {\n error,\n });\n }\n\n return result;\n};\n\nexport { deleteActionsOnDelete, updateActionsOnUpdate };\n"],"names":["updateActionsStatusAndUpdateReleaseStatus","contentType","entry","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","releasedAt","actions","entryDocumentId","documentId","locale","entryStatus","isEntryValid","RELEASE_ACTION_MODEL_UID","updateMany","data","release","getService","updateReleaseStatus","id","deleteActionsAndUpdateReleaseStatus","params","deleteMany","deleteActionsOnDelete","ctx","next","action","contentTypes","hasDraftAndPublish","uid","result","error","log","updateActionsOnUpdate"],"mappings":"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"}
1
+ {"version":3,"file":"documents.js","sources":["../../../server/src/middlewares/documents.ts"],"sourcesContent":["import type { Modules, Schema, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport { RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { isEntryValid, updateAffectedReleaseStatuses } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\ntype LocaleFilter = { locale?: string | null | { $in: string[] } };\n\ninterface ReleaseActionsParams extends LocaleFilter {\n contentType: UID.ContentType;\n entryDocumentId?: Modules.Documents.ID;\n}\n\n/**\n * The locales a document delete removed, as a filter on release actions. Resolved the way the\n * document service resolves the `locale` param of a delete.\n */\nconst getDeletedLocalesFilter = async (\n contentType: Schema.ContentType,\n locale: unknown\n): Promise<LocaleFilter> => {\n if (!strapi.localization.isLocalizedContentType(contentType) || locale === '*') {\n return {};\n }\n\n if (Array.isArray(locale)) {\n return { locale: { $in: locale } };\n }\n\n if (typeof locale === 'string' && locale !== '') {\n return { locale };\n }\n\n return { locale: await strapi.localization.getDefaultLocale() };\n};\n\nconst updateActionsStatusAndUpdateReleaseStatus = async (\n contentType: UID.ContentType,\n entry: Modules.Documents.AnyDocument\n) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n },\n });\n\n const entryStatus = await isEntryValid(contentType, entry, { strapi });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).updateMany({\n where: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n data: {\n isEntryValid: entryStatus,\n },\n });\n\n await updateAffectedReleaseStatuses(releases, { strapi });\n};\n\nconst deleteActionsAndUpdateReleaseStatus = async (params: ReleaseActionsParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n await updateAffectedReleaseStatuses(releases, { strapi });\n};\n\nconst deleteActionsOnDelete: Middleware = async (ctx, next) => {\n if (ctx.action !== 'delete') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n const { documentId, locale } = ctx.params;\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n try {\n await deleteActionsAndUpdateReleaseStatus({\n contentType,\n entryDocumentId: documentId,\n ...(await getDeletedLocalesFilter(ctx.contentType, locale)),\n });\n } catch (error) {\n strapi.log.error('Error while deleting release actions after delete', {\n error,\n });\n }\n\n return result;\n};\n\nconst updateActionsOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n\n const result = (await next()) as Modules.Documents.AnyDocument;\n\n if (!result) {\n return result;\n }\n\n try {\n await updateActionsStatusAndUpdateReleaseStatus(contentType, result);\n } catch (error) {\n strapi.log.error('Error while updating release actions after update', {\n error,\n });\n }\n\n return result;\n};\n\nexport { deleteActionsOnDelete, updateActionsOnUpdate };\n"],"names":["getDeletedLocalesFilter","contentType","locale","strapi","localization","isLocalizedContentType","Array","isArray","$in","getDefaultLocale","updateActionsStatusAndUpdateReleaseStatus","entry","releases","db","query","RELEASE_MODEL_UID","findMany","where","releasedAt","actions","entryDocumentId","documentId","entryStatus","isEntryValid","RELEASE_ACTION_MODEL_UID","updateMany","data","updateAffectedReleaseStatuses","deleteActionsAndUpdateReleaseStatus","params","deleteMany","deleteActionsOnDelete","ctx","next","action","contentTypes","hasDraftAndPublish","uid","result","error","log","updateActionsOnUpdate"],"mappings":"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"}
@@ -1,7 +1,30 @@
1
1
  import { contentTypes } from '@strapi/utils';
2
2
  import { RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from '../constants.mjs';
3
- import { getService, isEntryValid } from '../utils/index.mjs';
3
+ import { updateAffectedReleaseStatuses, isEntryValid } from '../utils/index.mjs';
4
4
 
5
+ /**
6
+ * The locales a document delete removed, as a filter on release actions. Resolved the way the
7
+ * document service resolves the `locale` param of a delete.
8
+ */ const getDeletedLocalesFilter = async (contentType, locale)=>{
9
+ if (!strapi.localization.isLocalizedContentType(contentType) || locale === '*') {
10
+ return {};
11
+ }
12
+ if (Array.isArray(locale)) {
13
+ return {
14
+ locale: {
15
+ $in: locale
16
+ }
17
+ };
18
+ }
19
+ if (typeof locale === 'string' && locale !== '') {
20
+ return {
21
+ locale
22
+ };
23
+ }
24
+ return {
25
+ locale: await strapi.localization.getDefaultLocale()
26
+ };
27
+ };
5
28
  const updateActionsStatusAndUpdateReleaseStatus = async (contentType, entry)=>{
6
29
  const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({
7
30
  where: {
@@ -26,11 +49,9 @@ const updateActionsStatusAndUpdateReleaseStatus = async (contentType, entry)=>{
26
49
  isEntryValid: entryStatus
27
50
  }
28
51
  });
29
- for (const release of releases){
30
- getService('release', {
31
- strapi
32
- }).updateReleaseStatus(release.id);
33
- }
52
+ await updateAffectedReleaseStatuses(releases, {
53
+ strapi
54
+ });
34
55
  };
35
56
  const deleteActionsAndUpdateReleaseStatus = async (params)=>{
36
57
  const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({
@@ -41,11 +62,9 @@ const deleteActionsAndUpdateReleaseStatus = async (params)=>{
41
62
  await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({
42
63
  where: params
43
64
  });
44
- for (const release of releases){
45
- getService('release', {
46
- strapi
47
- }).updateReleaseStatus(release.id);
48
- }
65
+ await updateAffectedReleaseStatuses(releases, {
66
+ strapi
67
+ });
49
68
  };
50
69
  const deleteActionsOnDelete = async (ctx, next)=>{
51
70
  if (ctx.action !== 'delete') {
@@ -61,12 +80,10 @@ const deleteActionsOnDelete = async (ctx, next)=>{
61
80
  return result;
62
81
  }
63
82
  try {
64
- deleteActionsAndUpdateReleaseStatus({
83
+ await deleteActionsAndUpdateReleaseStatus({
65
84
  contentType,
66
85
  entryDocumentId: documentId,
67
- ...locale !== '*' && {
68
- locale
69
- }
86
+ ...await getDeletedLocalesFilter(ctx.contentType, locale)
70
87
  });
71
88
  } catch (error) {
72
89
  strapi.log.error('Error while deleting release actions after delete', {
@@ -88,7 +105,7 @@ const updateActionsOnUpdate = async (ctx, next)=>{
88
105
  return result;
89
106
  }
90
107
  try {
91
- updateActionsStatusAndUpdateReleaseStatus(contentType, result);
108
+ await updateActionsStatusAndUpdateReleaseStatus(contentType, result);
92
109
  } catch (error) {
93
110
  strapi.log.error('Error while updating release actions after update', {
94
111
  error
@@ -1 +1 @@
1
- {"version":3,"file":"documents.mjs","sources":["../../../server/src/middlewares/documents.ts"],"sourcesContent":["import type { Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport { RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { getService, isEntryValid } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\ninterface ReleaseActionsParams {\n contentType: UID.ContentType;\n entryDocumentId?: Modules.Documents.ID;\n locale?: string;\n}\n\nconst updateActionsStatusAndUpdateReleaseStatus = async (\n contentType: UID.ContentType,\n entry: Modules.Documents.AnyDocument\n) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n },\n });\n\n const entryStatus = await isEntryValid(contentType, entry, { strapi });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).updateMany({\n where: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n data: {\n isEntryValid: entryStatus,\n },\n });\n\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nconst deleteActionsAndUpdateReleaseStatus = async (params: ReleaseActionsParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n for (const release of releases) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n};\n\nconst deleteActionsOnDelete: Middleware = async (ctx, next) => {\n if (ctx.action !== 'delete') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n const { documentId, locale } = ctx.params;\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n try {\n deleteActionsAndUpdateReleaseStatus({\n contentType,\n entryDocumentId: documentId,\n ...(locale !== '*' && { locale }),\n });\n } catch (error) {\n strapi.log.error('Error while deleting release actions after delete', {\n error,\n });\n }\n\n return result;\n};\n\nconst updateActionsOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n\n const result = (await next()) as Modules.Documents.AnyDocument;\n\n if (!result) {\n return result;\n }\n\n try {\n updateActionsStatusAndUpdateReleaseStatus(contentType, result);\n } catch (error) {\n strapi.log.error('Error while updating release actions after update', {\n error,\n });\n }\n\n return result;\n};\n\nexport { deleteActionsOnDelete, updateActionsOnUpdate };\n"],"names":["updateActionsStatusAndUpdateReleaseStatus","contentType","entry","releases","strapi","db","query","RELEASE_MODEL_UID","findMany","where","releasedAt","actions","entryDocumentId","documentId","locale","entryStatus","isEntryValid","RELEASE_ACTION_MODEL_UID","updateMany","data","release","getService","updateReleaseStatus","id","deleteActionsAndUpdateReleaseStatus","params","deleteMany","deleteActionsOnDelete","ctx","next","action","contentTypes","hasDraftAndPublish","uid","result","error","log","updateActionsOnUpdate"],"mappings":"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"}
1
+ {"version":3,"file":"documents.mjs","sources":["../../../server/src/middlewares/documents.ts"],"sourcesContent":["import type { Modules, Schema, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\nimport { RELEASE_MODEL_UID, RELEASE_ACTION_MODEL_UID } from '../constants';\nimport { isEntryValid, updateAffectedReleaseStatuses } from '../utils';\n\ntype Middleware = Modules.Documents.Middleware.Middleware;\n\ntype LocaleFilter = { locale?: string | null | { $in: string[] } };\n\ninterface ReleaseActionsParams extends LocaleFilter {\n contentType: UID.ContentType;\n entryDocumentId?: Modules.Documents.ID;\n}\n\n/**\n * The locales a document delete removed, as a filter on release actions. Resolved the way the\n * document service resolves the `locale` param of a delete.\n */\nconst getDeletedLocalesFilter = async (\n contentType: Schema.ContentType,\n locale: unknown\n): Promise<LocaleFilter> => {\n if (!strapi.localization.isLocalizedContentType(contentType) || locale === '*') {\n return {};\n }\n\n if (Array.isArray(locale)) {\n return { locale: { $in: locale } };\n }\n\n if (typeof locale === 'string' && locale !== '') {\n return { locale };\n }\n\n return { locale: await strapi.localization.getDefaultLocale() };\n};\n\nconst updateActionsStatusAndUpdateReleaseStatus = async (\n contentType: UID.ContentType,\n entry: Modules.Documents.AnyDocument\n) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n releasedAt: null,\n actions: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n },\n });\n\n const entryStatus = await isEntryValid(contentType, entry, { strapi });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).updateMany({\n where: {\n contentType,\n entryDocumentId: entry.documentId,\n locale: entry.locale,\n },\n data: {\n isEntryValid: entryStatus,\n },\n });\n\n await updateAffectedReleaseStatuses(releases, { strapi });\n};\n\nconst deleteActionsAndUpdateReleaseStatus = async (params: ReleaseActionsParams) => {\n const releases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n actions: params,\n },\n });\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).deleteMany({\n where: params,\n });\n\n await updateAffectedReleaseStatuses(releases, { strapi });\n};\n\nconst deleteActionsOnDelete: Middleware = async (ctx, next) => {\n if (ctx.action !== 'delete') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n const { documentId, locale } = ctx.params;\n\n const result = await next();\n\n if (!result) {\n return result;\n }\n\n try {\n await deleteActionsAndUpdateReleaseStatus({\n contentType,\n entryDocumentId: documentId,\n ...(await getDeletedLocalesFilter(ctx.contentType, locale)),\n });\n } catch (error) {\n strapi.log.error('Error while deleting release actions after delete', {\n error,\n });\n }\n\n return result;\n};\n\nconst updateActionsOnUpdate: Middleware = async (ctx, next) => {\n if (ctx.action !== 'update') {\n return next();\n }\n\n if (!contentTypes.hasDraftAndPublish(ctx.contentType)) {\n return next();\n }\n\n const contentType = ctx.contentType.uid;\n\n const result = (await next()) as Modules.Documents.AnyDocument;\n\n if (!result) {\n return result;\n }\n\n try {\n await updateActionsStatusAndUpdateReleaseStatus(contentType, result);\n } catch (error) {\n strapi.log.error('Error while updating release actions after update', {\n error,\n });\n }\n\n return result;\n};\n\nexport { deleteActionsOnDelete, updateActionsOnUpdate };\n"],"names":["getDeletedLocalesFilter","contentType","locale","strapi","localization","isLocalizedContentType","Array","isArray","$in","getDefaultLocale","updateActionsStatusAndUpdateReleaseStatus","entry","releases","db","query","RELEASE_MODEL_UID","findMany","where","releasedAt","actions","entryDocumentId","documentId","entryStatus","isEntryValid","RELEASE_ACTION_MODEL_UID","updateMany","data","updateAffectedReleaseStatuses","deleteActionsAndUpdateReleaseStatus","params","deleteMany","deleteActionsOnDelete","ctx","next","action","contentTypes","hasDraftAndPublish","uid","result","error","log","updateActionsOnUpdate"],"mappings":"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"}
@@ -99,7 +99,7 @@ async function migrateIsValidAndStatusReleases() {
99
99
  });
100
100
  }
101
101
  async function revalidateChangedContentTypes({ oldContentTypes, contentTypes }) {
102
- if (oldContentTypes !== undefined && contentTypes !== undefined) {
102
+ if (oldContentTypes !== undefined && oldContentTypes !== null && contentTypes !== undefined) {
103
103
  const contentTypesWithDraftAndPublish = Object.keys(oldContentTypes).filter((uid)=>oldContentTypes[uid]?.options?.draftAndPublish);
104
104
  const releasesAffected = new Set();
105
105
  utils.async.map(contentTypesWithDraftAndPublish, async (contentTypeUID)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/migrations/index.ts"],"sourcesContent":["import type { Schema, UID } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async } from '@strapi/utils';\nimport isEqual from 'lodash/isEqual';\n\nimport { difference, keys } from 'lodash';\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { getDraftEntryValidStatus, getService } from '../utils';\nimport { Release } from '../../../shared/contracts/releases';\nimport { ReleaseAction } from '../../../shared/contracts/release-actions';\n\ninterface Input {\n oldContentTypes: Record<string, Schema.ContentType>;\n contentTypes: Record<string, Schema.ContentType>;\n}\n\nexport async function deleteActionsOnDisableDraftAndPublish({\n oldContentTypes,\n contentTypes,\n}: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (\n contentTypesUtils.hasDraftAndPublish(oldContentType) &&\n !contentTypesUtils.hasDraftAndPublish(contentType)\n ) {\n await strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes }: Input) {\n const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes)) ?? [];\n\n if (deletedContentTypes.length) {\n await async.map(deletedContentTypes, async (deletedContentTypeUID: unknown) => {\n return strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: deletedContentTypeUID })\n .execute();\n });\n }\n}\n\nexport async function migrateIsValidAndStatusReleases() {\n const releasesWithoutStatus = (await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: null,\n },\n populate: {\n actions: {\n populate: {\n entry: true,\n },\n },\n },\n })) as Release[];\n\n async.map(releasesWithoutStatus, async (release: Release) => {\n const actions = release.actions;\n\n const notValidatedActions = actions.filter((action) => action.isEntryValid === null);\n\n for (const action of notValidatedActions) {\n // We need to check the Action is related to a valid entry because we can't assume this is gonna be always the case\n // example: users could make changes directly to their database, or data could be lost\n if (action.entry) {\n const isEntryValid = 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,\n },\n });\n }\n }\n\n return getService('release', { strapi }).updateReleaseStatus(release.id);\n });\n\n const publishedReleases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: {\n $notNull: true,\n },\n },\n });\n\n async.map(publishedReleases, async (release: Release) => {\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: release.id,\n },\n data: {\n status: 'done',\n },\n });\n });\n}\n\nexport async function revalidateChangedContentTypes({ oldContentTypes, contentTypes }: Input) {\n if (oldContentTypes !== undefined && contentTypes !== undefined) {\n const contentTypesWithDraftAndPublish = Object.keys(oldContentTypes).filter(\n (uid) => oldContentTypes[uid]?.options?.draftAndPublish\n );\n const releasesAffected = new Set();\n\n async\n .map(contentTypesWithDraftAndPublish, async (contentTypeUID: UID.ContentType) => {\n const oldContentType = oldContentTypes[contentTypeUID];\n const contentType = contentTypes[contentTypeUID];\n\n // If attributes have changed, we need to revalidate actions because maybe validations rules are different\n if (!isEqual(oldContentType?.attributes, contentType?.attributes)) {\n const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n contentType: contentTypeUID,\n },\n populate: {\n entry: true,\n release: true,\n },\n });\n\n await async.map(actions, async (action: ReleaseAction) => {\n if (action.entry && action.release && action.type === 'publish') {\n const isEntryValid = await getDraftEntryValidStatus(\n {\n contentType: contentTypeUID,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n { strapi }\n );\n\n releasesAffected.add(action.release.id);\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: action.id,\n },\n data: {\n isEntryValid,\n },\n });\n }\n });\n }\n })\n .then(() => {\n // We need to update the status of the releases affected\n async.map(releasesAffected, async (releaseId: Release['id']) => {\n return getService('release', { strapi }).updateReleaseStatus(releaseId);\n });\n });\n }\n}\n\nexport async function disableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === true &&\n strapi.localization.isLocalizedContentType(contentType) === false\n ) {\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: null,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function enableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is enabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === false &&\n strapi.localization.isLocalizedContentType(contentType) === true\n ) {\n const defaultLocale = await strapi.localization.getDefaultLocale();\n\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: defaultLocale,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n"],"names":["deleteActionsOnDisableDraftAndPublish","oldContentTypes","contentTypes","uid","oldContentType","contentType","contentTypesUtils","hasDraftAndPublish","strapi","db","queryBuilder","RELEASE_ACTION_MODEL_UID","delete","where","execute","deleteActionsOnDeleteContentType","deletedContentTypes","difference","keys","length","async","map","deletedContentTypeUID","migrateIsValidAndStatusReleases","releasesWithoutStatus","query","RELEASE_MODEL_UID","findMany","status","releasedAt","populate","actions","entry","release","notValidatedActions","filter","action","isEntryValid","getDraftEntryValidStatus","documentId","entryDocumentId","locale","update","id","data","getService","updateReleaseStatus","publishedReleases","$notNull","revalidateChangedContentTypes","undefined","contentTypesWithDraftAndPublish","Object","options","draftAndPublish","releasesAffected","Set","contentTypeUID","isEqual","attributes","type","add","then","releaseId","disableContentTypeLocalized","localization","isLocalizedContentType","enableContentTypeLocalized","defaultLocale","getDefaultLocale"],"mappings":";;;;;;;;;;;;AAeO,eAAeA,qCAAAA,CAAsC,EAC1DC,eAAe,EACfC,YAAY,EACN,EAAA;AACN,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;IAEA,IAAK,MAAME,OAAOD,YAAAA,CAAc;AAC9B,QAAA,IAAI,CAACD,eAAe,CAACE,GAAAA,CAAI,EAAE;AACzB,YAAA;AACF,QAAA;QAEA,MAAMC,cAAAA,GAAiBH,eAAe,CAACE,GAAAA,CAAI;QAC3C,MAAME,WAAAA,GAAcH,YAAY,CAACC,GAAAA,CAAI;QAErC,IACEG,kBAAAA,CAAkBC,kBAAkB,CAACH,cAAAA,CAAAA,IACrC,CAACE,kBAAAA,CAAkBC,kBAAkB,CAACF,WAAAA,CAAAA,EACtC;AACA,YAAA,MAAMG,OAAOC,EAAE,EACXC,YAAAA,CAAaC,kCAAAA,CAAAA,CACdC,SACAC,KAAAA,CAAM;gBAAER,WAAAA,EAAaF;aAAI,CAAA,CACzBW,OAAAA,EAAAA;AACL,QAAA;AACF,IAAA;AACF;AAEO,eAAeC,gCAAAA,CAAiC,EAAEd,eAAe,EAAEC,YAAY,EAAS,EAAA;AAC7F,IAAA,MAAMc,sBAAsBC,YAAAA,CAAWC,MAAAA,CAAKjB,eAAAA,CAAAA,EAAkBiB,MAAAA,CAAKhB,kBAAkB,EAAE;IAEvF,IAAIc,mBAAAA,CAAoBG,MAAM,EAAE;AAC9B,QAAA,MAAMC,WAAAA,CAAMC,GAAG,CAACL,mBAAAA,EAAqB,OAAOM,qBAAAA,GAAAA;AAC1C,YAAA,OAAOd,OAAOC,EAAE,EACZC,YAAAA,CAAaC,kCAAAA,CAAAA,CACdC,SACAC,KAAAA,CAAM;gBAAER,WAAAA,EAAaiB;aAAsB,CAAA,CAC3CR,OAAAA,EAAAA;AACL,QAAA,CAAA,CAAA;AACF,IAAA;AACF;AAEO,eAAeS,+BAAAA,GAAAA;IACpB,MAAMC,qBAAAA,GAAyB,MAAMhB,MAAAA,CAAOC,EAAE,CAACgB,KAAK,CAACC,2BAAAA,CAAAA,CAAmBC,QAAQ,CAAC;QAC/Ed,KAAAA,EAAO;YACLe,MAAAA,EAAQ,IAAA;YACRC,UAAAA,EAAY;AACd,SAAA;QACAC,QAAAA,EAAU;YACRC,OAAAA,EAAS;gBACPD,QAAAA,EAAU;oBACRE,KAAAA,EAAO;AACT;AACF;AACF;AACF,KAAA,CAAA;IAEAZ,WAAAA,CAAMC,GAAG,CAACG,qBAAAA,EAAuB,OAAOS,OAAAA,GAAAA;QACtC,MAAMF,OAAAA,GAAUE,QAAQF,OAAO;QAE/B,MAAMG,mBAAAA,GAAsBH,QAAQI,MAAM,CAAC,CAACC,MAAAA,GAAWA,MAAAA,CAAOC,YAAY,KAAK,IAAA,CAAA;QAE/E,KAAK,MAAMD,UAAUF,mBAAAA,CAAqB;;;YAGxC,IAAIE,MAAAA,CAAOJ,KAAK,EAAE;AAChB,gBAAA,MAAMK,eAAeC,8BAAAA,CACnB;AACEjC,oBAAAA,WAAAA,EAAa+B,OAAO/B,WAAW;AAC/BkC,oBAAAA,UAAAA,EAAYH,OAAOI,eAAe;AAClCC,oBAAAA,MAAAA,EAAQL,OAAOK;iBACjB,EACA;AAAEjC,oBAAAA;AAAO,iBAAA,CAAA;AAGX,gBAAA,MAAMA,OAAOC,EAAE,CAACgB,KAAK,CAACd,kCAAAA,CAAAA,CAA0B+B,MAAM,CAAC;oBACrD7B,KAAAA,EAAO;AACL8B,wBAAAA,EAAAA,EAAIP,OAAOO;AACb,qBAAA;oBACAC,IAAAA,EAAM;AACJP,wBAAAA;AACF;AACF,iBAAA,CAAA;AACF,YAAA;AACF,QAAA;AAEA,QAAA,OAAOQ,iBAAW,SAAA,EAAW;AAAErC,YAAAA;SAAO,CAAA,CAAGsC,mBAAmB,CAACb,OAAAA,CAAQU,EAAE,CAAA;AACzE,IAAA,CAAA,CAAA;IAEA,MAAMI,iBAAAA,GAAoB,MAAMvC,MAAAA,CAAOC,EAAE,CAACgB,KAAK,CAACC,2BAAAA,CAAAA,CAAmBC,QAAQ,CAAC;QAC1Ed,KAAAA,EAAO;YACLe,MAAAA,EAAQ,IAAA;YACRC,UAAAA,EAAY;gBACVmB,QAAAA,EAAU;AACZ;AACF;AACF,KAAA,CAAA;IAEA5B,WAAAA,CAAMC,GAAG,CAAC0B,iBAAAA,EAAmB,OAAOd,OAAAA,GAAAA;AAClC,QAAA,OAAOzB,OAAOC,EAAE,CAACgB,KAAK,CAACC,2BAAAA,CAAAA,CAAmBgB,MAAM,CAAC;YAC/C7B,KAAAA,EAAO;AACL8B,gBAAAA,EAAAA,EAAIV,QAAQU;AACd,aAAA;YACAC,IAAAA,EAAM;gBACJhB,MAAAA,EAAQ;AACV;AACF,SAAA,CAAA;AACF,IAAA,CAAA,CAAA;AACF;AAEO,eAAeqB,6BAAAA,CAA8B,EAAEhD,eAAe,EAAEC,YAAY,EAAS,EAAA;IAC1F,IAAID,eAAAA,KAAoBiD,SAAAA,IAAahD,YAAAA,KAAiBgD,SAAAA,EAAW;AAC/D,QAAA,MAAMC,+BAAAA,GAAkCC,MAAAA,CAAOlC,IAAI,CAACjB,eAAAA,CAAAA,CAAiBkC,MAAM,CACzE,CAAChC,GAAAA,GAAQF,eAAe,CAACE,GAAAA,CAAI,EAAEkD,OAAAA,EAASC,eAAAA,CAAAA;AAE1C,QAAA,MAAMC,mBAAmB,IAAIC,GAAAA,EAAAA;QAE7BpC,WAAAA,CACGC,GAAG,CAAC8B,+BAAAA,EAAiC,OAAOM,cAAAA,GAAAA;YAC3C,MAAMrD,cAAAA,GAAiBH,eAAe,CAACwD,cAAAA,CAAe;YACtD,MAAMpD,WAAAA,GAAcH,YAAY,CAACuD,cAAAA,CAAe;;AAGhD,YAAA,IAAI,CAACC,wBAAAA,CAAQtD,cAAAA,EAAgBuD,UAAAA,EAAYtD,aAAasD,UAAAA,CAAAA,EAAa;gBACjE,MAAM5B,OAAAA,GAAU,MAAMvB,MAAAA,CAAOC,EAAE,CAACgB,KAAK,CAACd,kCAAAA,CAAAA,CAA0BgB,QAAQ,CAAC;oBACvEd,KAAAA,EAAO;wBACLR,WAAAA,EAAaoD;AACf,qBAAA;oBACA3B,QAAAA,EAAU;wBACRE,KAAAA,EAAO,IAAA;wBACPC,OAAAA,EAAS;AACX;AACF,iBAAA,CAAA;AAEA,gBAAA,MAAMb,WAAAA,CAAMC,GAAG,CAACU,OAAAA,EAAS,OAAOK,MAAAA,GAAAA;oBAC9B,IAAIA,MAAAA,CAAOJ,KAAK,IAAII,MAAAA,CAAOH,OAAO,IAAIG,MAAAA,CAAOwB,IAAI,KAAK,SAAA,EAAW;wBAC/D,MAAMvB,YAAAA,GAAe,MAAMC,8BAAAA,CACzB;4BACEjC,WAAAA,EAAaoD,cAAAA;AACblB,4BAAAA,UAAAA,EAAYH,OAAOI,eAAe;AAClCC,4BAAAA,MAAAA,EAAQL,OAAOK;yBACjB,EACA;AAAEjC,4BAAAA;AAAO,yBAAA,CAAA;AAGX+C,wBAAAA,gBAAAA,CAAiBM,GAAG,CAACzB,MAAAA,CAAOH,OAAO,CAACU,EAAE,CAAA;AAEtC,wBAAA,MAAMnC,OAAOC,EAAE,CAACgB,KAAK,CAACd,kCAAAA,CAAAA,CAA0B+B,MAAM,CAAC;4BACrD7B,KAAAA,EAAO;AACL8B,gCAAAA,EAAAA,EAAIP,OAAOO;AACb,6BAAA;4BACAC,IAAAA,EAAM;AACJP,gCAAAA;AACF;AACF,yBAAA,CAAA;AACF,oBAAA;AACF,gBAAA,CAAA,CAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA,CACCyB,IAAI,CAAC,IAAA;;YAEJ1C,WAAAA,CAAMC,GAAG,CAACkC,gBAAAA,EAAkB,OAAOQ,SAAAA,GAAAA;AACjC,gBAAA,OAAOlB,iBAAW,SAAA,EAAW;AAAErC,oBAAAA;AAAO,iBAAA,CAAA,CAAGsC,mBAAmB,CAACiB,SAAAA,CAAAA;AAC/D,YAAA,CAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACJ,IAAA;AACF;AAEO,eAAeC,2BAAAA,CAA4B,EAAE/D,eAAe,EAAEC,YAAY,EAAS,EAAA;AACxF,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;IAEA,IAAK,MAAME,OAAOD,YAAAA,CAAc;AAC9B,QAAA,IAAI,CAACD,eAAe,CAACE,GAAAA,CAAI,EAAE;AACzB,YAAA;AACF,QAAA;QAEA,MAAMC,cAAAA,GAAiBH,eAAe,CAACE,GAAAA,CAAI;QAC3C,MAAME,WAAAA,GAAcH,YAAY,CAACC,GAAAA,CAAI;;AAGrC,QAAA,IACEK,MAAAA,CAAOyD,YAAY,CAACC,sBAAsB,CAAC9D,cAAAA,CAAAA,KAAoB,IAAA,IAC/DI,MAAAA,CAAOyD,YAAY,CAACC,sBAAsB,CAAC7D,iBAAiB,KAAA,EAC5D;AACA,YAAA,MAAMG,OAAOC,EAAE,CACZC,YAAY,CAACC,kCAAAA,CAAAA,CACb+B,MAAM,CAAC;gBACND,MAAAA,EAAQ;AACV,aAAA,CAAA,CACC5B,KAAK,CAAC;gBAAER,WAAAA,EAAaF;AAAI,aAAA,CAAA,CACzBW,OAAO,EAAA;AACZ,QAAA;AACF,IAAA;AACF;AAEO,eAAeqD,0BAAAA,CAA2B,EAAElE,eAAe,EAAEC,YAAY,EAAS,EAAA;AACvF,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;IAEA,IAAK,MAAME,OAAOD,YAAAA,CAAc;AAC9B,QAAA,IAAI,CAACD,eAAe,CAACE,GAAAA,CAAI,EAAE;AACzB,YAAA;AACF,QAAA;QAEA,MAAMC,cAAAA,GAAiBH,eAAe,CAACE,GAAAA,CAAI;QAC3C,MAAME,WAAAA,GAAcH,YAAY,CAACC,GAAAA,CAAI;;AAGrC,QAAA,IACEK,MAAAA,CAAOyD,YAAY,CAACC,sBAAsB,CAAC9D,cAAAA,CAAAA,KAAoB,KAAA,IAC/DI,MAAAA,CAAOyD,YAAY,CAACC,sBAAsB,CAAC7D,iBAAiB,IAAA,EAC5D;AACA,YAAA,MAAM+D,aAAAA,GAAgB,MAAM5D,MAAAA,CAAOyD,YAAY,CAACI,gBAAgB,EAAA;AAEhE,YAAA,MAAM7D,OAAOC,EAAE,CACZC,YAAY,CAACC,kCAAAA,CAAAA,CACb+B,MAAM,CAAC;gBACND,MAAAA,EAAQ2B;AACV,aAAA,CAAA,CACCvD,KAAK,CAAC;gBAAER,WAAAA,EAAaF;AAAI,aAAA,CAAA,CACzBW,OAAO,EAAA;AACZ,QAAA;AACF,IAAA;AACF;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/migrations/index.ts"],"sourcesContent":["import type { Schema, UID } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async } from '@strapi/utils';\nimport isEqual from 'lodash/isEqual';\n\nimport { difference, keys } from 'lodash';\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { getDraftEntryValidStatus, getService } from '../utils';\nimport { Release } from '../../../shared/contracts/releases';\nimport { ReleaseAction } from '../../../shared/contracts/release-actions';\n\ninterface Input {\n oldContentTypes: Record<string, Schema.ContentType>;\n contentTypes: Record<string, Schema.ContentType>;\n}\n\nexport async function deleteActionsOnDisableDraftAndPublish({\n oldContentTypes,\n contentTypes,\n}: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (\n contentTypesUtils.hasDraftAndPublish(oldContentType) &&\n !contentTypesUtils.hasDraftAndPublish(contentType)\n ) {\n await strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes }: Input) {\n const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes)) ?? [];\n\n if (deletedContentTypes.length) {\n await async.map(deletedContentTypes, async (deletedContentTypeUID: unknown) => {\n return strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: deletedContentTypeUID })\n .execute();\n });\n }\n}\n\nexport async function migrateIsValidAndStatusReleases() {\n const releasesWithoutStatus = (await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: null,\n },\n populate: {\n actions: {\n populate: {\n entry: true,\n },\n },\n },\n })) as Release[];\n\n async.map(releasesWithoutStatus, async (release: Release) => {\n const actions = release.actions;\n\n const notValidatedActions = actions.filter((action) => action.isEntryValid === null);\n\n for (const action of notValidatedActions) {\n // We need to check the Action is related to a valid entry because we can't assume this is gonna be always the case\n // example: users could make changes directly to their database, or data could be lost\n if (action.entry) {\n const isEntryValid = 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,\n },\n });\n }\n }\n\n return getService('release', { strapi }).updateReleaseStatus(release.id);\n });\n\n const publishedReleases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: {\n $notNull: true,\n },\n },\n });\n\n async.map(publishedReleases, async (release: Release) => {\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: release.id,\n },\n data: {\n status: 'done',\n },\n });\n });\n}\n\nexport async function revalidateChangedContentTypes({ oldContentTypes, contentTypes }: Input) {\n if (oldContentTypes !== undefined && oldContentTypes !== null && contentTypes !== undefined) {\n const contentTypesWithDraftAndPublish = Object.keys(oldContentTypes).filter(\n (uid) => oldContentTypes[uid]?.options?.draftAndPublish\n );\n const releasesAffected = new Set();\n\n async\n .map(contentTypesWithDraftAndPublish, async (contentTypeUID: UID.ContentType) => {\n const oldContentType = oldContentTypes[contentTypeUID];\n const contentType = contentTypes[contentTypeUID];\n\n // If attributes have changed, we need to revalidate actions because maybe validations rules are different\n if (!isEqual(oldContentType?.attributes, contentType?.attributes)) {\n const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n contentType: contentTypeUID,\n },\n populate: {\n entry: true,\n release: true,\n },\n });\n\n await async.map(actions, async (action: ReleaseAction) => {\n if (action.entry && action.release && action.type === 'publish') {\n const isEntryValid = await getDraftEntryValidStatus(\n {\n contentType: contentTypeUID,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n { strapi }\n );\n\n releasesAffected.add(action.release.id);\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: action.id,\n },\n data: {\n isEntryValid,\n },\n });\n }\n });\n }\n })\n .then(() => {\n // We need to update the status of the releases affected\n async.map(releasesAffected, async (releaseId: Release['id']) => {\n return getService('release', { strapi }).updateReleaseStatus(releaseId);\n });\n });\n }\n}\n\nexport async function disableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === true &&\n strapi.localization.isLocalizedContentType(contentType) === false\n ) {\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: null,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function enableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is enabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === false &&\n strapi.localization.isLocalizedContentType(contentType) === true\n ) {\n const defaultLocale = await strapi.localization.getDefaultLocale();\n\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: defaultLocale,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n"],"names":["deleteActionsOnDisableDraftAndPublish","oldContentTypes","contentTypes","uid","oldContentType","contentType","contentTypesUtils","hasDraftAndPublish","strapi","db","queryBuilder","RELEASE_ACTION_MODEL_UID","delete","where","execute","deleteActionsOnDeleteContentType","deletedContentTypes","difference","keys","length","async","map","deletedContentTypeUID","migrateIsValidAndStatusReleases","releasesWithoutStatus","query","RELEASE_MODEL_UID","findMany","status","releasedAt","populate","actions","entry","release","notValidatedActions","filter","action","isEntryValid","getDraftEntryValidStatus","documentId","entryDocumentId","locale","update","id","data","getService","updateReleaseStatus","publishedReleases","$notNull","revalidateChangedContentTypes","undefined","contentTypesWithDraftAndPublish","Object","options","draftAndPublish","releasesAffected","Set","contentTypeUID","isEqual","attributes","type","add","then","releaseId","disableContentTypeLocalized","localization","isLocalizedContentType","enableContentTypeLocalized","defaultLocale","getDefaultLocale"],"mappings":"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"}
@@ -93,7 +93,7 @@ async function migrateIsValidAndStatusReleases() {
93
93
  });
94
94
  }
95
95
  async function revalidateChangedContentTypes({ oldContentTypes, contentTypes }) {
96
- if (oldContentTypes !== undefined && contentTypes !== undefined) {
96
+ if (oldContentTypes !== undefined && oldContentTypes !== null && contentTypes !== undefined) {
97
97
  const contentTypesWithDraftAndPublish = Object.keys(oldContentTypes).filter((uid)=>oldContentTypes[uid]?.options?.draftAndPublish);
98
98
  const releasesAffected = new Set();
99
99
  async.map(contentTypesWithDraftAndPublish, async (contentTypeUID)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/migrations/index.ts"],"sourcesContent":["import type { Schema, UID } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async } from '@strapi/utils';\nimport isEqual from 'lodash/isEqual';\n\nimport { difference, keys } from 'lodash';\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { getDraftEntryValidStatus, getService } from '../utils';\nimport { Release } from '../../../shared/contracts/releases';\nimport { ReleaseAction } from '../../../shared/contracts/release-actions';\n\ninterface Input {\n oldContentTypes: Record<string, Schema.ContentType>;\n contentTypes: Record<string, Schema.ContentType>;\n}\n\nexport async function deleteActionsOnDisableDraftAndPublish({\n oldContentTypes,\n contentTypes,\n}: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (\n contentTypesUtils.hasDraftAndPublish(oldContentType) &&\n !contentTypesUtils.hasDraftAndPublish(contentType)\n ) {\n await strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes }: Input) {\n const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes)) ?? [];\n\n if (deletedContentTypes.length) {\n await async.map(deletedContentTypes, async (deletedContentTypeUID: unknown) => {\n return strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: deletedContentTypeUID })\n .execute();\n });\n }\n}\n\nexport async function migrateIsValidAndStatusReleases() {\n const releasesWithoutStatus = (await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: null,\n },\n populate: {\n actions: {\n populate: {\n entry: true,\n },\n },\n },\n })) as Release[];\n\n async.map(releasesWithoutStatus, async (release: Release) => {\n const actions = release.actions;\n\n const notValidatedActions = actions.filter((action) => action.isEntryValid === null);\n\n for (const action of notValidatedActions) {\n // We need to check the Action is related to a valid entry because we can't assume this is gonna be always the case\n // example: users could make changes directly to their database, or data could be lost\n if (action.entry) {\n const isEntryValid = 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,\n },\n });\n }\n }\n\n return getService('release', { strapi }).updateReleaseStatus(release.id);\n });\n\n const publishedReleases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: {\n $notNull: true,\n },\n },\n });\n\n async.map(publishedReleases, async (release: Release) => {\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: release.id,\n },\n data: {\n status: 'done',\n },\n });\n });\n}\n\nexport async function revalidateChangedContentTypes({ oldContentTypes, contentTypes }: Input) {\n if (oldContentTypes !== undefined && contentTypes !== undefined) {\n const contentTypesWithDraftAndPublish = Object.keys(oldContentTypes).filter(\n (uid) => oldContentTypes[uid]?.options?.draftAndPublish\n );\n const releasesAffected = new Set();\n\n async\n .map(contentTypesWithDraftAndPublish, async (contentTypeUID: UID.ContentType) => {\n const oldContentType = oldContentTypes[contentTypeUID];\n const contentType = contentTypes[contentTypeUID];\n\n // If attributes have changed, we need to revalidate actions because maybe validations rules are different\n if (!isEqual(oldContentType?.attributes, contentType?.attributes)) {\n const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n contentType: contentTypeUID,\n },\n populate: {\n entry: true,\n release: true,\n },\n });\n\n await async.map(actions, async (action: ReleaseAction) => {\n if (action.entry && action.release && action.type === 'publish') {\n const isEntryValid = await getDraftEntryValidStatus(\n {\n contentType: contentTypeUID,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n { strapi }\n );\n\n releasesAffected.add(action.release.id);\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: action.id,\n },\n data: {\n isEntryValid,\n },\n });\n }\n });\n }\n })\n .then(() => {\n // We need to update the status of the releases affected\n async.map(releasesAffected, async (releaseId: Release['id']) => {\n return getService('release', { strapi }).updateReleaseStatus(releaseId);\n });\n });\n }\n}\n\nexport async function disableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === true &&\n strapi.localization.isLocalizedContentType(contentType) === false\n ) {\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: null,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function enableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is enabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === false &&\n strapi.localization.isLocalizedContentType(contentType) === true\n ) {\n const defaultLocale = await strapi.localization.getDefaultLocale();\n\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: defaultLocale,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n"],"names":["deleteActionsOnDisableDraftAndPublish","oldContentTypes","contentTypes","uid","oldContentType","contentType","contentTypesUtils","hasDraftAndPublish","strapi","db","queryBuilder","RELEASE_ACTION_MODEL_UID","delete","where","execute","deleteActionsOnDeleteContentType","deletedContentTypes","difference","keys","length","async","map","deletedContentTypeUID","migrateIsValidAndStatusReleases","releasesWithoutStatus","query","RELEASE_MODEL_UID","findMany","status","releasedAt","populate","actions","entry","release","notValidatedActions","filter","action","isEntryValid","getDraftEntryValidStatus","documentId","entryDocumentId","locale","update","id","data","getService","updateReleaseStatus","publishedReleases","$notNull","revalidateChangedContentTypes","undefined","contentTypesWithDraftAndPublish","Object","options","draftAndPublish","releasesAffected","Set","contentTypeUID","isEqual","attributes","type","add","then","releaseId","disableContentTypeLocalized","localization","isLocalizedContentType","enableContentTypeLocalized","defaultLocale","getDefaultLocale"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/migrations/index.ts"],"sourcesContent":["import type { Schema, UID } from '@strapi/types';\nimport { contentTypes as contentTypesUtils, async } from '@strapi/utils';\nimport isEqual from 'lodash/isEqual';\n\nimport { difference, keys } from 'lodash';\nimport { RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { getDraftEntryValidStatus, getService } from '../utils';\nimport { Release } from '../../../shared/contracts/releases';\nimport { ReleaseAction } from '../../../shared/contracts/release-actions';\n\ninterface Input {\n oldContentTypes: Record<string, Schema.ContentType>;\n contentTypes: Record<string, Schema.ContentType>;\n}\n\nexport async function deleteActionsOnDisableDraftAndPublish({\n oldContentTypes,\n contentTypes,\n}: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (\n contentTypesUtils.hasDraftAndPublish(oldContentType) &&\n !contentTypesUtils.hasDraftAndPublish(contentType)\n ) {\n await strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes }: Input) {\n const deletedContentTypes = difference(keys(oldContentTypes), keys(contentTypes)) ?? [];\n\n if (deletedContentTypes.length) {\n await async.map(deletedContentTypes, async (deletedContentTypeUID: unknown) => {\n return strapi.db\n ?.queryBuilder(RELEASE_ACTION_MODEL_UID)\n .delete()\n .where({ contentType: deletedContentTypeUID })\n .execute();\n });\n }\n}\n\nexport async function migrateIsValidAndStatusReleases() {\n const releasesWithoutStatus = (await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: null,\n },\n populate: {\n actions: {\n populate: {\n entry: true,\n },\n },\n },\n })) as Release[];\n\n async.map(releasesWithoutStatus, async (release: Release) => {\n const actions = release.actions;\n\n const notValidatedActions = actions.filter((action) => action.isEntryValid === null);\n\n for (const action of notValidatedActions) {\n // We need to check the Action is related to a valid entry because we can't assume this is gonna be always the case\n // example: users could make changes directly to their database, or data could be lost\n if (action.entry) {\n const isEntryValid = 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,\n },\n });\n }\n }\n\n return getService('release', { strapi }).updateReleaseStatus(release.id);\n });\n\n const publishedReleases = await strapi.db.query(RELEASE_MODEL_UID).findMany({\n where: {\n status: null,\n releasedAt: {\n $notNull: true,\n },\n },\n });\n\n async.map(publishedReleases, async (release: Release) => {\n return strapi.db.query(RELEASE_MODEL_UID).update({\n where: {\n id: release.id,\n },\n data: {\n status: 'done',\n },\n });\n });\n}\n\nexport async function revalidateChangedContentTypes({ oldContentTypes, contentTypes }: Input) {\n if (oldContentTypes !== undefined && oldContentTypes !== null && contentTypes !== undefined) {\n const contentTypesWithDraftAndPublish = Object.keys(oldContentTypes).filter(\n (uid) => oldContentTypes[uid]?.options?.draftAndPublish\n );\n const releasesAffected = new Set();\n\n async\n .map(contentTypesWithDraftAndPublish, async (contentTypeUID: UID.ContentType) => {\n const oldContentType = oldContentTypes[contentTypeUID];\n const contentType = contentTypes[contentTypeUID];\n\n // If attributes have changed, we need to revalidate actions because maybe validations rules are different\n if (!isEqual(oldContentType?.attributes, contentType?.attributes)) {\n const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n contentType: contentTypeUID,\n },\n populate: {\n entry: true,\n release: true,\n },\n });\n\n await async.map(actions, async (action: ReleaseAction) => {\n if (action.entry && action.release && action.type === 'publish') {\n const isEntryValid = await getDraftEntryValidStatus(\n {\n contentType: contentTypeUID,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n { strapi }\n );\n\n releasesAffected.add(action.release.id);\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: action.id,\n },\n data: {\n isEntryValid,\n },\n });\n }\n });\n }\n })\n .then(() => {\n // We need to update the status of the releases affected\n async.map(releasesAffected, async (releaseId: Release['id']) => {\n return getService('release', { strapi }).updateReleaseStatus(releaseId);\n });\n });\n }\n}\n\nexport async function disableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === true &&\n strapi.localization.isLocalizedContentType(contentType) === false\n ) {\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: null,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n\nexport async function enableContentTypeLocalized({ oldContentTypes, contentTypes }: Input) {\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is enabled remove non default locales before sync\n if (\n strapi.localization.isLocalizedContentType(oldContentType) === false &&\n strapi.localization.isLocalizedContentType(contentType) === true\n ) {\n const defaultLocale = await strapi.localization.getDefaultLocale();\n\n await strapi.db\n .queryBuilder(RELEASE_ACTION_MODEL_UID)\n .update({\n locale: defaultLocale,\n })\n .where({ contentType: uid })\n .execute();\n }\n }\n}\n"],"names":["deleteActionsOnDisableDraftAndPublish","oldContentTypes","contentTypes","uid","oldContentType","contentType","contentTypesUtils","hasDraftAndPublish","strapi","db","queryBuilder","RELEASE_ACTION_MODEL_UID","delete","where","execute","deleteActionsOnDeleteContentType","deletedContentTypes","difference","keys","length","async","map","deletedContentTypeUID","migrateIsValidAndStatusReleases","releasesWithoutStatus","query","RELEASE_MODEL_UID","findMany","status","releasedAt","populate","actions","entry","release","notValidatedActions","filter","action","isEntryValid","getDraftEntryValidStatus","documentId","entryDocumentId","locale","update","id","data","getService","updateReleaseStatus","publishedReleases","$notNull","revalidateChangedContentTypes","undefined","contentTypesWithDraftAndPublish","Object","options","draftAndPublish","releasesAffected","Set","contentTypeUID","isEqual","attributes","type","add","then","releaseId","disableContentTypeLocalized","localization","isLocalizedContentType","enableContentTypeLocalized","defaultLocale","getDefaultLocale"],"mappings":"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"}
@@ -3,8 +3,10 @@
3
3
  var constants = require('./constants.js');
4
4
  var index = require('./migrations/index.js');
5
5
  var _5_0_0DocumentIdInActions = require('./migrations/database/5.0.0-document-id-in-actions.js');
6
+ var entitlements = require('./entitlements.js');
6
7
 
7
8
  const register = async ({ strapi })=>{
9
+ entitlements.registerReleasesEntitlements(strapi);
8
10
  if (strapi.ee.features.isEnabled('cms-content-releases')) {
9
11
  await strapi.service('admin::permission').actionProvider.registerMany(constants.ACTIONS);
10
12
  strapi.db.migrations.providers.internal.register(_5_0_0DocumentIdInActions.addEntryDocumentToReleaseActions);