@@ -15,6 +15,7 @@ const assetQueue = getQueue();
1515const { Command } = require ( '@contentstack/cli-command' ) ;
1616const command = new Command ( ) ;
1717const { isEmpty } = require ( '../util' ) ;
18+ const VARIANTS_UNPUBLISH_API_VERSION = '3.2' ;
1819
1920let bulkUnPublishSet = [ ] ;
2021let 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+
233292async 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
0 commit comments