@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.js
CHANGED
|
@@ -76,10 +76,10 @@ const ACTIONS = [
|
|
|
76
76
|
const ALLOWED_WEBHOOK_EVENTS = {
|
|
77
77
|
RELEASES_PUBLISH: "releases.publish"
|
|
78
78
|
};
|
|
79
|
-
const getService = (name, { strapi: strapi2 }
|
|
79
|
+
const getService = (name, { strapi: strapi2 }) => {
|
|
80
80
|
return strapi2.plugin("content-releases").service(name);
|
|
81
81
|
};
|
|
82
|
-
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }
|
|
82
|
+
const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 }) => {
|
|
83
83
|
const populateBuilderService = strapi2.plugin("content-manager").service("populate-builder");
|
|
84
84
|
const populate = await populateBuilderService(contentTypeUid).populateDeep(Infinity).build();
|
|
85
85
|
const entry = await strapi2.db.query(contentTypeUid).findOne({
|
|
@@ -88,7 +88,7 @@ const getPopulatedEntry = async (contentTypeUid, entryId, { strapi: strapi2 } =
|
|
|
88
88
|
});
|
|
89
89
|
return entry;
|
|
90
90
|
};
|
|
91
|
-
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }
|
|
91
|
+
const getEntryValidStatus = async (contentTypeUid, entry, { strapi: strapi2 }) => {
|
|
92
92
|
try {
|
|
93
93
|
await strapi2.entityValidator.validateEntityCreation(
|
|
94
94
|
strapi2.getModel(contentTypeUid),
|
|
@@ -236,13 +236,16 @@ async function disableContentTypeLocalized({ oldContentTypes, contentTypes: cont
|
|
|
236
236
|
if (!oldContentTypes) {
|
|
237
237
|
return;
|
|
238
238
|
}
|
|
239
|
+
const i18nPlugin = strapi.plugin("i18n");
|
|
240
|
+
if (!i18nPlugin) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
239
243
|
for (const uid in contentTypes2) {
|
|
240
244
|
if (!oldContentTypes[uid]) {
|
|
241
245
|
continue;
|
|
242
246
|
}
|
|
243
247
|
const oldContentType = oldContentTypes[uid];
|
|
244
248
|
const contentType = contentTypes2[uid];
|
|
245
|
-
const i18nPlugin = strapi.plugin("i18n");
|
|
246
249
|
const { isLocalizedContentType } = i18nPlugin.service("content-types");
|
|
247
250
|
if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {
|
|
248
251
|
await strapi.db.queryBuilder(RELEASE_ACTION_MODEL_UID).update({
|
|
@@ -255,13 +258,16 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
|
|
|
255
258
|
if (!oldContentTypes) {
|
|
256
259
|
return;
|
|
257
260
|
}
|
|
261
|
+
const i18nPlugin = strapi.plugin("i18n");
|
|
262
|
+
if (!i18nPlugin) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
258
265
|
for (const uid in contentTypes2) {
|
|
259
266
|
if (!oldContentTypes[uid]) {
|
|
260
267
|
continue;
|
|
261
268
|
}
|
|
262
269
|
const oldContentType = oldContentTypes[uid];
|
|
263
270
|
const contentType = contentTypes2[uid];
|
|
264
|
-
const i18nPlugin = strapi.plugin("i18n");
|
|
265
271
|
const { isLocalizedContentType } = i18nPlugin.service("content-types");
|
|
266
272
|
const { getDefaultLocale } = i18nPlugin.service("locales");
|
|
267
273
|
if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {
|
|
@@ -274,7 +280,7 @@ async function enableContentTypeLocalized({ oldContentTypes, contentTypes: conte
|
|
|
274
280
|
}
|
|
275
281
|
const register = async ({ strapi: strapi2 }) => {
|
|
276
282
|
if (strapi2.ee.features.isEnabled("cms-content-releases")) {
|
|
277
|
-
await strapi2.admin
|
|
283
|
+
await strapi2.service("admin::permission").actionProvider.registerMany(ACTIONS);
|
|
278
284
|
strapi2.hook("strapi::content-types.beforeSync").register(disableContentTypeLocalized).register(deleteActionsOnDisableDraftAndPublish);
|
|
279
285
|
strapi2.hook("strapi::content-types.afterSync").register(deleteActionsOnDeleteContentType).register(enableContentTypeLocalized).register(revalidateChangedContentTypes).register(migrateIsValidAndStatusReleases);
|
|
280
286
|
}
|
|
@@ -407,7 +413,7 @@ const bootstrap = async ({ strapi: strapi2 }) => {
|
|
|
407
413
|
throw err;
|
|
408
414
|
});
|
|
409
415
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
|
410
|
-
strapi2.webhookStore.addAllowedEvent(key, value);
|
|
416
|
+
strapi2.get("webhookStore").addAllowedEvent(key, value);
|
|
411
417
|
});
|
|
412
418
|
}
|
|
413
419
|
};
|
|
@@ -674,12 +680,18 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
674
680
|
}
|
|
675
681
|
});
|
|
676
682
|
},
|
|
677
|
-
async findManyWithContentTypeEntryAttached(contentTypeUid,
|
|
683
|
+
async findManyWithContentTypeEntryAttached(contentTypeUid, entriesIds) {
|
|
684
|
+
let entries = entriesIds;
|
|
685
|
+
if (!Array.isArray(entriesIds)) {
|
|
686
|
+
entries = [entriesIds];
|
|
687
|
+
}
|
|
678
688
|
const releases = await strapi2.db.query(RELEASE_MODEL_UID).findMany({
|
|
679
689
|
where: {
|
|
680
690
|
actions: {
|
|
681
691
|
target_type: contentTypeUid,
|
|
682
|
-
target_id:
|
|
692
|
+
target_id: {
|
|
693
|
+
$in: entries
|
|
694
|
+
}
|
|
683
695
|
},
|
|
684
696
|
releasedAt: {
|
|
685
697
|
$null: true
|
|
@@ -690,18 +702,25 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
690
702
|
actions: {
|
|
691
703
|
where: {
|
|
692
704
|
target_type: contentTypeUid,
|
|
693
|
-
target_id:
|
|
705
|
+
target_id: {
|
|
706
|
+
$in: entries
|
|
707
|
+
}
|
|
708
|
+
},
|
|
709
|
+
populate: {
|
|
710
|
+
entry: {
|
|
711
|
+
select: ["id"]
|
|
712
|
+
}
|
|
694
713
|
}
|
|
695
714
|
}
|
|
696
715
|
}
|
|
697
716
|
});
|
|
698
717
|
return releases.map((release2) => {
|
|
699
718
|
if (release2.actions?.length) {
|
|
700
|
-
const
|
|
719
|
+
const actionsForEntry = release2.actions;
|
|
701
720
|
delete release2.actions;
|
|
702
721
|
return {
|
|
703
722
|
...release2,
|
|
704
|
-
|
|
723
|
+
actions: actionsForEntry
|
|
705
724
|
};
|
|
706
725
|
}
|
|
707
726
|
return release2;
|
|
@@ -849,9 +868,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
849
868
|
}
|
|
850
869
|
return acc;
|
|
851
870
|
}, []);
|
|
852
|
-
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(
|
|
853
|
-
contentTypeUids
|
|
854
|
-
);
|
|
871
|
+
const allReleaseContentTypesDictionary = await this.getContentTypesDataForActions(contentTypeUids);
|
|
855
872
|
const allLocalesDictionary = await this.getLocalesDataForActions();
|
|
856
873
|
const formattedData = actions.map((action) => {
|
|
857
874
|
const { mainField, displayName } = allReleaseContentTypesDictionary[action.contentType];
|
|
@@ -973,9 +990,7 @@ const createReleaseService = ({ strapi: strapi2 }) => {
|
|
|
973
990
|
}
|
|
974
991
|
try {
|
|
975
992
|
strapi2.log.info(`[Content Releases] Starting to publish release ${lockedRelease.name}`);
|
|
976
|
-
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(
|
|
977
|
-
releaseId
|
|
978
|
-
);
|
|
993
|
+
const { collectionTypeActions, singleTypeActions } = await getFormattedActions(releaseId);
|
|
979
994
|
await strapi2.db.transaction(async () => {
|
|
980
995
|
for (const { uid, action, id } of singleTypeActions) {
|
|
981
996
|
await publishSingleTypeAction(uid, action, id);
|
|
@@ -1146,7 +1161,8 @@ const createReleaseValidationService = ({ strapi: strapi2 }) => ({
|
|
|
1146
1161
|
}
|
|
1147
1162
|
},
|
|
1148
1163
|
async validatePendingReleasesLimit() {
|
|
1149
|
-
const
|
|
1164
|
+
const featureCfg = strapi2.ee.features.get("cms-content-releases");
|
|
1165
|
+
const maximumPendingReleases = typeof featureCfg === "object" && featureCfg?.options?.maximumReleases || 3;
|
|
1150
1166
|
const [, pendingReleasesCount] = await strapi2.db.query(RELEASE_MODEL_UID).findWithCount({
|
|
1151
1167
|
filters: {
|
|
1152
1168
|
releasedAt: {
|
|
@@ -1189,7 +1205,7 @@ const createSchedulingService = ({ strapi: strapi2 }) => {
|
|
|
1189
1205
|
}
|
|
1190
1206
|
const job = nodeSchedule.scheduleJob(scheduleDate, async () => {
|
|
1191
1207
|
try {
|
|
1192
|
-
await getService("release").publish(releaseId);
|
|
1208
|
+
await getService("release", { strapi: strapi2 }).publish(releaseId);
|
|
1193
1209
|
} catch (error) {
|
|
1194
1210
|
}
|
|
1195
1211
|
this.cancel(releaseId);
|
|
@@ -1259,7 +1275,7 @@ const RELEASE_SCHEMA = yup__namespace.object().shape({
|
|
|
1259
1275
|
const validateRelease = utils.validateYupSchema(RELEASE_SCHEMA);
|
|
1260
1276
|
const releaseController = {
|
|
1261
1277
|
async findMany(ctx) {
|
|
1262
|
-
const permissionsManager = strapi.admin
|
|
1278
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1263
1279
|
ability: ctx.state.userAbility,
|
|
1264
1280
|
model: RELEASE_MODEL_UID
|
|
1265
1281
|
});
|
|
@@ -1309,7 +1325,7 @@ const releaseController = {
|
|
|
1309
1325
|
});
|
|
1310
1326
|
const sanitizedRelease = {
|
|
1311
1327
|
...release2,
|
|
1312
|
-
createdBy: release2.createdBy ? strapi.admin
|
|
1328
|
+
createdBy: release2.createdBy ? strapi.service("admin::user").sanitizeUser(release2.createdBy) : null
|
|
1313
1329
|
};
|
|
1314
1330
|
const data = {
|
|
1315
1331
|
...sanitizedRelease,
|
|
@@ -1321,19 +1337,48 @@ const releaseController = {
|
|
|
1321
1337
|
};
|
|
1322
1338
|
ctx.body = { data };
|
|
1323
1339
|
},
|
|
1340
|
+
async mapEntriesToReleases(ctx) {
|
|
1341
|
+
const { contentTypeUid, entriesIds } = ctx.query;
|
|
1342
|
+
if (!contentTypeUid || !entriesIds) {
|
|
1343
|
+
throw new utils.errors.ValidationError("Missing required query parameters");
|
|
1344
|
+
}
|
|
1345
|
+
const releaseService = getService("release", { strapi });
|
|
1346
|
+
const releasesWithActions = await releaseService.findManyWithContentTypeEntryAttached(
|
|
1347
|
+
contentTypeUid,
|
|
1348
|
+
entriesIds
|
|
1349
|
+
);
|
|
1350
|
+
const mappedEntriesInReleases = releasesWithActions.reduce(
|
|
1351
|
+
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1352
|
+
(acc, release2) => {
|
|
1353
|
+
release2.actions.forEach((action) => {
|
|
1354
|
+
if (!acc[action.entry.id]) {
|
|
1355
|
+
acc[action.entry.id] = [{ id: release2.id, name: release2.name }];
|
|
1356
|
+
} else {
|
|
1357
|
+
acc[action.entry.id].push({ id: release2.id, name: release2.name });
|
|
1358
|
+
}
|
|
1359
|
+
});
|
|
1360
|
+
return acc;
|
|
1361
|
+
},
|
|
1362
|
+
// TODO: Fix for v5 removed mappedEntriedToRelease
|
|
1363
|
+
{}
|
|
1364
|
+
);
|
|
1365
|
+
ctx.body = {
|
|
1366
|
+
data: mappedEntriesInReleases
|
|
1367
|
+
};
|
|
1368
|
+
},
|
|
1324
1369
|
async create(ctx) {
|
|
1325
1370
|
const user = ctx.state.user;
|
|
1326
1371
|
const releaseArgs = ctx.request.body;
|
|
1327
1372
|
await validateRelease(releaseArgs);
|
|
1328
1373
|
const releaseService = getService("release", { strapi });
|
|
1329
1374
|
const release2 = await releaseService.create(releaseArgs, { user });
|
|
1330
|
-
const permissionsManager = strapi.admin
|
|
1375
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1331
1376
|
ability: ctx.state.userAbility,
|
|
1332
1377
|
model: RELEASE_MODEL_UID
|
|
1333
1378
|
});
|
|
1334
|
-
ctx.
|
|
1379
|
+
ctx.created({
|
|
1335
1380
|
data: await permissionsManager.sanitizeOutput(release2)
|
|
1336
|
-
};
|
|
1381
|
+
});
|
|
1337
1382
|
},
|
|
1338
1383
|
async update(ctx) {
|
|
1339
1384
|
const user = ctx.state.user;
|
|
@@ -1342,7 +1387,7 @@ const releaseController = {
|
|
|
1342
1387
|
await validateRelease(releaseArgs);
|
|
1343
1388
|
const releaseService = getService("release", { strapi });
|
|
1344
1389
|
const release2 = await releaseService.update(id, releaseArgs, { user });
|
|
1345
|
-
const permissionsManager = strapi.admin
|
|
1390
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1346
1391
|
ability: ctx.state.userAbility,
|
|
1347
1392
|
model: RELEASE_MODEL_UID
|
|
1348
1393
|
});
|
|
@@ -1406,9 +1451,9 @@ const releaseActionController = {
|
|
|
1406
1451
|
await validateReleaseAction(releaseActionArgs);
|
|
1407
1452
|
const releaseService = getService("release", { strapi });
|
|
1408
1453
|
const releaseAction2 = await releaseService.createAction(releaseId, releaseActionArgs);
|
|
1409
|
-
ctx.
|
|
1454
|
+
ctx.created({
|
|
1410
1455
|
data: releaseAction2
|
|
1411
|
-
};
|
|
1456
|
+
});
|
|
1412
1457
|
},
|
|
1413
1458
|
async createMany(ctx) {
|
|
1414
1459
|
const releaseId = ctx.params.releaseId;
|
|
@@ -1434,17 +1479,17 @@ const releaseActionController = {
|
|
|
1434
1479
|
return releaseActions2;
|
|
1435
1480
|
});
|
|
1436
1481
|
const newReleaseActions = releaseActions.filter((action) => action !== null);
|
|
1437
|
-
ctx.
|
|
1482
|
+
ctx.created({
|
|
1438
1483
|
data: newReleaseActions,
|
|
1439
1484
|
meta: {
|
|
1440
1485
|
entriesAlreadyInRelease: releaseActions.length - newReleaseActions.length,
|
|
1441
1486
|
totalEntries: releaseActions.length
|
|
1442
1487
|
}
|
|
1443
|
-
};
|
|
1488
|
+
});
|
|
1444
1489
|
},
|
|
1445
1490
|
async findMany(ctx) {
|
|
1446
1491
|
const releaseId = ctx.params.releaseId;
|
|
1447
|
-
const permissionsManager = strapi.admin
|
|
1492
|
+
const permissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1448
1493
|
ability: ctx.state.userAbility,
|
|
1449
1494
|
model: RELEASE_ACTION_MODEL_UID
|
|
1450
1495
|
});
|
|
@@ -1458,7 +1503,7 @@ const releaseActionController = {
|
|
|
1458
1503
|
if (acc[action.contentType]) {
|
|
1459
1504
|
return acc;
|
|
1460
1505
|
}
|
|
1461
|
-
const contentTypePermissionsManager = strapi.admin
|
|
1506
|
+
const contentTypePermissionsManager = strapi.service("admin::permission").createPermissionsManager({
|
|
1462
1507
|
ability: ctx.state.userAbility,
|
|
1463
1508
|
model: action.contentType
|
|
1464
1509
|
});
|
|
@@ -1510,6 +1555,22 @@ const controllers = { release: releaseController, "release-action": releaseActio
|
|
|
1510
1555
|
const release = {
|
|
1511
1556
|
type: "admin",
|
|
1512
1557
|
routes: [
|
|
1558
|
+
{
|
|
1559
|
+
method: "GET",
|
|
1560
|
+
path: "/mapEntriesToReleases",
|
|
1561
|
+
handler: "release.mapEntriesToReleases",
|
|
1562
|
+
config: {
|
|
1563
|
+
policies: [
|
|
1564
|
+
"admin::isAuthenticatedAdmin",
|
|
1565
|
+
{
|
|
1566
|
+
name: "admin::hasPermissions",
|
|
1567
|
+
config: {
|
|
1568
|
+
actions: ["plugin::content-releases.read"]
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
]
|
|
1572
|
+
}
|
|
1573
|
+
},
|
|
1513
1574
|
{
|
|
1514
1575
|
method: "POST",
|
|
1515
1576
|
path: "/",
|