@strapi/content-releases 5.56.0 → 5.57.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.
- package/dist/admin/components/RelativeTime.js +12 -2
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/RelativeTime.mjs +13 -3
- package/dist/admin/components/RelativeTime.mjs.map +1 -1
- package/dist/server/migrations/index.js +5 -16
- package/dist/server/migrations/index.js.map +1 -1
- package/dist/server/migrations/index.mjs +3 -14
- package/dist/server/migrations/index.mjs.map +1 -1
- package/dist/server/services/release-action.js +4 -7
- package/dist/server/services/release-action.js.map +1 -1
- package/dist/server/services/release-action.mjs +4 -7
- package/dist/server/services/release-action.mjs.map +1 -1
- package/dist/server/src/index.d.ts +1742 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/migrations/index.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1742 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/release-action.d.ts +1744 -2
- package/dist/server/src/services/release-action.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -48,6 +48,15 @@ const intervals = [
|
|
|
48
48
|
* ```
|
|
49
49
|
*/ const RelativeTime = /*#__PURE__*/ React__namespace.forwardRef(({ timestamp, customIntervals = [], ...restProps }, forwardedRef)=>{
|
|
50
50
|
const { formatRelativeTime, formatDate, formatTime } = reactIntl.useIntl();
|
|
51
|
+
// Invalid Date: intervalToDuration throws RangeError (see #27382).
|
|
52
|
+
if (!dateFns.isValid(timestamp)) {
|
|
53
|
+
return /*#__PURE__*/ jsxRuntime.jsx("time", {
|
|
54
|
+
ref: forwardedRef,
|
|
55
|
+
role: "time",
|
|
56
|
+
...restProps,
|
|
57
|
+
children: "-"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
51
60
|
/**
|
|
52
61
|
* TODO: make this auto-update, like a clock.
|
|
53
62
|
*/ const interval = dateFns.intervalToDuration({
|
|
@@ -56,8 +65,9 @@ const intervals = [
|
|
|
56
65
|
});
|
|
57
66
|
const unit = intervals.find((intervalUnit)=>{
|
|
58
67
|
return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
|
|
59
|
-
});
|
|
60
|
-
const
|
|
68
|
+
}) ?? 'seconds';
|
|
69
|
+
const value = interval[unit] ?? 0;
|
|
70
|
+
const relativeTime = dateFns.isPast(timestamp) ? -value : value;
|
|
61
71
|
// Display custom text if interval is less than the threshold
|
|
62
72
|
const customInterval = customIntervals.find((custom)=>interval[custom.unit] < custom.threshold);
|
|
63
73
|
const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit
|
|
1
|
+
{"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,iBAAAA,EAAAA;;IAGvD,IAAI,CAACC,gBAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,cAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,0BAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,cAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,cAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { intervalToDuration, isPast } from 'date-fns';
|
|
3
|
+
import { isValid, intervalToDuration, isPast } from 'date-fns';
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
5
|
|
|
6
6
|
const intervals = [
|
|
@@ -26,6 +26,15 @@ const intervals = [
|
|
|
26
26
|
* ```
|
|
27
27
|
*/ const RelativeTime = /*#__PURE__*/ React.forwardRef(({ timestamp, customIntervals = [], ...restProps }, forwardedRef)=>{
|
|
28
28
|
const { formatRelativeTime, formatDate, formatTime } = useIntl();
|
|
29
|
+
// Invalid Date: intervalToDuration throws RangeError (see #27382).
|
|
30
|
+
if (!isValid(timestamp)) {
|
|
31
|
+
return /*#__PURE__*/ jsx("time", {
|
|
32
|
+
ref: forwardedRef,
|
|
33
|
+
role: "time",
|
|
34
|
+
...restProps,
|
|
35
|
+
children: "-"
|
|
36
|
+
});
|
|
37
|
+
}
|
|
29
38
|
/**
|
|
30
39
|
* TODO: make this auto-update, like a clock.
|
|
31
40
|
*/ const interval = intervalToDuration({
|
|
@@ -34,8 +43,9 @@ const intervals = [
|
|
|
34
43
|
});
|
|
35
44
|
const unit = intervals.find((intervalUnit)=>{
|
|
36
45
|
return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
|
|
37
|
-
});
|
|
38
|
-
const
|
|
46
|
+
}) ?? 'seconds';
|
|
47
|
+
const value = interval[unit] ?? 0;
|
|
48
|
+
const relativeTime = isPast(timestamp) ? -value : value;
|
|
39
49
|
// Display custom text if interval is less than the threshold
|
|
40
50
|
const customInterval = customIntervals.find((custom)=>interval[custom.unit] < custom.threshold);
|
|
41
51
|
const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelativeTime.mjs","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit
|
|
1
|
+
{"version":3,"file":"RelativeTime.mjs","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,OAAAA,EAAAA;;IAGvD,IAAI,CAACC,QAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,GAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,kBAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,MAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,GAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
4
|
var isEqual = require('lodash/isEqual');
|
|
5
|
-
var
|
|
5
|
+
var _ = require('lodash');
|
|
6
6
|
var constants = require('../constants.js');
|
|
7
7
|
var index = require('../utils/index.js');
|
|
8
8
|
|
|
@@ -28,7 +28,7 @@ async function deleteActionsOnDisableDraftAndPublish({ oldContentTypes, contentT
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
async function deleteActionsOnDeleteContentType({ oldContentTypes, contentTypes }) {
|
|
31
|
-
const deletedContentTypes =
|
|
31
|
+
const deletedContentTypes = _.difference(_.keys(oldContentTypes), _.keys(contentTypes)) ?? [];
|
|
32
32
|
if (deletedContentTypes.length) {
|
|
33
33
|
await utils.async.map(deletedContentTypes, async (deletedContentTypeUID)=>{
|
|
34
34
|
return strapi.db?.queryBuilder(constants.RELEASE_ACTION_MODEL_UID).delete().where({
|
|
@@ -151,19 +151,14 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes }) {
|
|
|
151
151
|
if (!oldContentTypes) {
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
154
|
-
const i18nPlugin = strapi.plugin('i18n');
|
|
155
|
-
if (!i18nPlugin) {
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
154
|
for(const uid in contentTypes){
|
|
159
155
|
if (!oldContentTypes[uid]) {
|
|
160
156
|
continue;
|
|
161
157
|
}
|
|
162
158
|
const oldContentType = oldContentTypes[uid];
|
|
163
159
|
const contentType = contentTypes[uid];
|
|
164
|
-
const { isLocalizedContentType } = i18nPlugin.service('content-types');
|
|
165
160
|
// if i18N is disabled remove non default locales before sync
|
|
166
|
-
if (isLocalizedContentType(oldContentType) &&
|
|
161
|
+
if (strapi.localization.isLocalizedContentType(oldContentType) === true && strapi.localization.isLocalizedContentType(contentType) === false) {
|
|
167
162
|
await strapi.db.queryBuilder(constants.RELEASE_ACTION_MODEL_UID).update({
|
|
168
163
|
locale: null
|
|
169
164
|
}).where({
|
|
@@ -176,21 +171,15 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes }) {
|
|
|
176
171
|
if (!oldContentTypes) {
|
|
177
172
|
return;
|
|
178
173
|
}
|
|
179
|
-
const i18nPlugin = strapi.plugin('i18n');
|
|
180
|
-
if (!i18nPlugin) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
174
|
for(const uid in contentTypes){
|
|
184
175
|
if (!oldContentTypes[uid]) {
|
|
185
176
|
continue;
|
|
186
177
|
}
|
|
187
178
|
const oldContentType = oldContentTypes[uid];
|
|
188
179
|
const contentType = contentTypes[uid];
|
|
189
|
-
const { isLocalizedContentType } = i18nPlugin.service('content-types');
|
|
190
|
-
const { getDefaultLocale } = i18nPlugin.service('locales');
|
|
191
180
|
// if i18N is enabled remove non default locales before sync
|
|
192
|
-
if (
|
|
193
|
-
const defaultLocale = await getDefaultLocale();
|
|
181
|
+
if (strapi.localization.isLocalizedContentType(oldContentType) === false && strapi.localization.isLocalizedContentType(contentType) === true) {
|
|
182
|
+
const defaultLocale = await strapi.localization.getDefaultLocale();
|
|
194
183
|
await strapi.db.queryBuilder(constants.RELEASE_ACTION_MODEL_UID).update({
|
|
195
184
|
locale: defaultLocale
|
|
196
185
|
}).where({
|
|
@@ -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 const i18nPlugin = strapi.plugin('i18n');\n if (!i18nPlugin) {\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 const { isLocalizedContentType } = i18nPlugin.service('content-types');\n\n // if i18N is disabled remove non default locales before sync\n if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {\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 const i18nPlugin = strapi.plugin('i18n');\n if (!i18nPlugin) {\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 const { isLocalizedContentType } = i18nPlugin.service('content-types');\n const { getDefaultLocale } = i18nPlugin.service('locales');\n\n // if i18N is enabled remove non default locales before sync\n if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {\n const defaultLocale = await 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","i18nPlugin","plugin","isLocalizedContentType","service","enableContentTypeLocalized","getDefaultLocale","defaultLocale"],"mappings":"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"}
|
|
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":"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"}
|
|
@@ -145,19 +145,14 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes }) {
|
|
|
145
145
|
if (!oldContentTypes) {
|
|
146
146
|
return;
|
|
147
147
|
}
|
|
148
|
-
const i18nPlugin = strapi.plugin('i18n');
|
|
149
|
-
if (!i18nPlugin) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
148
|
for(const uid in contentTypes){
|
|
153
149
|
if (!oldContentTypes[uid]) {
|
|
154
150
|
continue;
|
|
155
151
|
}
|
|
156
152
|
const oldContentType = oldContentTypes[uid];
|
|
157
153
|
const contentType = contentTypes[uid];
|
|
158
|
-
const { isLocalizedContentType } = i18nPlugin.service('content-types');
|
|
159
154
|
// if i18N is disabled remove non default locales before sync
|
|
160
|
-
if (isLocalizedContentType(oldContentType) &&
|
|
155
|
+
if (strapi.localization.isLocalizedContentType(oldContentType) === true && strapi.localization.isLocalizedContentType(contentType) === false) {
|
|
161
156
|
await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
|
|
162
157
|
locale: null
|
|
163
158
|
}).where({
|
|
@@ -170,21 +165,15 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes }) {
|
|
|
170
165
|
if (!oldContentTypes) {
|
|
171
166
|
return;
|
|
172
167
|
}
|
|
173
|
-
const i18nPlugin = strapi.plugin('i18n');
|
|
174
|
-
if (!i18nPlugin) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
168
|
for(const uid in contentTypes){
|
|
178
169
|
if (!oldContentTypes[uid]) {
|
|
179
170
|
continue;
|
|
180
171
|
}
|
|
181
172
|
const oldContentType = oldContentTypes[uid];
|
|
182
173
|
const contentType = contentTypes[uid];
|
|
183
|
-
const { isLocalizedContentType } = i18nPlugin.service('content-types');
|
|
184
|
-
const { getDefaultLocale } = i18nPlugin.service('locales');
|
|
185
174
|
// if i18N is enabled remove non default locales before sync
|
|
186
|
-
if (
|
|
187
|
-
const defaultLocale = await getDefaultLocale();
|
|
175
|
+
if (strapi.localization.isLocalizedContentType(oldContentType) === false && strapi.localization.isLocalizedContentType(contentType) === true) {
|
|
176
|
+
const defaultLocale = await strapi.localization.getDefaultLocale();
|
|
188
177
|
await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
|
|
189
178
|
locale: defaultLocale
|
|
190
179
|
}).where({
|
|
@@ -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 const i18nPlugin = strapi.plugin('i18n');\n if (!i18nPlugin) {\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 const { isLocalizedContentType } = i18nPlugin.service('content-types');\n\n // if i18N is disabled remove non default locales before sync\n if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {\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 const i18nPlugin = strapi.plugin('i18n');\n if (!i18nPlugin) {\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 const { isLocalizedContentType } = i18nPlugin.service('content-types');\n const { getDefaultLocale } = i18nPlugin.service('locales');\n\n // if i18N is enabled remove non default locales before sync\n if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {\n const defaultLocale = await 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","i18nPlugin","plugin","isLocalizedContentType","service","enableContentTypeLocalized","getDefaultLocale","defaultLocale"],"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 && 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,gBACfC,cAAY,EACN,EAAA;AACN,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;IAEA,IAAK,MAAME,OAAOD,cAAAA,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,cAAY,CAACC,GAAAA,CAAI;QAErC,IACEG,YAAAA,CAAkBC,kBAAkB,CAACH,cAAAA,CAAAA,IACrC,CAACE,YAAAA,CAAkBC,kBAAkB,CAACF,WAAAA,CAAAA,EACtC;AACA,YAAA,MAAMG,OAAOC,EAAE,EACXC,YAAAA,CAAaC,wBAAAA,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,UAAAA,CAAWC,IAAAA,CAAKjB,eAAAA,CAAAA,EAAkBiB,IAAAA,CAAKhB,kBAAkB,EAAE;IAEvF,IAAIc,mBAAAA,CAAoBG,MAAM,EAAE;AAC9B,QAAA,MAAMC,KAAAA,CAAMC,GAAG,CAACL,mBAAAA,EAAqB,OAAOM,qBAAAA,GAAAA;AAC1C,YAAA,OAAOd,OAAOC,EAAE,EACZC,YAAAA,CAAaC,wBAAAA,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,iBAAAA,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,KAAAA,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,wBAAAA,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,wBAAAA,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,WAAW,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,iBAAAA,CAAAA,CAAmBC,QAAQ,CAAC;QAC1Ed,KAAAA,EAAO;YACLe,MAAAA,EAAQ,IAAA;YACRC,UAAAA,EAAY;gBACVmB,QAAAA,EAAU;AACZ;AACF;AACF,KAAA,CAAA;IAEA5B,KAAAA,CAAMC,GAAG,CAAC0B,iBAAAA,EAAmB,OAAOd,OAAAA,GAAAA;AAClC,QAAA,OAAOzB,OAAOC,EAAE,CAACgB,KAAK,CAACC,iBAAAA,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,KAAAA,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,OAAAA,CAAQtD,cAAAA,EAAgBuD,UAAAA,EAAYtD,aAAasD,UAAAA,CAAAA,EAAa;gBACjE,MAAM5B,OAAAA,GAAU,MAAMvB,MAAAA,CAAOC,EAAE,CAACgB,KAAK,CAACd,wBAAAA,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,KAAAA,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,wBAAAA,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,wBAAAA,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,KAAAA,CAAMC,GAAG,CAACkC,gBAAAA,EAAkB,OAAOQ,SAAAA,GAAAA;AACjC,gBAAA,OAAOlB,WAAW,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,wBAAAA,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,wBAAAA,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,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
|
-
var _ = require('lodash
|
|
4
|
+
var _ = require('lodash');
|
|
5
5
|
var constants = require('../constants.js');
|
|
6
6
|
var auditLogs = require('../audit-logs.js');
|
|
7
7
|
var index = require('../utils/index.js');
|
|
@@ -17,17 +17,14 @@ const getGroupName = (queryValue)=>{
|
|
|
17
17
|
case 'type':
|
|
18
18
|
return 'type';
|
|
19
19
|
case 'locale':
|
|
20
|
-
return ___default.default.
|
|
20
|
+
return (action)=>___default.default.get(action, 'locale.name', 'No locale');
|
|
21
21
|
default:
|
|
22
22
|
return 'contentType.displayName';
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
const createReleaseActionService = ({ strapi })=>{
|
|
26
26
|
const getLocalesDataForActions = async ()=>{
|
|
27
|
-
|
|
28
|
-
return {};
|
|
29
|
-
}
|
|
30
|
-
const allLocales = await strapi.plugin('i18n').service('locales').find() || [];
|
|
27
|
+
const allLocales = await strapi.localization.getLocales();
|
|
31
28
|
return allLocales.reduce((acc, locale)=>{
|
|
32
29
|
acc[locale.code] = {
|
|
33
30
|
name: locale.name,
|
|
@@ -190,7 +187,7 @@ const createReleaseActionService = ({ strapi })=>{
|
|
|
190
187
|
};
|
|
191
188
|
});
|
|
192
189
|
const groupName = getGroupName(groupBy);
|
|
193
|
-
return ___default.default.groupBy(groupName)
|
|
190
|
+
return ___default.default.groupBy(formattedData, groupName);
|
|
194
191
|
},
|
|
195
192
|
async getContentTypeModelsFromActions (actions) {
|
|
196
193
|
const contentTypeUids = actions.reduce((acc, action)=>{
|
|
@@ -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 { 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
|
+
{"version":3,"file":"release-action.js","sources":["../../../server/src/services/release-action.ts"],"sourcesContent":["import { errors, async } from '@strapi/utils';\n\nimport type { Core, Internal, Modules, UID, Data } from '@strapi/types';\n\nimport _ from 'lodash';\n\nimport { AUDITED_EVENTS, RELEASE_ACTION_MODEL_UID, RELEASE_MODEL_UID } from '../constants';\nimport { emitAuditOnCommit } from '../audit-logs';\n\nimport type {\n CreateReleaseAction,\n GetReleaseActions,\n ReleaseAction,\n ReleaseActionGroupBy,\n UpdateReleaseAction,\n DeleteReleaseAction,\n} from '../../../shared/contracts/release-actions';\nimport type { Entity } from '../../../shared/types';\nimport { getService, getDraftEntryValidStatus, getEntry, getEntryStatus } from '../utils';\n\nconst getGroupName = (queryValue: string) => {\n switch (queryValue) {\n case 'contentType':\n return 'contentType.displayName';\n case 'type':\n return 'type';\n case 'locale':\n return (action: { locale?: Locale | null }) => _.get(action, 'locale.name', 'No locale');\n default:\n return 'contentType.displayName';\n }\n};\n\nexport interface Locale extends Entity {\n name: string;\n code: string;\n}\n\ntype LocaleDictionary = {\n [key: Locale['code']]: Pick<Locale, 'name' | 'code'>;\n};\n\nconst createReleaseActionService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getLocalesDataForActions = async () => {\n const allLocales = await strapi.localization.getLocales();\n return allLocales.reduce<LocaleDictionary>((acc, locale) => {\n acc[locale.code] = { name: locale.name, code: locale.code };\n\n return acc;\n }, {});\n };\n\n const getContentTypesDataForActions = async (\n contentTypesUids: ReleaseAction['contentType'][]\n ) => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n\n const contentTypesData: Record<\n Internal.UID.ContentType,\n { mainField: string; displayName: string }\n > = {};\n for (const contentTypeUid of contentTypesUids) {\n const contentTypeConfig = await contentManagerContentTypeService.findConfiguration({\n uid: contentTypeUid,\n });\n\n contentTypesData[contentTypeUid] = {\n mainField: contentTypeConfig.settings.mainField,\n displayName: strapi.getModel(contentTypeUid).info.displayName,\n };\n }\n\n return contentTypesData;\n };\n\n return {\n async create(\n releaseId: CreateReleaseAction.Request['params']['releaseId'],\n action: CreateReleaseAction.Request['body'],\n { disableUpdateReleaseStatus = false }: { disableUpdateReleaseStatus?: boolean } = {}\n ) {\n const { validateEntryData, validateUniqueEntry } = getService('release-validation', {\n strapi,\n });\n\n await Promise.all([\n validateEntryData(action.contentType, action.entryDocumentId),\n validateUniqueEntry(releaseId, action),\n ]);\n\n // If we are adding a singleType, we need to append the documentId of that singleType\n const model = strapi.contentType(action.contentType);\n if (model.kind === 'singleType') {\n const document = await strapi.db.query(model.uid).findOne({ select: ['documentId'] });\n\n if (!document) {\n throw new errors.NotFoundError(`No entry found for contentType ${action.contentType}`);\n }\n\n action.entryDocumentId = document.documentId;\n }\n\n const release = await strapi.db\n .query(RELEASE_MODEL_UID)\n .findOne({ where: { id: releaseId } });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n if (release.releasedAt) {\n throw new errors.ValidationError('Release already published');\n }\n\n // If the action is a publish, check if the entry is valid\n // If the action is an unpublish, skip the validation\n const actionStatus =\n action.type === 'publish'\n ? await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n {\n strapi,\n }\n )\n : true;\n\n const releaseAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).create({\n data: {\n ...action,\n release: release.id,\n isEntryValid: actionStatus,\n },\n populate: { release: { select: ['id'] } },\n });\n\n if (!disableUpdateReleaseStatus) {\n getService('release', { strapi }).updateReleaseStatus(release.id);\n }\n\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_ADD, {\n releaseId: release.id,\n name: release.name,\n actionId: releaseAction.id,\n type: releaseAction.type,\n contentType: releaseAction.contentType,\n entryDocumentId: releaseAction.entryDocumentId,\n locale: releaseAction.locale,\n });\n\n return releaseAction;\n },\n\n async findPage(\n releaseId: GetReleaseActions.Request['params']['releaseId'],\n query?: GetReleaseActions.Request['query']\n ) {\n const release = await strapi.db.query(RELEASE_MODEL_UID).findOne({\n where: { id: releaseId },\n select: ['id'],\n });\n\n if (!release) {\n throw new errors.NotFoundError(`No release found for id ${releaseId}`);\n }\n\n const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n const { results: actions, pagination } = await strapi.db\n .query(RELEASE_ACTION_MODEL_UID)\n .findPage({\n ...dbQuery,\n where: {\n release: releaseId,\n },\n });\n\n // For each contentType on the release, we create a custom populate object for nested relations\n const populateBuilderService = strapi.plugin('content-manager').service('populate-builder');\n\n const actionsWithEntry = await async.map(actions, async (action: ReleaseAction) => {\n // @ts-expect-error - Core.Service type is not a function\n const populate = await populateBuilderService(action.contentType)\n .populateDeep(Infinity)\n .build();\n\n const entry = await getEntry(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n populate,\n status: action.type === 'publish' ? 'draft' : 'published',\n },\n { strapi }\n );\n\n return {\n ...action,\n entry,\n status: entry ? await getEntryStatus(action.contentType, entry) : null,\n };\n });\n\n return {\n results: actionsWithEntry,\n pagination,\n };\n },\n\n async groupActions(actions: ReleaseAction[], groupBy: ReleaseActionGroupBy) {\n const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n if (!acc.includes(action.contentType)) {\n acc.push(action.contentType);\n }\n\n return acc;\n }, []);\n const allReleaseContentTypesDictionary = await getContentTypesDataForActions(contentTypeUids);\n const allLocalesDictionary = await getLocalesDataForActions();\n\n const formattedData = actions.map((action: ReleaseAction) => {\n const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];\n\n return {\n ...action,\n locale: action.locale ? allLocalesDictionary[action.locale] : null,\n contentType: {\n displayName,\n mainFieldValue: action.entry[mainField],\n uid: action.contentType,\n },\n };\n });\n\n const groupName = getGroupName(groupBy);\n return _.groupBy(formattedData, groupName);\n },\n\n async getContentTypeModelsFromActions(actions: ReleaseAction[]) {\n const contentTypeUids = actions.reduce<ReleaseAction['contentType'][]>((acc, action) => {\n if (!acc.includes(action.contentType)) {\n acc.push(action.contentType);\n }\n\n return acc;\n }, []);\n\n const workflowsService = strapi.plugin('review-workflows').service('workflows');\n\n const contentTypeModelsMap = await async.reduce(contentTypeUids)(\n async (\n accPromise: Promise<GetReleaseActions.Response['meta']['contentTypes']>,\n contentTypeUid: ReleaseAction['contentType']\n ) => {\n const acc = await accPromise;\n const contentTypeModel = strapi.getModel(contentTypeUid);\n\n // Workflows service may not be available depending on the license\n const workflow = await workflowsService?.getAssignedWorkflow(contentTypeUid, {\n populate: 'stageRequiredToPublish',\n });\n\n acc[contentTypeUid] = {\n ...contentTypeModel,\n hasReviewWorkflow: !!workflow,\n stageRequiredToPublish: workflow?.stageRequiredToPublish,\n };\n\n return acc;\n },\n {}\n );\n\n return contentTypeModelsMap;\n },\n\n async countActions(\n query: Modules.EntityService.Params.Pick<typeof RELEASE_ACTION_MODEL_UID, 'filters'>\n ) {\n const dbQuery = strapi.get('query-params').transform(RELEASE_ACTION_MODEL_UID, query ?? {});\n\n return strapi.db.query(RELEASE_ACTION_MODEL_UID).count(dbQuery);\n },\n\n async update(\n actionId: UpdateReleaseAction.Request['params']['actionId'],\n releaseId: UpdateReleaseAction.Request['params']['releaseId'],\n update: UpdateReleaseAction.Request['body']\n ) {\n const action = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findOne({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n populate: { release: { select: ['id', 'name'] } },\n });\n\n if (!action) {\n throw new errors.NotFoundError(\n `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`\n );\n }\n\n const actionStatus =\n update.type === 'publish'\n ? await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n {\n strapi,\n }\n )\n : true;\n\n const updatedAction = await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n // Only the field the PUT contract allows. Changing the entry is remove + add.\n data: {\n type: update.type,\n isEntryValid: actionStatus,\n },\n });\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n // isEntryValid is recalculated, not edited: only the type change is audited\n if (updatedAction && action.type !== updatedAction.type) {\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_UPDATE, {\n releaseId: action.release?.id ?? Number(releaseId),\n name: action.release?.name,\n actionId: updatedAction.id,\n contentType: updatedAction.contentType,\n entryDocumentId: updatedAction.entryDocumentId,\n locale: updatedAction.locale,\n from: action.type,\n to: updatedAction.type,\n });\n }\n\n return updatedAction;\n },\n\n async delete(\n actionId: DeleteReleaseAction.Request['params']['actionId'],\n releaseId: DeleteReleaseAction.Request['params']['releaseId']\n ) {\n const deletedRow = await strapi.db.query(RELEASE_ACTION_MODEL_UID).delete({\n where: {\n id: actionId,\n release: {\n id: releaseId,\n releasedAt: {\n $null: true,\n },\n },\n },\n populate: { release: { select: ['id', 'name'] } },\n });\n\n if (!deletedRow) {\n throw new errors.NotFoundError(\n `Action with id ${actionId} not found in release with id ${releaseId} or it is already published`\n );\n }\n\n const { release: populatedRelease, ...deletedAction } = deletedRow;\n\n getService('release', { strapi }).updateReleaseStatus(releaseId);\n\n await emitAuditOnCommit({ strapi }, AUDITED_EVENTS.RELEASE_ENTRY_REMOVE, {\n releaseId: populatedRelease?.id ?? Number(releaseId),\n name: populatedRelease?.name,\n actionId: deletedAction.id,\n type: deletedAction.type,\n contentType: deletedAction.contentType,\n entryDocumentId: deletedAction.entryDocumentId,\n locale: deletedAction.locale,\n });\n\n return deletedAction;\n },\n\n async validateActionsByContentTypes(contentTypeUids: UID.ContentType[]) {\n const actions = await strapi.db.query(RELEASE_ACTION_MODEL_UID).findMany({\n where: {\n contentType: {\n $in: contentTypeUids,\n },\n // We only want to validate actions that are going to be published\n type: 'publish',\n release: {\n releasedAt: {\n $null: true,\n },\n },\n },\n populate: { release: true },\n });\n\n const releasesUpdated: Data.ID[] = [];\n\n await async.map(actions, async (action: ReleaseAction) => {\n const isValid = await getDraftEntryValidStatus(\n {\n contentType: action.contentType,\n documentId: action.entryDocumentId,\n locale: action.locale,\n },\n { strapi }\n );\n\n await strapi.db.query(RELEASE_ACTION_MODEL_UID).update({\n where: {\n id: action.id,\n },\n data: {\n isEntryValid: isValid,\n },\n });\n\n if (!releasesUpdated.includes(action.release.id)) {\n releasesUpdated.push(action.release.id);\n }\n\n return {\n id: action.id,\n isEntryValid: isValid,\n };\n });\n\n if (releasesUpdated.length > 0) {\n await async.map(releasesUpdated, async (releaseId: number) => {\n await getService('release', { strapi }).updateReleaseStatus(releaseId);\n });\n }\n },\n };\n};\n\nexport type ReleaseActionService = ReturnType<typeof createReleaseActionService>;\n\nexport default createReleaseActionService;\n"],"names":["getGroupName","queryValue","action","_","get","createReleaseActionService","strapi","getLocalesDataForActions","allLocales","localization","getLocales","reduce","acc","locale","code","name","getContentTypesDataForActions","contentTypesUids","contentManagerContentTypeService","plugin","service","contentTypesData","contentTypeUid","contentTypeConfig","findConfiguration","uid","mainField","settings","displayName","getModel","info","create","releaseId","disableUpdateReleaseStatus","validateEntryData","validateUniqueEntry","getService","Promise","all","contentType","entryDocumentId","model","kind","document","db","query","findOne","select","errors","NotFoundError","documentId","release","RELEASE_MODEL_UID","where","id","releasedAt","ValidationError","actionStatus","type","getDraftEntryValidStatus","releaseAction","RELEASE_ACTION_MODEL_UID","data","isEntryValid","populate","updateReleaseStatus","emitAuditOnCommit","AUDITED_EVENTS","RELEASE_ENTRY_ADD","actionId","findPage","dbQuery","transform","results","actions","pagination","populateBuilderService","actionsWithEntry","async","map","populateDeep","Infinity","build","entry","getEntry","status","getEntryStatus","groupActions","groupBy","contentTypeUids","includes","push","allReleaseContentTypesDictionary","allLocalesDictionary","formattedData","mainFieldValue","groupName","getContentTypeModelsFromActions","workflowsService","contentTypeModelsMap","accPromise","contentTypeModel","workflow","getAssignedWorkflow","hasReviewWorkflow","stageRequiredToPublish","countActions","count","update","$null","updatedAction","RELEASE_ENTRY_UPDATE","Number","from","to","delete","deletedRow","populatedRelease","deletedAction","RELEASE_ENTRY_REMOVE","validateActionsByContentTypes","findMany","$in","releasesUpdated","isValid","length"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { async, errors } from '@strapi/utils';
|
|
2
|
-
import _ from 'lodash
|
|
2
|
+
import _ from 'lodash';
|
|
3
3
|
import { RELEASE_ACTION_MODEL_UID, AUDITED_EVENTS, RELEASE_MODEL_UID } from '../constants.mjs';
|
|
4
4
|
import { emitAuditOnCommit } from '../audit-logs.mjs';
|
|
5
5
|
import { getDraftEntryValidStatus, getService, getEntry, getEntryStatus } from '../utils/index.mjs';
|
|
@@ -11,17 +11,14 @@ const getGroupName = (queryValue)=>{
|
|
|
11
11
|
case 'type':
|
|
12
12
|
return 'type';
|
|
13
13
|
case 'locale':
|
|
14
|
-
return _.
|
|
14
|
+
return (action)=>_.get(action, 'locale.name', 'No locale');
|
|
15
15
|
default:
|
|
16
16
|
return 'contentType.displayName';
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
19
|
const createReleaseActionService = ({ strapi })=>{
|
|
20
20
|
const getLocalesDataForActions = async ()=>{
|
|
21
|
-
|
|
22
|
-
return {};
|
|
23
|
-
}
|
|
24
|
-
const allLocales = await strapi.plugin('i18n').service('locales').find() || [];
|
|
21
|
+
const allLocales = await strapi.localization.getLocales();
|
|
25
22
|
return allLocales.reduce((acc, locale)=>{
|
|
26
23
|
acc[locale.code] = {
|
|
27
24
|
name: locale.name,
|
|
@@ -184,7 +181,7 @@ const createReleaseActionService = ({ strapi })=>{
|
|
|
184
181
|
};
|
|
185
182
|
});
|
|
186
183
|
const groupName = getGroupName(groupBy);
|
|
187
|
-
return _.groupBy(groupName)
|
|
184
|
+
return _.groupBy(formattedData, groupName);
|
|
188
185
|
},
|
|
189
186
|
async getContentTypeModelsFromActions (actions) {
|
|
190
187
|
const contentTypeUids = actions.reduce((acc, action)=>{
|