@strapi/content-releases 5.0.0-beta.1 → 5.0.0-beta.10
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/_chunks/{App-X01LBg5V.mjs → App-B2R2exNT.mjs} +245 -251
- package/dist/_chunks/App-B2R2exNT.mjs.map +1 -0
- package/dist/_chunks/{App-1LckaIGY.js → App-CEwOQkKT.js} +253 -260
- package/dist/_chunks/App-CEwOQkKT.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
- package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
- package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
- package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
- package/dist/_chunks/{en-RdapH-9X.mjs → en-B9Ur3VsE.mjs} +11 -2
- package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
- package/dist/_chunks/{en-faJDuv3q.js → en-DtFJ5ViE.js} +11 -2
- package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
- package/dist/_chunks/{index-cYWov2wa.js → index-BrWv-zV4.js} +167 -192
- package/dist/_chunks/index-BrWv-zV4.js.map +1 -0
- package/dist/_chunks/{index-OD9AlD-6.mjs → index-DbmynICx.mjs} +168 -191
- package/dist/_chunks/index-DbmynICx.mjs.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +2 -2
- package/dist/admin/src/components/CMReleasesContainer.d.ts +21 -0
- package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
- package/dist/admin/src/components/ReleaseActionMenu.d.ts +1 -1
- package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
- package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
- package/dist/admin/src/services/release.d.ts +44 -308
- package/dist/admin/src/utils/api.d.ts +6 -0
- package/dist/server/index.js +93 -32
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +93 -32
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/release-action.d.ts.map +1 -1
- package/dist/server/src/controllers/release.d.ts +1 -0
- package/dist/server/src/controllers/release.d.ts.map +1 -1
- package/dist/server/src/destroy.d.ts +1 -1
- package/dist/server/src/destroy.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +9 -8
- 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/register.d.ts +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/release.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -4
- package/dist/server/src/services/release.d.ts +3 -3
- package/dist/server/src/services/release.d.ts.map +1 -1
- package/dist/server/src/services/scheduling.d.ts +1 -1
- package/dist/server/src/services/scheduling.d.ts.map +1 -1
- package/dist/server/src/services/validation.d.ts +1 -1
- package/dist/server/src/services/validation.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +9 -9
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/releases.d.ts +17 -1
- package/dist/shared/contracts/releases.d.ts.map +1 -1
- package/package.json +18 -18
- package/dist/_chunks/App-1LckaIGY.js.map +0 -1
- package/dist/_chunks/App-X01LBg5V.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
- package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
- package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
- package/dist/_chunks/en-faJDuv3q.js.map +0 -1
- package/dist/_chunks/index-OD9AlD-6.mjs.map +0 -1
- package/dist/_chunks/index-cYWov2wa.js.map +0 -1
- package/dist/admin/src/services/axios.d.ts +0 -29
package/dist/server/index.mjs
CHANGED
|
@@ -53,10 +53,10 @@ const ACTIONS = [
|
|
|
53
53
|
const ALLOWED_WEBHOOK_EVENTS = {
|
|
54
54
|
RELEASES_PUBLISH: "releases.publish"
|
|
55
55
|
};
|
|
56
|
-
const getService = (name, { strapi: strapi2 }
|
|
56
|
+
const getService = (name, { strapi: strapi2 }) => {
|
|
57
57
|
return strapi2.plugin("content-releases").service(name);
|
|
58
58
|
};
|
|
59
|
-
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }
|
|
59
|
+
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
|
|
60
60
|
const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
|
|
61
61
|
const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
|
|
62
62
|
const entry = await strapi2.db.query(contentTypeUid).findOne({
|
|
@@ -65,7 +65,7 @@ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } =
|
|
|
65
65
|
});
|
|
66
66
|
return entry;
|
|
67
67
|
};
|
|
68
|
-
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }
|
|
68
|
+
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
|
|
69
69
|
try {
|
|
70
70
|
await strapi2.entityValidator.validateEntityCreation(
|
|
71
71
|
strapi2.getModel(contentTypeUid),
|
|
@@ -213,13 +213,16 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes: cont
|
|
|
213
213
|
if (!oldContentTypes) {
|
|
214
214
|
return;
|
|
215
215
|
}
|
|
216
|
+
const i18nPlugin = strapi.plugin("i18n");
|
|
217
|
+
if (!i18nPlugin) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
216
220
|
for (const uid in contentTypes2) {
|
|
217
221
|
if (!oldContentTypes[uid]) {
|
|
218
222
|
continue;
|
|
219
223
|
}
|
|
220
224
|
const oldContentType = oldContentTypes[uid];
|
|
221
225
|
const contentType = contentTypes2[uid];
|
|
222
|
-
const i18nPlugin = strapi.plugin("i18n");
|
|
223
226
|
const { isLocalizedContentType } = i18nPlugin.service("content-types");
|
|
224
227
|
if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {
|
|
225
228
|
await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
|
|
@@ -232,13 +235,16 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
|
|
|
232
235
|
if (!oldContentTypes) {
|
|
233
236
|
return;
|
|
234
237
|
}
|
|
238
|
+
const i18nPlugin = strapi.plugin("i18n");
|
|
239
|
+
if (!i18nPlugin) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
235
242
|
for (const uid in contentTypes2) {
|
|
236
243
|
if (!oldContentTypes[uid]) {
|
|
237
244
|
continue;
|
|
238
245
|
}
|
|
239
246
|
const oldContentType = oldContentTypes[uid];
|
|
240
247
|
const contentType = contentTypes2[uid];
|
|
241
|
-
const i18nPlugin = strapi.plugin("i18n");
|
|
242
248
|
const { isLocalizedContentType } = i18nPlugin.service("content-types");
|
|
243
249
|
const { getDefaultLocale } = i18nPlugin.service("locales");
|
|
244
250
|
if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {
|
|
@@ -251,7 +257,7 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
|
|
|
251
257
|
}
|
|
252
258
|
const register = async ({ strapi: strapi2 }) => {
|
|
253
259
|
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
254
|
-
await strapi2.admin
|
|
260
|
+
await strapi2.service("admin::permission").actionProvider.registerMany(ACTIONS);
|
|
255
261
|
strapi2.hook("strapi::content-types.beforeSync").register(disableContentTypeLocalized).register(deleteActionsOnDisableDraftAndPublish);
|
|
256
262
|
strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
|
|
257
263
|
}
|
|
@@ -384,7 +390,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
384
390
|
throw err;
|
|
385
391
|
});
|
|
386
392
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
|
387
|
-
strapi2.webhookStore.addAllowedEvent(key, value);
|
|
393
|
+
strapi2.get("webhookStore").addAllowedEvent(key, value);
|
|
388
394
|
});
|
|
389
395
|
}
|
|
390
396
|
};
|
|
@@ -651,12 +657,18 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
651
657
|
}
|
|
652
658
|
});
|
|
653
659
|
},
|
|
654
|
-
async findManyWithContentTypeEntryAttached(contentTypeUid,
|
|
660
|
+
async findManyWithContentTypeEntryAttached(contentTypeUid, entriesIds) {
|
|
661
|
+
let entries = entriesIds;
|
|
662
|
+
if (!Array.isArray(entriesIds)) {
|
|
663
|
+
entries = [entriesIds];
|
|
664
|
+
}
|
|
655
665
|
const releases = await strapi2.db.query(RELEASE_MODEL_UID).findMany({
|
|
656
666
|
where: {
|
|
657
667
|
actions: {
|
|
658
668
|
target_type: contentTypeUid,
|
|
659
|
-
target_id:
|
|
669
|
+
target_id: {
|
|
670
|
+
$in: entries
|
|
671
|
+
}
|
|
660
672
|
},
|
|
661
673
|
releasedAt: {
|
|
662
674
|
$null: true
|
|
@@ -667,18 +679,25 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
667
679
|
actions: {
|
|
668
680
|
where: {
|
|
669
681
|
target_type: contentTypeUid,
|
|
670
|
-
target_id:
|
|
682
|
+
target_id: {
|
|
683
|
+
$in: entries
|
|
684
|
+
}
|
|
685
|
+
},
|
|
686
|
+
populate: {
|
|
687
|
+
entry: {
|
|
688
|
+
select: ["id"]
|
|
689
|
+
}
|
|
671
690
|
}
|
|
672
691
|
}
|
|
673
692
|
}
|
|
674
693
|
});
|
|
675
694
|
return releases.map((release2) => {
|
|
676
695
|
if (release2.actions?.length) {
|
|
677
|
-
const
|
|
696
|
+
const actionsForEntry = release2.actions;
|
|
678
697
|
delete release2.actions;
|
|
679
698
|
return {
|
|
680
699
|
...release2,
|
|
681
|
-
|
|
700
|
+
actions: actionsForEntry
|
|
682
701
|
};
|
|
683
702
|
}
|
|
684
703
|
return release2;
|
|
@@ -826,9 +845,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
826
845
|
}
|
|
827
846
|
return acc;
|
|
828
847
|
}, []);
|
|
829
|
-
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
|
|
830
|
-
contentTypeUids
|
|
831
|
-
);
|
|
848
|
+
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(contentTypeUids);
|
|
832
849
|
const allLocalesDictionary = await this.getLocalesDataForActions();
|
|
833
850
|
const formattedData = actions.map((action) => {
|
|
834
851
|
const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
|
|
@@ -950,9 +967,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
950
967
|
}
|
|
951
968
|
try {
|
|
952
969
|
strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
|
|
953
|
-
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
|
|
954
|
-
releaseId
|
|
955
|
-
);
|
|
970
|
+
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(releaseId);
|
|
956
971
|
await strapi2.db.transaction(async () => {
|
|
957
972
|
for (const { uid, action, id } of singleTypeActions) {
|
|
958
973
|
await publishSingleTypeAction(uid, action, id);
|
|
@@ -1123,7 +1138,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
|
1123
1138
|
}
|
|
1124
1139
|
},
|
|
1125
1140
|
async validatePendingReleasesLimit() {
|
|
1126
|
-
const
|
|
1141
|
+
const featureCfg = strapi2.ee.features.get("cms-content-releases");
|
|
1142
|
+
const maximumPendingReleases = typeof featureCfg === "object" && featureCfg?.options?.maximumReleases || 3;
|
|
1127
1143
|
const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
|
|
1128
1144
|
filters: {
|
|
1129
1145
|
releasedAt: {
|
|
@@ -1166,7 +1182,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
|
|
|
1166
1182
|
}
|
|
1167
1183
|
const job = scheduleJob(scheduleDate, async () => {
|
|
1168
1184
|
try {
|
|
1169
|
-
await getService("release").publish(releaseId);
|
|
1185
|
+
await getService("release", { strapi: strapi2 }).publish(releaseId);
|
|
1170
1186
|
} catch (error) {
|
|
1171
1187
|
}
|
|
1172
1188
|
this.cancel(releaseId);
|
|
@@ -1236,7 +1252,7 @@ const RELEASE_SCHEMA = yup.object().shape({
|
|
|
1236
1252
|
const validateRelease = validateYupSchema(RELEASE_SCHEMA);
|
|
1237
1253
|
const releaseController = {
|
|
1238
1254
|
async findMany(ctx) {
|
|
1239
|
-
const permissionsManager = strapi.admin
|
|
1255
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1240
1256
|
ability: ctx.state.userAbility,
|
|
1241
1257
|
model: RELEASE_MODEL_UID
|
|
1242
1258
|
});
|
|
@@ -1286,7 +1302,7 @@ const releaseController = {
|
|
|
1286
1302
|
});
|
|
1287
1303
|
const sanitizedRelease = {
|
|
1288
1304
|
...release2,
|
|
1289
|
-
createdBy: release2.createdBy ? strapi.admin
|
|
1305
|
+
createdBy: release2.createdBy ? strapi.service("admin::user").sanitizeUser(release2.createdBy) : null
|
|
1290
1306
|
};
|
|
1291
1307
|
const data = {
|
|
1292
1308
|
...sanitizedRelease,
|
|
@@ -1298,19 +1314,48 @@ const releaseController = {
|
|
|
1298
1314
|
};
|
|
1299
1315
|
ctx.body = { data };
|
|
1300
1316
|
},
|
|
1317
|
+
async mapEntriesToReleases(ctx) {
|
|
1318
|
+
const { contentTypeUid, entriesIds } = ctx.query;
|
|
1319
|
+
if (!contentTypeUid || !entriesIds) {
|
|
1320
|
+
throw new errors.ValidationError("Missing required query parameters");
|
|
1321
|
+
}
|
|
1322
|
+
const releaseService = getService("release", { strapi });
|
|
1323
|
+
const releasesWithActions = await releaseService.findManyWithContentTypeEntryAttached(
|
|
1324
|
+
contentTypeUid,
|
|
1325
|
+
entriesIds
|
|
1326
|
+
);
|
|
1327
|
+
const mappedEntriesInReleases = releasesWithActions.reduce(
|
|
1328
|
+
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1329
|
+
(acc, release2) => {
|
|
1330
|
+
release2.actions.forEach((action) => {
|
|
1331
|
+
if (!acc[action.entry.id]) {
|
|
1332
|
+
acc[action.entry.id] = [{ id: release2.id, name: release2.name }];
|
|
1333
|
+
} else {
|
|
1334
|
+
acc[action.entry.id].push({ id: release2.id, name: release2.name });
|
|
1335
|
+
}
|
|
1336
|
+
});
|
|
1337
|
+
return acc;
|
|
1338
|
+
},
|
|
1339
|
+
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1340
|
+
{}
|
|
1341
|
+
);
|
|
1342
|
+
ctx.body = {
|
|
1343
|
+
data: mappedEntriesInReleases
|
|
1344
|
+
};
|
|
1345
|
+
},
|
|
1301
1346
|
async create(ctx) {
|
|
1302
1347
|
const user = ctx.state.user;
|
|
1303
1348
|
const releaseArgs = ctx.request.body;
|
|
1304
1349
|
await validateRelease(releaseArgs);
|
|
1305
1350
|
const releaseService = getService("release", { strapi });
|
|
1306
1351
|
const release2 = await releaseService.create(releaseArgs, { user });
|
|
1307
|
-
const permissionsManager = strapi.admin
|
|
1352
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1308
1353
|
ability: ctx.state.userAbility,
|
|
1309
1354
|
model: RELEASE_MODEL_UID
|
|
1310
1355
|
});
|
|
1311
|
-
ctx.
|
|
1356
|
+
ctx.created({
|
|
1312
1357
|
data: await permissionsManager.sanitizeOutput(release2)
|
|
1313
|
-
};
|
|
1358
|
+
});
|
|
1314
1359
|
},
|
|
1315
1360
|
async update(ctx) {
|
|
1316
1361
|
const user = ctx.state.user;
|
|
@@ -1319,7 +1364,7 @@ const releaseController = {
|
|
|
1319
1364
|
await validateRelease(releaseArgs);
|
|
1320
1365
|
const releaseService = getService("release", { strapi });
|
|
1321
1366
|
const release2 = await releaseService.update(id, releaseArgs, { user });
|
|
1322
|
-
const permissionsManager = strapi.admin
|
|
1367
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1323
1368
|
ability: ctx.state.userAbility,
|
|
1324
1369
|
model: RELEASE_MODEL_UID
|
|
1325
1370
|
});
|
|
@@ -1383,9 +1428,9 @@ const releaseActionController = {
|
|
|
1383
1428
|
await validateReleaseAction(releaseActionArgs);
|
|
1384
1429
|
const releaseService = getService("release", { strapi });
|
|
1385
1430
|
const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
|
|
1386
|
-
ctx.
|
|
1431
|
+
ctx.created({
|
|
1387
1432
|
data: releaseAction2
|
|
1388
|
-
};
|
|
1433
|
+
});
|
|
1389
1434
|
},
|
|
1390
1435
|
async createMany(ctx) {
|
|
1391
1436
|
const releaseId = ctx.params.releaseId;
|
|
@@ -1411,17 +1456,17 @@ const releaseActionController = {
|
|
|
1411
1456
|
return releaseActions2;
|
|
1412
1457
|
});
|
|
1413
1458
|
const newReleaseActions = releaseActions.filter((action) => action !== null);
|
|
1414
|
-
ctx.
|
|
1459
|
+
ctx.created({
|
|
1415
1460
|
data: newReleaseActions,
|
|
1416
1461
|
meta: {
|
|
1417
1462
|
entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
|
|
1418
1463
|
totalEntries: releaseActions.length
|
|
1419
1464
|
}
|
|
1420
|
-
};
|
|
1465
|
+
});
|
|
1421
1466
|
},
|
|
1422
1467
|
async findMany(ctx) {
|
|
1423
1468
|
const releaseId = ctx.params.releaseId;
|
|
1424
|
-
const permissionsManager = strapi.admin
|
|
1469
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1425
1470
|
ability: ctx.state.userAbility,
|
|
1426
1471
|
model: RELEASE_ACTION_MODEL_UID
|
|
1427
1472
|
});
|
|
@@ -1435,7 +1480,7 @@ const releaseActionController = {
|
|
|
1435
1480
|
if (acc[action.contentType]) {
|
|
1436
1481
|
return acc;
|
|
1437
1482
|
}
|
|
1438
|
-
const contentTypePermissionsManager = strapi.admin
|
|
1483
|
+
const contentTypePermissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1439
1484
|
ability: ctx.state.userAbility,
|
|
1440
1485
|
model: action.contentType
|
|
1441
1486
|
});
|
|
@@ -1487,6 +1532,22 @@ const controllers = { release: releaseController, "release-action": releaseActio
|
|
|
1487
1532
|
const release = {
|
|
1488
1533
|
type: "admin",
|
|
1489
1534
|
routes: [
|
|
1535
|
+
{
|
|
1536
|
+
method: "GET",
|
|
1537
|
+
path: "/mapEntriesToReleases",
|
|
1538
|
+
handler: "release.mapEntriesToReleases",
|
|
1539
|
+
config: {
|
|
1540
|
+
policies: [
|
|
1541
|
+
"admin::isAuthenticatedAdmin",
|
|
1542
|
+
{
|
|
1543
|
+
name: "admin::hasPermissions",
|
|
1544
|
+
config: {
|
|
1545
|
+
actions: ["plugin::content-releases.read"]
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
]
|
|
1549
|
+
}
|
|
1550
|
+
},
|
|
1490
1551
|
{
|
|
1491
1552
|
method: "POST",
|
|
1492
1553
|
path: "/",
|