Skip to content

Commit d04d04f

Browse files
Implemented variants entries bulk unpublish (#1521)
* Implemented variants entries bulk unpublish * Upgraded axios package * Removed secrets-scan.yml workflow file * Fixed PR comments * Fixed PR comments
1 parent a1d483e commit d04d04f

File tree

7 files changed

+118
-24
lines changed

7 files changed

+118
-24
lines changed

packages/contentstack-bulk-publish/README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,7 @@ Unpublish entries from the given environment
12771277
USAGE
12781278
$ csdx cm:entries:unpublish [-a <value>] [-k <value>] [-e <value>] [-c <value>] [-y] [--locale <value>] [--branch
12791279
<value>] [--retry-failed <value>] [--bulk-unpublish <value>] [--api-version <value>] [--content-type <value>]
1280-
[--delivery-token <value>]
1280+
[--delivery-token <value>] [--include-variants]
12811281
12821282
FLAGS
12831283
-a, --alias=<value> Alias(name) for the management token
@@ -1292,6 +1292,7 @@ FLAGS
12921292
bulkpublish API will be used to unpublish the entries
12931293
--content-type=<value> Content type filter
12941294
--delivery-token=<value> Delivery token for source environment
1295+
--include-variants Include Variants flag will unpublish all associated variant entries.
12951296
--locale=<value> Locale filter
12961297
--retry-failed=<value> Retry publishing failed entries from the logfile
12971298
@@ -1334,6 +1335,12 @@ EXAMPLES
13341335
Using --stack-api-key flag
13351336
13361337
$ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]
1338+
1339+
1340+
1341+
Using --include-variants flag
1342+
1343+
$ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] --include-variants
13371344
```
13381345

13391346
_See code: [src/commands/cm/entries/unpublish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js)_

packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class UnpublishCommand extends Command {
1919
unpublishFlags.onlyAssets = false;
2020
unpublishFlags.onlyEntries = true;
2121
unpublishFlags.apiVersion = unpublishFlags['api-version'] || '3';
22+
unpublishFlags.includeVariants = unpublishFlags['include-variants'];
2223
delete unpublishFlags['api-version'];
2324
delete unpublishFlags['retry-failed'];
2425
delete unpublishFlags['bulk-unpublish'];
@@ -59,7 +60,7 @@ class UnpublishCommand extends Command {
5960
updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment');
6061
}
6162
updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true;
62-
63+
updatedFlags.includeVariantsFlag = updatedFlags.includeVariants;
6364
stack = await getStack(config);
6465
}
6566
if (!updatedFlags.deliveryToken && updatedFlags.deliveryToken.length === 0) {
@@ -177,6 +178,10 @@ UnpublishCommand.flags = {
177178
'delivery-token': flags.string({
178179
description: 'Delivery token for source environment',
179180
}),
181+
'include-variants': flags.boolean({
182+
default: false, // set the default value to false
183+
description: 'Include Variants flag will unpublish all associated variant entries.'
184+
}),
180185
};
181186

182187
UnpublishCommand.examples = [
@@ -196,6 +201,9 @@ UnpublishCommand.examples = [
196201
'',
197202
'Using --stack-api-key flag',
198203
'csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]',
204+
'',
205+
'Using --include-variants flag',
206+
'csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] --include-variants',
199207
];
200208

201209
module.exports = UnpublishCommand;

packages/contentstack-bulk-publish/src/producer/unpublish.js

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const assetQueue = getQueue();
1515
const { Command } = require('@contentstack/cli-command');
1616
const command = new Command();
1717
const { isEmpty } = require('../util');
18+
const VARIANTS_UNPUBLISH_API_VERSION = '3.2';
1819

1920
let bulkUnPublishSet = [];
2021
let bulkUnPulishAssetSet = [];
@@ -50,19 +51,25 @@ function getQueryParams(filter) {
5051
return queryString;
5152
}
5253

53-
function bulkAction(stack, items, bulkUnpublish, environment, locale, apiVersion) {
54+
function bulkAction(stack, items, bulkUnpublish, environment, locale, apiVersion, variantsFlag) {
5455
return new Promise(async (resolve) => {
5556
for (let index = 0; index < items.length; index++) {
5657
changedFlag = true;
5758

5859
if (bulkUnpublish) {
5960
if (bulkUnPublishSet.length < 10 && items[index].type === 'entry_published') {
60-
bulkUnPublishSet.push({
61+
const entryData = {
6162
uid: items[index].data.uid,
6263
content_type: items[index].content_type_uid,
6364
locale: items[index].data.locale || 'en-us',
64-
publish_details: [items[index].data.publish_details] || [],
65-
});
65+
publish_details: items[index].data.publish_details || [],
66+
};
67+
68+
if (variantsFlag) {
69+
entryData.publish_with_base_entry = true;
70+
entryData.variants = items[index].data.variants;
71+
}
72+
bulkUnPublishSet.push(entryData);
6673
}
6774

6875
if (bulkUnPulishAssetSet.length < 10 && items[index].type === 'asset_published') {
@@ -155,6 +162,7 @@ async function getSyncEntries(
155162
environment,
156163
deliveryToken,
157164
apiVersion,
165+
variantsFlag,
158166
paginationToken = null,
159167
) {
160168
return new Promise(async (resolve, reject) => {
@@ -202,11 +210,15 @@ async function getSyncEntries(
202210
syncData['type'] = queryParamsObj.type;
203211
}
204212

205-
const entriesResponse = await Stack.sync(syncData);
206-
213+
let entriesResponse = await Stack.sync(syncData);
207214
if (entriesResponse.items.length > 0) {
208-
await bulkAction(stack, entriesResponse.items, bulkUnpublish, environment, locale, apiVersion);
215+
if (variantsFlag) {
216+
queryParamsObj.apiVersion = VARIANTS_UNPUBLISH_API_VERSION;
217+
entriesResponse.items = await attachVariantsToItems(stack, entriesResponse.items, queryParamsObj); // with variants data
218+
}
219+
await bulkAction(stack, entriesResponse.items, bulkUnpublish, environment, locale, apiVersion, variantsFlag);
209220
}
221+
210222
if (entriesResponse.items.length === 0) {
211223
if (!changedFlag) console.log('No Entries/Assets Found published on specified environment');
212224
return resolve();
@@ -230,6 +242,53 @@ async function getSyncEntries(
230242
});
231243
}
232244

245+
async function attachVariantsToItems(stack, items, queryParams) {
246+
for (const item of items) {
247+
const { content_type_uid, data } = item;
248+
const variantEntries = await getVariantEntries(stack, content_type_uid, item, queryParams); // Fetch the variants using fetchVariants method
249+
item.data.variants = variantEntries; // Attach the fetched variants to the data object in the item
250+
}
251+
return items;
252+
}
253+
254+
async function getVariantEntries(stack, contentType, entries, queryParams, skip = 0) {
255+
try {
256+
let variantQueryParams = {
257+
locale: queryParams.locale || 'en-us',
258+
include_count: true,
259+
skip: skip, // Adding skip parameter for pagination
260+
limit: 100, // Set a limit to fetch up to 100 entries per request
261+
};
262+
263+
const variantsEntriesResponse = await stack
264+
.contentType(contentType)
265+
.entry(entries.data.uid)
266+
.variants()
267+
.query(variantQueryParams)
268+
.find();
269+
270+
// Map the response items to extract variant UIDs
271+
const variants = variantsEntriesResponse.items.map(entry => ({
272+
uid: entry.variants_uid,
273+
}));
274+
275+
// Check if there are more entries to fetch
276+
if (variantsEntriesResponse.items.length === variantQueryParams.limit) {
277+
// Recursively fetch the next set of variants with updated skip value
278+
const nextVariants = await getVariantEntries(stack, contentType, entries, queryParams, skip + variantQueryParams.limit);
279+
280+
// Ensure nextVariants is an array before concatenation
281+
return Array.isArray(nextVariants) ? variants.concat(nextVariants) : variants;
282+
}
283+
284+
return variants;
285+
} catch (error) {
286+
// Handle error message retrieval from different properties
287+
const errorMessage = error?.errorMessage || error?.message || error?.errors || 'Falied to fetch the variant entries, Please contact the admin for support.';
288+
throw new Error(`Error fetching variants: ${errorMessage}`);
289+
}
290+
}
291+
233292
async function start(
234293
{
235294
retryFailed,
@@ -242,6 +301,7 @@ async function start(
242301
onlyEntries,
243302
f_types,
244303
apiVersion,
304+
includeVariantsFlag,
245305
},
246306
stack,
247307
config,
@@ -256,7 +316,9 @@ async function start(
256316
}
257317
process.exit(0);
258318
});
259-
319+
if (includeVariantsFlag) {
320+
apiVersion = VARIANTS_UNPUBLISH_API_VERSION;
321+
}
260322
if (retryFailed) {
261323
if (typeof retryFailed === 'string' && retryFailed.length > 0) {
262324
if (!validateFile(retryFailed, ['unpublish', 'bulk-unpublish'])) {
@@ -294,7 +356,7 @@ async function start(
294356
}
295357
setConfig(config, bulkUnpublish);
296358
const queryParams = getQueryParams(filter);
297-
await getSyncEntries(stack, config, locale, queryParams, bulkUnpublish, environment, deliveryToken, apiVersion);
359+
await getSyncEntries(stack, config, locale, queryParams, bulkUnpublish, environment, deliveryToken, apiVersion, includeVariantsFlag);
298360
}
299361
}
300362

packages/contentstack-utilities/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@contentstack/cli-utilities",
3-
"version": "1.7.1",
3+
"version": "1.7.2",
44
"description": "Utilities for contentstack projects",
55
"main": "lib/index.js",
66
"types": "lib/index.d.ts",
@@ -35,7 +35,7 @@
3535
"@contentstack/management": "~1.17.0",
3636
"@contentstack/marketplace-sdk": "^1.2.1",
3737
"@oclif/core": "^3.26.5",
38-
"axios": "^1.6.4",
38+
"axios": "^1.7.4",
3939
"chalk": "^4.0.0",
4040
"cli-cursor": "^3.1.0",
4141
"cli-table": "^0.3.11",

packages/contentstack/README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1851,7 +1851,7 @@ Unpublish entries from the given environment
18511851
USAGE
18521852
$ csdx cm:entries:unpublish [-a <value>] [-k <value>] [-e <value>] [-c <value>] [-y] [--locale <value>] [--branch
18531853
<value>] [--retry-failed <value>] [--bulk-unpublish <value>] [--api-version <value>] [--content-type <value>]
1854-
[--delivery-token <value>]
1854+
[--delivery-token <value>] [--include-variants]
18551855
18561856
FLAGS
18571857
-a, --alias=<value> Alias(name) for the management token
@@ -1866,6 +1866,7 @@ FLAGS
18661866
bulkpublish API will be used to unpublish the entries
18671867
--content-type=<value> Content type filter
18681868
--delivery-token=<value> Delivery token for source environment
1869+
--include-variants Include Variants flag will unpublish all associated variant entries.
18691870
--locale=<value> Locale filter
18701871
--retry-failed=<value> Retry publishing failed entries from the logfile
18711872
@@ -1908,6 +1909,12 @@ EXAMPLES
19081909
Using --stack-api-key flag
19091910
19101911
$ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]
1912+
1913+
1914+
1915+
Using --include-variants flag
1916+
1917+
$ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] --include-variants
19111918
```
19121919

19131920
_See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js)_

packages/contentstack/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"@contentstack/cli-config": "~1.6.5",
3838
"@contentstack/cli-launch": "~1.1.0",
3939
"@contentstack/cli-migration": "~1.6.1",
40-
"@contentstack/cli-utilities": "~1.7.1",
40+
"@contentstack/cli-utilities": "~1.7.2",
4141
"@contentstack/management": "~1.17.0",
4242
"@oclif/core": "^3.26.5",
4343
"@oclif/plugin-help": "^5",

pnpm-lock.yaml

Lines changed: 19 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)