@@ -15,6 +15,7 @@ const assetQueue = getQueue();
1515const { Command } = require ( '@contentstack/cli-command' ) ;
1616const command = new Command ( ) ;
1717const { isEmpty } = require ( '../util' ) ;
18+ const VARIANTS_PUBLISH_API_VERSION = '3.2' ;
1819
1920let bulkPublishSet = [ ] ;
2021let bulkPublishAssetSet = [ ] ;
@@ -33,20 +34,27 @@ function getQueryParams(filter) {
3334 return queryString ;
3435}
3536
36- async function bulkAction ( stack , items , bulkPublish , filter , destEnv , apiVersion ) {
37+ async function bulkAction ( stack , items , bulkPublish , filter , destEnv , apiVersion , variantsFlag = false ) {
3738 return new Promise ( async ( resolve ) => {
3839 for ( let index = 0 ; index < items . length ; index ++ ) {
3940 changedFlag = true ;
4041
4142 if ( bulkPublish ) {
4243 if ( bulkPublishSet . length < 10 && items [ index ] . type === 'entry_published' ) {
43- bulkPublishSet . push ( {
44+ const entry = {
4445 uid : items [ index ] . data . uid ,
4546 content_type : items [ index ] . content_type_uid ,
4647 locale : items [ index ] . data . locale || 'en-us' ,
4748 version : items [ index ] . data . _version ,
4849 publish_details : [ items [ index ] . data . publish_details ] || [ ] ,
49- } ) ;
50+ } ;
51+
52+ if ( variantsFlag ) {
53+ entry . variants = items [ index ] . data . variants || [ ] ;
54+ entry . publish_with_base_entry = true ;
55+ }
56+
57+ bulkPublishSet . push ( JSON . parse ( JSON . stringify ( entry ) ) ) ;
5058 }
5159
5260 if ( bulkPublishAssetSet . length < 10 && items [ index ] . type === 'asset_published' ) {
@@ -143,6 +151,7 @@ async function getSyncEntries(
143151 deliveryToken ,
144152 destEnv ,
145153 apiVersion ,
154+ variantsFlag = false ,
146155 paginationToken = null ,
147156) {
148157 return new Promise ( async ( resolve , reject ) => {
@@ -198,8 +207,18 @@ async function getSyncEntries(
198207 ) ;
199208 }
200209
210+ if ( variantsFlag ) {
211+ for ( let index = 0 ; index < entriesResponse ?. items ?. length ; index ++ ) {
212+ let variants = [ ] ;
213+ variants = await getVariantEntries ( stack , entries [ index ] . content_type_uid , entries , index , queryParamsObj ) ;
214+ if ( variants . length > 0 ) {
215+ entriesResponse . items [ index ] . data . variants = variants ;
216+ }
217+ }
218+ }
219+
201220 if ( entriesResponse . items . length > 0 ) {
202- await bulkAction ( stack , entriesResponse . items , bulkPublish , filter , destEnv , apiVersion ) ;
221+ await bulkAction ( stack , entriesResponse . items , bulkPublish , filter , destEnv , apiVersion , variantsFlag ) ;
203222 }
204223 if ( ! entriesResponse . pagination_token ) {
205224 if ( ! changedFlag ) console . log ( 'No Entries/Assets Found published on specified environment' ) ;
@@ -241,6 +260,48 @@ function setConfig(conf, bp) {
241260 filePath = initializeLogger ( logFileName ) ;
242261}
243262
263+ async function getVariantEntries ( stack , contentType , entries , index , queryParams , skip = 0 ) {
264+ try {
265+ let variantQueryParams = {
266+ locale : queryParams . locale || 'en-us' ,
267+ include_count : true ,
268+ skip : skip , // Adding skip parameter for pagination
269+ limit : 100 , // Set a limit to fetch up to 100 entries per request
270+ } ;
271+
272+ const variantsEntriesResponse = await stack
273+ . contentType ( contentType )
274+ . entry ( entries [ index ] . data . uid )
275+ . variants ( )
276+ . query ( variantQueryParams )
277+ . find ( ) ;
278+
279+ const variants = variantsEntriesResponse . items . map ( ( entry ) => ( {
280+ uid : entry . variants_uid ,
281+ } ) ) ;
282+
283+ if ( variantsEntriesResponse . items . length === variantQueryParams . limit ) {
284+ const nextVariants = await getVariantEntries (
285+ stack ,
286+ contentType ,
287+ entries ,
288+ index ,
289+ queryParams ,
290+ skip + variantQueryParams . limit ,
291+ ) ;
292+ return Array . isArray ( nextVariants ) ? variants . concat ( nextVariants ) : variants ;
293+ }
294+ return variants ;
295+ } catch ( error ) {
296+ const errorMessage =
297+ error ?. errorMessage ||
298+ error ?. message ||
299+ error ?. errors ||
300+ 'Falied to fetch the variant entries, Please contact the admin for support.' ;
301+ throw new Error ( `Error fetching variants: ${ errorMessage } ` ) ;
302+ }
303+ }
304+
244305async function start (
245306 {
246307 retryFailed,
@@ -255,6 +316,7 @@ async function start(
255316 destEnv,
256317 f_types,
257318 apiVersion,
319+ includeVariants,
258320 } ,
259321 stack ,
260322 config ,
@@ -306,7 +368,20 @@ async function start(
306368 setConfig ( config , bulkPublish ) ;
307369 // filter.type = (f_types) ? f_types : types // types mentioned in the config file (f_types) are given preference
308370 const queryParams = getQueryParams ( filter ) ;
309- await getSyncEntries ( stack , config , queryParams , bulkPublish , filter , deliveryToken , destEnv , apiVersion ) ;
371+ if ( includeVariants ) {
372+ apiVersion = VARIANTS_PUBLISH_API_VERSION ;
373+ }
374+ await getSyncEntries (
375+ stack ,
376+ config ,
377+ queryParams ,
378+ bulkPublish ,
379+ filter ,
380+ deliveryToken ,
381+ destEnv ,
382+ apiVersion ,
383+ includeVariants ,
384+ ) ;
310385 }
311386}
312387
0 commit comments