mcdev 7.10.1 → 8.0.0

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.
Files changed (144) hide show
  1. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  2. package/.github/workflows/code-test.yml +8 -100
  3. package/@types/lib/Deployer.d.ts.map +1 -1
  4. package/@types/lib/Retriever.d.ts.map +1 -1
  5. package/@types/lib/index.d.ts +16 -4
  6. package/@types/lib/index.d.ts.map +1 -1
  7. package/@types/lib/metadataTypes/Asset.d.ts +45 -8
  8. package/@types/lib/metadataTypes/Asset.d.ts.map +1 -1
  9. package/@types/lib/metadataTypes/Automation.d.ts +13 -4
  10. package/@types/lib/metadataTypes/Automation.d.ts.map +1 -1
  11. package/@types/lib/metadataTypes/DataExtension.d.ts.map +1 -1
  12. package/@types/lib/metadataTypes/DataExtensionField.d.ts.map +1 -1
  13. package/@types/lib/metadataTypes/Event.d.ts +6 -0
  14. package/@types/lib/metadataTypes/Event.d.ts.map +1 -1
  15. package/@types/lib/metadataTypes/Folder.d.ts +49 -12
  16. package/@types/lib/metadataTypes/Folder.d.ts.map +1 -1
  17. package/@types/lib/metadataTypes/ImportFile.d.ts +14 -0
  18. package/@types/lib/metadataTypes/ImportFile.d.ts.map +1 -1
  19. package/@types/lib/metadataTypes/Journey.d.ts +166 -6
  20. package/@types/lib/metadataTypes/Journey.d.ts.map +1 -1
  21. package/@types/lib/metadataTypes/MetadataType.d.ts +5 -3
  22. package/@types/lib/metadataTypes/MetadataType.d.ts.map +1 -1
  23. package/@types/lib/metadataTypes/definitions/Asset.definition.d.ts +45 -8
  24. package/@types/lib/metadataTypes/definitions/Automation.definition.d.ts +6 -0
  25. package/@types/lib/metadataTypes/definitions/Event.definition.d.ts +6 -0
  26. package/@types/lib/metadataTypes/definitions/Folder.definition.d.ts +49 -12
  27. package/@types/lib/metadataTypes/definitions/ImportFile.definition.d.ts +3 -0
  28. package/@types/lib/metadataTypes/definitions/Journey.definition.d.ts +159 -6
  29. package/@types/lib/util/cache.d.ts +2 -1
  30. package/@types/lib/util/cache.d.ts.map +1 -1
  31. package/@types/lib/util/devops.d.ts.map +1 -1
  32. package/@types/types/mcdev.d.d.ts +16 -0
  33. package/@types/types/mcdev.d.d.ts.map +1 -1
  34. package/boilerplate/files/.vscode/settings.json +5 -0
  35. package/eslint.config.js +2 -2
  36. package/lib/Deployer.js +3 -0
  37. package/lib/Retriever.js +8 -2
  38. package/lib/cli.js +29 -0
  39. package/lib/index.js +25 -28
  40. package/lib/metadataTypes/Asset.js +126 -10
  41. package/lib/metadataTypes/Automation.js +135 -40
  42. package/lib/metadataTypes/DataExtension.js +0 -10
  43. package/lib/metadataTypes/DataExtensionField.js +9 -15
  44. package/lib/metadataTypes/Event.js +42 -19
  45. package/lib/metadataTypes/Folder.js +98 -12
  46. package/lib/metadataTypes/ImportFile.js +90 -29
  47. package/lib/metadataTypes/Journey.js +182 -23
  48. package/lib/metadataTypes/MetadataType.js +38 -12
  49. package/lib/metadataTypes/definitions/Asset.definition.js +196 -142
  50. package/lib/metadataTypes/definitions/Automation.definition.js +6 -0
  51. package/lib/metadataTypes/definitions/DataExtension.definition.js +7 -6
  52. package/lib/metadataTypes/definitions/Event.definition.js +6 -0
  53. package/lib/metadataTypes/definitions/Folder.definition.js +69 -22
  54. package/lib/metadataTypes/definitions/ImportFile.definition.js +3 -0
  55. package/lib/metadataTypes/definitions/Journey.definition.js +165 -11
  56. package/lib/util/cache.js +24 -5
  57. package/lib/util/devops.js +20 -5
  58. package/package.json +16 -17
  59. package/test/general.test.js +8 -8
  60. package/test/mockRoot/.mcdev-validations.js +2 -3
  61. package/test/mockRoot/.mcdevrc.json +1 -1
  62. package/test/mockRoot/deploy/testInstance/testBU/importFile/testExisting_importFile.importFile-meta.json +2 -1
  63. package/test/mockRoot/deploy/testInstance/testBU/importFile/testNew_importFile.importFile-meta.json +2 -1
  64. package/test/resourceFactory.js +31 -5
  65. package/test/resources/1111111/dataExtension/update-expected.json +1 -1
  66. package/test/resources/9999999/asset/test_coderesource_js-retrieve-expected.js +1 -0
  67. package/test/resources/9999999/asset/test_coderesource_js-retrieve-expected.json +47 -0
  68. package/test/resources/9999999/asset/test_coderesource_json-retrieve-expected.json +47 -0
  69. package/test/resources/9999999/asset/test_coderesource_json-retrieve-expected.jsonc +1 -0
  70. package/test/resources/9999999/asset/test_coderesource_xml-retrieve-expected.json +46 -0
  71. package/test/resources/9999999/asset/test_coderesource_xml-retrieve-expected.xml +1 -0
  72. package/test/resources/9999999/asset/test_interactivecontent-retrieve-expected.json +43 -0
  73. package/test/resources/9999999/asset/test_landingpage-retrieve-expected.json +42 -0
  74. package/test/resources/9999999/asset/test_microsite-retrieve-expected.json +43 -0
  75. package/test/resources/9999999/asset/v1/content/assets/9451/get-response.json +61 -0
  76. package/test/resources/9999999/asset/v1/content/assets/9456/get-response.json +56 -0
  77. package/test/resources/9999999/asset/v1/content/assets/9458/get-response.json +56 -0
  78. package/test/resources/9999999/asset/v1/content/assets/9460/get-response.json +59 -0
  79. package/test/resources/9999999/asset/v1/content/assets/9463/get-response.json +61 -0
  80. package/test/resources/9999999/asset/v1/content/assets/9465/get-response.json +54 -0
  81. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN1,3,4,14,15,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,205,206,210,211,212,213,214,215,216,217,218,219,220,221,222.json +94 -1
  82. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN219,220,221,222,223,224,225,226,227,228,230,232,240,241,242,243,244,245.json +168 -0
  83. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN240,241,242,243,244,245.json +144 -0
  84. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN246,247,248,249.json +132 -0
  85. package/test/resources/9999999/dataExtension/update-callout-afterCreatedViaEvent-expected.xml +1 -1
  86. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-sha,automatio,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,triggered,triggered,useriniti-response.xml → retrieve-ContentTypeINasset,asset-sha,automatio,cloudpage,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,triggered,triggered,useriniti-response.xml} +44 -1
  87. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-sha,automatio,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,useriniti-response.xml → retrieve-ContentTypeINasset,asset-sha,automatio,cloudpage,dataexten,hidden,journey,list,mysubs,publicati,queryacti,salesforc,shared_da,shared_da,shared_sa,ssjsactiv,synchroni,useriniti-response.xml} +44 -0
  88. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-shared,dataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml → retrieve-ContentTypeINasset,asset-shared,cloudpages,dataextension,hidden,salesforcedataextension,shared_data,shared_dataextension,shared_salesforcedataextension,synchronizeddataextension-response.xml} +44 -0
  89. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-shared,journey-response.xml → retrieve-ContentTypeINasset,asset-shared,cloudpages,journey-response.xml} +44 -0
  90. package/test/resources/9999999/dataFolder/retrieve-ContentTypeINasset,asset-shared,cloudpages,ssjsactivity-response.xml +136 -0
  91. package/test/resources/9999999/dataFolder/{retrieve-ContentTypeINasset,asset-shared,ssjsactivity-response.xml → retrieve-ContentTypeINasset,asset-shared,cloudpages-response.xml} +29 -7
  92. package/test/resources/9999999/dataFolder/{+retrieve-response.xml → retrieve-response.xml} +23 -0
  93. package/test/resources/9999999/dataFolder/update-response.xml +31 -0
  94. package/test/resources/9999999/event/build-expected.json +0 -1
  95. package/test/resources/9999999/event/get-automation-expected.json +0 -1
  96. package/test/resources/9999999/event/get-expected.json +0 -2
  97. package/test/resources/9999999/event/get-published-expected.json +0 -2
  98. package/test/resources/9999999/event/post_withExistingDE-expected.json +0 -2
  99. package/test/resources/9999999/event/post_withSchema-callout-expected.json +3 -0
  100. package/test/resources/9999999/event/post_withSchema-expected.json +0 -2
  101. package/test/resources/9999999/event/put-callout-expected.json +3 -0
  102. package/test/resources/9999999/event/put-expected.json +0 -2
  103. package/test/resources/9999999/event/template-expected.json +0 -1
  104. package/test/resources/9999999/folder-deploy/Data Extensions/testExisting_folder.folder-meta.json +9 -0
  105. package/test/resources/9999999/importFile/get-dataImport-expected.json +1 -1
  106. package/test/resources/9999999/importFile/get-expected.json +4 -1
  107. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/audit/all/get-response-versionNumber=1.json +86 -0
  108. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/audit/all/get-response-versionNumber=2.json +101 -0
  109. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/audit/all/get-response-versionNumber=3.json +86 -0
  110. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/delete-response-versionNumber=1.txt +1 -0
  111. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/get-response-versionNumber=1.json +461 -0
  112. package/test/resources/9999999/interaction/v1/interactions/0175b971-71a3-4d8e-98ac-48121f3fbf4f/get-response-versionNumber=3.json +461 -0
  113. package/test/resources/9999999/interaction/v1/interactions/dsfdsafdsa-922c-4568-85a5-e5cc77efc3be/audit/all/get-response-versionNumber=1.json +38 -0
  114. package/test/resources/9999999/interaction/v1/interactions/dsfdsafdsa-922c-4568-85a5-e5cc77efc3be/audit/all/get-response-versionNumber=2.json +53 -0
  115. package/test/resources/9999999/interaction/v1/interactions/get-response.json +2 -2
  116. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Multistep/get-response-versionNumber=1.json +461 -0
  117. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_journey_Quicksend/get-response-versionNumber=1.json +253 -0
  118. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail/get-response-versionNumber=1.json +219 -0
  119. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_temail_notPublished/get-response-versionNumber=1.json +226 -0
  120. package/test/resources/9999999/interaction/v1/interactions/publishAsync/0175b971-71a3-4d8e-98ac-48121f3fbf4f/post-response-versionNumber=3.json +4 -0
  121. package/test/resources/9999999/journey/build-expected.json +0 -1
  122. package/test/resources/9999999/journey/create-transactionaEmail-publish-expected.json +0 -1
  123. package/test/resources/9999999/journey/get-multistep-expected.json +0 -4
  124. package/test/resources/9999999/journey/get-published-expected.json +0 -1
  125. package/test/resources/9999999/journey/get-quicksend-expected.json +0 -1
  126. package/test/resources/9999999/journey/get-quicksend-rcb-id-expected.json +0 -1
  127. package/test/resources/9999999/journey/get-quicksend-rcb-key-expected.json +0 -1
  128. package/test/resources/9999999/journey/get-quicksend-rcb-name-expected.json +0 -1
  129. package/test/resources/9999999/journey/get-transactionalEmail-expected.json +0 -1
  130. package/test/resources/9999999/journey/template-expected.json +0 -1
  131. package/test/resources/9999999/query/patch-expected.sql +1 -1
  132. package/test/resources/9999999/query/post-expected.sql +1 -1
  133. package/test/resources/9999999/script/patch-expected.ssjs +1 -0
  134. package/test/type.asset.test.js +123 -13
  135. package/test/type.automation.test.js +3 -1
  136. package/test/type.folder.test.js +12 -2
  137. package/test/type.journey.test.js +130 -1
  138. package/test/type.script.test.js +1 -0
  139. package/test/type.senderProfile.test.js +1 -0
  140. package/test/utils.js +2 -0
  141. package/types/mcdev.d.js +4 -0
  142. package/test/resources/9999999/asset/v1/content/assets/query/post-response-assetType.idIN219,220,221,222,223,224,225,226,227,228,230,232.json +0 -32
  143. /package/test/resources/9999999/dataFolder/{+retrieve-QAA-response.xml → retrieve-QAA-response.xml} +0 -0
  144. /package/test/resources/9999999/interaction/v1/interactions/publishAsync/0175b971-71a3-4d8e-98ac-48121f3fbf4f/{post-response.json → post-response-versionNumber=1.json} +0 -0
@@ -475,6 +475,7 @@ describe('type: journey', () => {
475
475
  it('Should create a journey template via buildTemplate with --dependencies', async () => {
476
476
  // download first before we test buildTemplate
477
477
  await handler.retrieve('testInstance/testBU', ['journey', 'asset']);
478
+ assert.equal(process.exitCode, 0, 'retrieve should not have thrown an error');
478
479
 
479
480
  handler.setOptions({ dependencies: true, retrieve: true });
480
481
 
@@ -1290,7 +1291,7 @@ describe('type: journey', () => {
1290
1291
 
1291
1292
  assert.deepEqual(
1292
1293
  replace['testInstance/testBU'].journey,
1293
- ['testExisting_journey_Multistep', 'testExisting_temail'],
1294
+ ['testExisting_temail', 'testExisting_journey_Multistep'],
1294
1295
  'should have found the right journeys that need updating'
1295
1296
  );
1296
1297
 
@@ -1302,4 +1303,132 @@ describe('type: journey', () => {
1302
1303
  return;
1303
1304
  });
1304
1305
  });
1306
+
1307
+ describe('Audit ================', () => {
1308
+ it('Should show audit log of a transactional journey and version', async () => {
1309
+ const audit = await handler.audit('testInstance/testBU', {
1310
+ journey: ['testExisting_temail/2'],
1311
+ });
1312
+ // THEN
1313
+ assert.equal(process.exitCode, 0, 'audit should not have thrown an error');
1314
+
1315
+ assert.deepEqual(
1316
+ audit['testInstance/testBU'].journey,
1317
+ ['testExisting_temail'],
1318
+ 'should have returned the right journeys'
1319
+ );
1320
+ assert.equal(
1321
+ testUtils.getAPIHistoryLength(),
1322
+ 2,
1323
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
1324
+ );
1325
+
1326
+ return;
1327
+ });
1328
+
1329
+ it('Should show audit log of a transactional journey with all its versions', async () => {
1330
+ const audit = await handler.audit('testInstance/testBU', {
1331
+ journey: ['testExisting_temail'],
1332
+ });
1333
+ // THEN
1334
+ assert.equal(process.exitCode, 0, 'audit should not have thrown an error');
1335
+
1336
+ assert.deepEqual(
1337
+ audit['testInstance/testBU'].journey,
1338
+ ['testExisting_temail'],
1339
+ 'should have returned the right journeys'
1340
+ );
1341
+ assert.equal(
1342
+ testUtils.getAPIHistoryLength(),
1343
+ 3,
1344
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
1345
+ );
1346
+
1347
+ return;
1348
+ });
1349
+
1350
+ it('Should not show audit log of a transactional journey with a too high version', async () => {
1351
+ const audit = await handler.audit('testInstance/testBU', {
1352
+ journey: ['testExisting_temail/99'],
1353
+ });
1354
+ // THEN
1355
+ assert.equal(process.exitCode, 404, 'audit should have thrown an error');
1356
+
1357
+ assert.deepEqual(
1358
+ audit['testInstance/testBU'].journey,
1359
+ [],
1360
+ 'should have returned the right journeys'
1361
+ );
1362
+ assert.equal(
1363
+ testUtils.getAPIHistoryLength(),
1364
+ 2,
1365
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
1366
+ );
1367
+
1368
+ return;
1369
+ });
1370
+
1371
+ it('Should show audit log of a multi-step journey and version', async () => {
1372
+ const audit = await handler.audit('testInstance/testBU', {
1373
+ journey: ['testExisting_journey_Multistep/1'],
1374
+ });
1375
+ // THEN
1376
+ assert.equal(process.exitCode, 0, 'audit should not have thrown an error');
1377
+
1378
+ assert.deepEqual(
1379
+ audit['testInstance/testBU'].journey,
1380
+ ['testExisting_journey_Multistep'],
1381
+ 'should have returned the right journeys'
1382
+ );
1383
+ assert.equal(
1384
+ testUtils.getAPIHistoryLength(),
1385
+ 2,
1386
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
1387
+ );
1388
+
1389
+ return;
1390
+ });
1391
+
1392
+ it('Should show audit log of a multi-step journey with all its versions', async () => {
1393
+ const audit = await handler.audit('testInstance/testBU', {
1394
+ journey: ['testExisting_journey_Multistep'],
1395
+ });
1396
+ // THEN
1397
+ assert.equal(process.exitCode, 0, 'audit should not have thrown an error');
1398
+
1399
+ assert.deepEqual(
1400
+ audit['testInstance/testBU'].journey,
1401
+ ['testExisting_journey_Multistep'],
1402
+ 'should have returned the right journeys'
1403
+ );
1404
+ assert.equal(
1405
+ testUtils.getAPIHistoryLength(),
1406
+ 4,
1407
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
1408
+ );
1409
+
1410
+ return;
1411
+ });
1412
+
1413
+ it('Should show audit log of a multi-step journey with all its versions via /*', async () => {
1414
+ const audit = await handler.audit('testInstance/testBU', {
1415
+ journey: ['testExisting_journey_Multistep'],
1416
+ });
1417
+ // THEN
1418
+ assert.equal(process.exitCode, 0, 'audit should not have thrown an error');
1419
+
1420
+ assert.deepEqual(
1421
+ audit['testInstance/testBU'].journey,
1422
+ ['testExisting_journey_Multistep'],
1423
+ 'should have returned the right journeys'
1424
+ );
1425
+ assert.equal(
1426
+ testUtils.getAPIHistoryLength(),
1427
+ 4,
1428
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
1429
+ );
1430
+
1431
+ return;
1432
+ });
1433
+ });
1305
1434
  });
@@ -373,6 +373,7 @@ describe('type: script', () => {
373
373
  it('Should create a script template via buildTemplate with --dependencies', async () => {
374
374
  // download first before we test buildTemplate
375
375
  await handler.retrieve('testInstance/testBU', ['script', 'asset']);
376
+ assert.equal(process.exitCode, 0, 'retrieve should not have thrown an error');
376
377
 
377
378
  handler.setOptions({ dependencies: true, skipInteraction: true });
378
379
 
@@ -152,6 +152,7 @@ describe('type: senderProfile', () => {
152
152
  it('Should create a senderProfile template via buildTemplate with --dependencies', async () => {
153
153
  // download first before we test buildTemplate
154
154
  handler.setOptions({ dependencies: true, retrieve: true });
155
+ assert.equal(process.exitCode, 0, 'retrieve should not have thrown an error');
155
156
 
156
157
  // GIVEN there is a template
157
158
  const templatedItems = await handler.buildTemplate(
package/test/utils.js CHANGED
@@ -205,6 +205,8 @@ export function mockSetup(isDeploy) {
205
205
 
206
206
  handler.setOptions(resetOptions);
207
207
  }
208
+ File.prettierConfig = null;
209
+
208
210
  apimock = new MockAdapter(axiosInstance, { onNoMatch: 'throwException' });
209
211
  // set access_token to mid to allow for autorouting of mock to correct resources
210
212
  apimock.onPost(authResources.success.url).reply((config) => {
package/types/mcdev.d.js CHANGED
@@ -243,8 +243,12 @@
243
243
  * @property {string} startDate example: '2021-05-07T09:00:00'
244
244
  * @property {string} endDate example: '2021-05-07T09:00:00'
245
245
  * @property {string} icalRecur example: 'FREQ=DAILY;UNTIL=20790606T160000;INTERVAL=1'
246
+ * @property {string} [iCalRecur] same as icalRecur but returned by legacy-API; example: 'FREQ=DAILY;UNTIL=20790606T160000;INTERVAL=1'
246
247
  * @property {string} timezoneName example: 'W. Europe Standard Time'; see this.definition.timeZoneMapping
248
+ * @property {string} [timeZone] same as timezoneName but returned by legacy-API; example: 'W. Europe Standard Time'; see this.definition.timeZoneMapping
249
+ * @property {string} [description] kept in legacy API only, exact description of what this schedule does
247
250
  * @property {number} [timezoneId] see this.definition.timeZoneMapping
251
+ * @property {number} [timeZoneId] same as timezoneId but returned by legacy-API; see this.definition.timeZoneMapping
248
252
  * @property {number} [rangeTypeId] ?
249
253
  * @property {any} [pattern] ?
250
254
  * @property {any} [scheduledTime] ?
@@ -1,32 +0,0 @@
1
- {
2
- "count": 1,
3
- "page": 1,
4
- "pageSize": 50,
5
- "links": {},
6
- "items": [
7
- {
8
- "id": 1209971,
9
- "customerKey": "mobileMessage_test",
10
- "assetType": { "id": 230, "name": "jsonmessage", "displayName": "JSON Message" },
11
- "name": "mobileMessage_test",
12
- "createdDate": "2022-12-07T02:49:36.857-06:00",
13
- "createdBy": {
14
- "id": 700301950,
15
- "email": "joern.berkefeld@accenture.com",
16
- "name": "J├Ârn Berkefeld (ASGR)",
17
- "userId": "700301950"
18
- },
19
- "modifiedDate": "2022-12-07T02:49:57.44-06:00",
20
- "modifiedBy": {
21
- "id": 700301950,
22
- "email": "joern.berkefeld@accenture.com",
23
- "name": "J├Ârn Berkefeld (ASGR)",
24
- "userId": "700301950"
25
- },
26
- "status": { "id": 1, "name": "Draft" },
27
- "category": { "id": 89397, "name": "Content Builder", "parentId": 0 },
28
- "availableViews": ["push"],
29
- "modelVersion": 2
30
- }
31
- ]
32
- }