mcdev 3.1.1 → 4.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 (135) hide show
  1. package/.eslintrc.json +67 -7
  2. package/.github/ISSUE_TEMPLATE/bug.yml +5 -1
  3. package/.github/ISSUE_TEMPLATE/task.md +1 -1
  4. package/.github/PULL_REQUEST_TEMPLATE.md +5 -3
  5. package/.github/dependabot.yml +14 -0
  6. package/.github/workflows/code-analysis.yml +57 -0
  7. package/.husky/commit-msg +10 -0
  8. package/.husky/post-checkout +5 -0
  9. package/.husky/pre-commit +2 -1
  10. package/.prettierrc +8 -0
  11. package/.vscode/settings.json +1 -1
  12. package/LICENSE +2 -2
  13. package/README.md +134 -45
  14. package/boilerplate/config.json +5 -11
  15. package/boilerplate/files/.prettierrc +8 -0
  16. package/boilerplate/files/.vscode/extensions.json +0 -1
  17. package/boilerplate/files/.vscode/settings.json +28 -2
  18. package/boilerplate/files/README.md +2 -2
  19. package/boilerplate/forcedUpdates.json +10 -0
  20. package/boilerplate/npm-dependencies.json +5 -5
  21. package/docs/dist/documentation.md +2795 -1724
  22. package/jsconfig.json +1 -1
  23. package/lib/Builder.js +166 -75
  24. package/lib/Deployer.js +244 -96
  25. package/lib/MetadataTypeDefinitions.js +2 -0
  26. package/lib/MetadataTypeInfo.js +2 -0
  27. package/lib/Retriever.js +61 -84
  28. package/lib/cli.js +133 -25
  29. package/lib/index.js +242 -563
  30. package/lib/metadataTypes/AccountUser.js +101 -95
  31. package/lib/metadataTypes/Asset.js +677 -248
  32. package/lib/metadataTypes/AttributeGroup.js +23 -12
  33. package/lib/metadataTypes/Automation.js +456 -357
  34. package/lib/metadataTypes/Campaign.js +33 -93
  35. package/lib/metadataTypes/ContentArea.js +31 -11
  36. package/lib/metadataTypes/DataExtension.js +391 -376
  37. package/lib/metadataTypes/DataExtensionField.js +131 -54
  38. package/lib/metadataTypes/DataExtensionTemplate.js +22 -4
  39. package/lib/metadataTypes/DataExtract.js +67 -50
  40. package/lib/metadataTypes/DataExtractType.js +14 -8
  41. package/lib/metadataTypes/Discovery.js +21 -16
  42. package/lib/metadataTypes/Email.js +32 -12
  43. package/lib/metadataTypes/EmailSendDefinition.js +85 -80
  44. package/lib/metadataTypes/EventDefinition.js +69 -47
  45. package/lib/metadataTypes/FileTransfer.js +78 -54
  46. package/lib/metadataTypes/Filter.js +11 -4
  47. package/lib/metadataTypes/Folder.js +149 -117
  48. package/lib/metadataTypes/FtpLocation.js +14 -8
  49. package/lib/metadataTypes/ImportFile.js +69 -69
  50. package/lib/metadataTypes/Interaction.js +19 -4
  51. package/lib/metadataTypes/List.js +54 -13
  52. package/lib/metadataTypes/MetadataType.js +687 -479
  53. package/lib/metadataTypes/MobileCode.js +46 -0
  54. package/lib/metadataTypes/MobileKeyword.js +114 -0
  55. package/lib/metadataTypes/Query.js +204 -103
  56. package/lib/metadataTypes/Role.js +76 -61
  57. package/lib/metadataTypes/Script.js +146 -82
  58. package/lib/metadataTypes/SetDefinition.js +20 -8
  59. package/lib/metadataTypes/TriggeredSendDefinition.js +78 -58
  60. package/lib/metadataTypes/definitions/Asset.definition.js +21 -10
  61. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +12 -0
  62. package/lib/metadataTypes/definitions/Automation.definition.js +10 -5
  63. package/lib/metadataTypes/definitions/Campaign.definition.js +44 -1
  64. package/lib/metadataTypes/definitions/DataExtension.definition.js +4 -0
  65. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +6 -0
  66. package/lib/metadataTypes/definitions/DataExtract.definition.js +18 -14
  67. package/lib/metadataTypes/definitions/Discovery.definition.js +12 -0
  68. package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +4 -0
  69. package/lib/metadataTypes/definitions/EventDefinition.definition.js +22 -0
  70. package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
  71. package/lib/metadataTypes/definitions/Filter.definition.js +4 -0
  72. package/lib/metadataTypes/definitions/Folder.definition.js +6 -0
  73. package/lib/metadataTypes/definitions/FtpLocation.definition.js +4 -0
  74. package/lib/metadataTypes/definitions/ImportFile.definition.js +10 -5
  75. package/lib/metadataTypes/definitions/Interaction.definition.js +4 -0
  76. package/lib/metadataTypes/definitions/MobileCode.definition.js +163 -0
  77. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +253 -0
  78. package/lib/metadataTypes/definitions/Query.definition.js +4 -0
  79. package/lib/metadataTypes/definitions/Role.definition.js +5 -0
  80. package/lib/metadataTypes/definitions/Script.definition.js +4 -0
  81. package/lib/metadataTypes/definitions/SetDefinition.definition.js +28 -0
  82. package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +4 -0
  83. package/lib/retrieveChangelog.js +7 -6
  84. package/lib/util/auth.js +117 -0
  85. package/lib/util/businessUnit.js +55 -66
  86. package/lib/util/cache.js +194 -0
  87. package/lib/util/cli.js +90 -116
  88. package/lib/util/config.js +302 -0
  89. package/lib/util/devops.js +240 -50
  90. package/lib/util/file.js +120 -191
  91. package/lib/util/init.config.js +195 -69
  92. package/lib/util/init.git.js +45 -50
  93. package/lib/util/init.js +72 -59
  94. package/lib/util/init.npm.js +48 -39
  95. package/lib/util/util.js +280 -564
  96. package/package.json +44 -33
  97. package/test/dataExtension.test.js +152 -0
  98. package/test/mockRoot/.mcdev-auth.json +8 -0
  99. package/test/mockRoot/.mcdevrc.json +67 -0
  100. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json +39 -0
  101. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testDataExtension.dataExtension-meta.json +23 -0
  102. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +11 -0
  103. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql +4 -0
  104. package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json +11 -0
  105. package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql +4 -0
  106. package/test/query.test.js +149 -0
  107. package/test/resourceFactory.js +142 -0
  108. package/test/resources/1111111/dataFolder/retrieve-response.xml +43 -0
  109. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +18 -0
  110. package/test/resources/9999999/automation/v1/queries/get-response.json +24 -0
  111. package/test/resources/9999999/automation/v1/queries/post-response.json +18 -0
  112. package/test/resources/9999999/dataExtension/build-expected.json +51 -0
  113. package/test/resources/9999999/dataExtension/create-expected.json +23 -0
  114. package/test/resources/9999999/dataExtension/create-response.xml +54 -0
  115. package/test/resources/9999999/dataExtension/retrieve-expected.json +51 -0
  116. package/test/resources/9999999/dataExtension/retrieve-response.xml +47 -0
  117. package/test/resources/9999999/dataExtension/template-expected.json +51 -0
  118. package/test/resources/9999999/dataExtension/update-expected.json +55 -0
  119. package/test/resources/9999999/dataExtension/update-response.xml +52 -0
  120. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +93 -0
  121. package/test/resources/9999999/dataExtensionTemplate/retrieve-response.xml +303 -0
  122. package/test/resources/9999999/dataFolder/retrieve-response.xml +65 -0
  123. package/test/resources/9999999/query/build-expected.json +8 -0
  124. package/test/resources/9999999/query/get-expected.json +11 -0
  125. package/test/resources/9999999/query/patch-expected.json +11 -0
  126. package/test/resources/9999999/query/post-expected.json +11 -0
  127. package/test/resources/9999999/query/template-expected.json +8 -0
  128. package/test/resources/auth.json +32 -0
  129. package/test/resources/rest404-response.json +5 -0
  130. package/test/resources/retrieve-response.xml +21 -0
  131. package/test/utils.js +107 -0
  132. package/types/mcdev.d.js +301 -0
  133. package/CHANGELOG.md +0 -126
  134. package/PULL_REQUEST_TEMPLATE.md +0 -19
  135. package/test/util/file.js +0 -51
@@ -0,0 +1,142 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('node:path');
3
+ const { XMLParser } = require('fast-xml-parser');
4
+ const parser = new XMLParser();
5
+ const attributeParser = new XMLParser({ ignoreAttributes: false });
6
+ /**
7
+ * gets mock SOAP metadata for responding
8
+ *
9
+ * @param {string} mcdevAction SOAP action
10
+ * @param {string} type metadata Type
11
+ * @param {string} mid of Business Unit
12
+ * @returns {string} relevant metadata stringified
13
+ */
14
+ exports.loadSOAPRecords = async (mcdevAction, type, mid) => {
15
+ type = type[0].toLowerCase() + type.slice(1);
16
+ const testPath = path.join(
17
+ 'test',
18
+ 'resources',
19
+ mid.toString(),
20
+ type,
21
+ mcdevAction + '-response.xml'
22
+ );
23
+ return (await fs.pathExists(testPath))
24
+ ? fs.readFile(testPath, {
25
+ encoding: 'utf8',
26
+ })
27
+ : fs.readFile(path.join('test', 'resources', mcdevAction + '-response.xml'), {
28
+ encoding: 'utf8',
29
+ });
30
+ };
31
+ /**
32
+ * based on request, respond with different soap data
33
+ *
34
+ * @param {object} config mock api request object
35
+ * @returns {Promise.<Array>} status code plus response in string form
36
+ */
37
+ exports.handleSOAPRequest = async (config) => {
38
+ const jObj = parser.parse(config.data);
39
+ const fullObj = attributeParser.parse(config.data);
40
+ let responseXML;
41
+
42
+ switch (config.headers.SOAPAction) {
43
+ case 'Retrieve': {
44
+ responseXML = await this.loadSOAPRecords(
45
+ config.headers.SOAPAction.toLocaleLowerCase(),
46
+ jObj.Envelope.Body.RetrieveRequestMsg.RetrieveRequest.ObjectType,
47
+ jObj.Envelope.Header.fueloauth
48
+ );
49
+
50
+ break;
51
+ }
52
+ case 'Create': {
53
+ responseXML = await this.loadSOAPRecords(
54
+ config.headers.SOAPAction.toLocaleLowerCase(),
55
+ fullObj.Envelope.Body.CreateRequest.Objects['@_xsi:type'],
56
+ jObj.Envelope.Header.fueloauth
57
+ );
58
+
59
+ break;
60
+ }
61
+ case 'Update': {
62
+ responseXML = await this.loadSOAPRecords(
63
+ config.headers.SOAPAction.toLocaleLowerCase(),
64
+ fullObj.Envelope.Body.UpdateRequest.Objects['@_xsi:type'],
65
+ jObj.Envelope.Header.fueloauth
66
+ );
67
+
68
+ break;
69
+ }
70
+ default: {
71
+ throw new Error('This SOAP Action is not supported by test handler');
72
+ }
73
+ }
74
+
75
+ return [200, responseXML];
76
+ };
77
+ /**
78
+ * helper to return soap base URL
79
+ *
80
+ * @returns {string} soap URL
81
+ */
82
+ exports.soapUrl = 'https://mct0l7nxfq2r988t1kxfy8sc4xxx.soap.marketingcloudapis.com/Service.asmx';
83
+
84
+ /**
85
+ * based on request, respond with different soap data
86
+ *
87
+ * @param {object} config mock api request object
88
+ * @returns {Promise.<Array>} status code plus response in string form
89
+ */
90
+ exports.handleRESTRequest = async (config) => {
91
+ try {
92
+ // check if filtered
93
+ const urlObj = new URL(config.baseURL + config.url.slice(1));
94
+ let filterName;
95
+ if (urlObj.searchParams.get('$filter')) {
96
+ filterName = urlObj.searchParams.get('$filter').split(' eq ')[1];
97
+ }
98
+ const testPath = path.join(
99
+ 'test',
100
+ 'resources',
101
+ config.headers.Authorization.replace('Bearer ', ''),
102
+ urlObj.pathname,
103
+ config.method + '-response.json'
104
+ );
105
+
106
+ if (await fs.pathExists(testPath)) {
107
+ // build filter logic to ensure templating works
108
+ if (filterName) {
109
+ const response = JSON.parse(
110
+ await fs.readFile(testPath, {
111
+ encoding: 'utf8',
112
+ })
113
+ );
114
+ response.items = response.items.filter((def) => def.name == filterName);
115
+ response.count = response.items.length;
116
+ return [200, JSON.stringify(response)];
117
+ } else {
118
+ return [
119
+ 200,
120
+ await fs.readFile(testPath, {
121
+ encoding: 'utf8',
122
+ }),
123
+ ];
124
+ }
125
+ } else {
126
+ return [
127
+ 404,
128
+ fs.readFile(path.join('test', 'resources', 'rest404-response.json'), {
129
+ encoding: 'utf8',
130
+ }),
131
+ ];
132
+ }
133
+ } catch {
134
+ return [500, {}];
135
+ }
136
+ };
137
+ /**
138
+ * helper to return rest base URL
139
+ *
140
+ * @returns {string} test URL
141
+ */
142
+ exports.restUrl = 'https://mct0l7nxfq2r988t1kxfy8sc4xxx.rest.marketingcloudapis.com/';
@@ -0,0 +1,43 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>RetrieveResponse</wsa:Action>
5
+ <wsa:MessageID>urn:uuid:f36f3303-3b5a-4641-8109-b26447634d91</wsa:MessageID>
6
+ <wsa:RelatesTo>urn:uuid:33983968-28c4-4379-bb5f-f80ae32eb988</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-32ecc81b-6020-473c-9e99-4b5338921220">
10
+ <wsu:Created>2022-04-19T20:03:41Z</wsu:Created>
11
+ <wsu:Expires>2022-04-19T20:08:41Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <RetrieveResponseMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
17
+ <OverallStatus>OK</OverallStatus>
18
+ <RequestID>02cd5ccb-8f84-4651-826f-71169eeecf05</RequestID>
19
+ <Results xsi:type="DataFolder">
20
+ <Client>
21
+ <ID>1111111</ID>
22
+ </Client>
23
+ <PartnerKey xsi:nil="true" />
24
+ <CreatedDate>2016-07-22T11:52:19.6</CreatedDate>
25
+ <ModifiedDate>2016-07-22T11:52:19.6</ModifiedDate>
26
+ <ID>1</ID>
27
+ <ObjectID xsi:nil="true" />
28
+ <CustomerKey>dataextension_default</CustomerKey>
29
+ <ParentFolder>
30
+ <PartnerKey xsi:nil="true" />
31
+ <ID>0</ID>
32
+ <ObjectID xsi:nil="true" />
33
+ </ParentFolder>
34
+ <Name>Data Extensions</Name>
35
+ <Description />
36
+ <ContentType>dataextension</ContentType>
37
+ <IsActive>true</IsActive>
38
+ <IsEditable>false</IsEditable>
39
+ <AllowChildren>true</AllowChildren>
40
+ </Results>
41
+ </RetrieveResponseMsg>
42
+ </soap:Body>
43
+ </soap:Envelope>
@@ -0,0 +1,18 @@
1
+ {
2
+ "queryDefinitionId": "549f0568-607c-4940-afef-437965094dat",
3
+ "name": "testExistingQuery",
4
+ "key": "testExistingQuery",
5
+ "description": "updated",
6
+ "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers ",
7
+ "targetName": "childBU_dataextension_test",
8
+ "targetKey": "childBU_dataextension_test",
9
+ "targetId": "30400c03-0ec4-ec11-b83c-48df37d1de8a",
10
+ "targetDescription": "",
11
+ "createdDate": "2022-04-26T15:21:16.453",
12
+ "modifiedDate": "2022-04-26T16:04:15.88",
13
+ "targetUpdateTypeId": 0,
14
+ "targetUpdateTypeName": "Overwrite",
15
+ "validatedQueryText": "SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;\r\n\r\nINSERT INTO C518001158.[testDataExtension] ([testField])\r\nSELECT querydef.[testField]\r\nFROM (SELECT SubscriberKey as testField FROM C518001158._Subscribers ) AS querydef \r\nSELECT @rcInsert = @@ROWCOUNT;;\r\n",
16
+ "categoryId": 999,
17
+ "isFrozen": false
18
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "count": 1,
3
+ "page": 1,
4
+ "pageSize": 50,
5
+ "items": [
6
+ {
7
+ "queryDefinitionId": "549f0568-607c-4940-afef-437965094dat",
8
+ "name": "testExistingQuery",
9
+ "key": "testExistingQuery",
10
+ "description": "",
11
+ "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers ",
12
+ "targetName": "childBU_dataextension_test",
13
+ "targetKey": "childBU_dataextension_test",
14
+ "targetId": "30400c03-0ec4-ec11-b83c-48df37d1de8a",
15
+ "targetDescription": "",
16
+ "createdDate": "2022-04-26T15:21:16.453",
17
+ "modifiedDate": "2022-04-26T16:02:44.01",
18
+ "targetUpdateTypeId": 0,
19
+ "targetUpdateTypeName": "Overwrite",
20
+ "categoryId": 999,
21
+ "isFrozen": false
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "queryDefinitionId": "549f0568-607c-4940-afef-437965094dae",
3
+ "name": "testQuery",
4
+ "key": "testQuery",
5
+ "description": "",
6
+ "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers ",
7
+ "targetName": "childBU_dataextension_test",
8
+ "targetKey": "childBU_dataextension_test",
9
+ "targetId": "30400c03-0ec4-ec11-b83c-48df37d1de8a",
10
+ "targetDescription": "",
11
+ "createdDate": "2022-04-26T15:21:16.453",
12
+ "modifiedDate": "2022-04-26T16:04:15.88",
13
+ "targetUpdateTypeId": 0,
14
+ "targetUpdateTypeName": "Overwrite",
15
+ "validatedQueryText": "SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;\r\n\r\nINSERT INTO C518001158.[testDataExtension] ([testField])\r\nSELECT querydef.[testField]\r\nFROM (SELECT SubscriberKey as testField FROM C518001158._Subscribers ) AS querydef \r\nSELECT @rcInsert = @@ROWCOUNT;;\r\n",
16
+ "categoryId": 999,
17
+ "isFrozen": false
18
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "CustomerKey": "childBU_dataextension_test",
3
+ "Name": "childBU_dataextension_test",
4
+ "Description": "Container for my test emails",
5
+ "IsSendable": true,
6
+ "IsTestable": true,
7
+ "SendableDataExtensionField": { "Name": "ContactKey" },
8
+ "SendableSubscriberField": { "Name": "Subscriber Key" },
9
+ "DataRetentionPeriodLength": 6,
10
+ "DataRetentionPeriodUnitOfMeasure": 5,
11
+ "RowBasedRetention": true,
12
+ "ResetRetentionPeriodOnImport": false,
13
+ "DeleteAtEndOfRetentionPeriod": false,
14
+ "RetainUntil": "",
15
+ "Fields": [
16
+ {
17
+ "Name": "FirstName",
18
+ "DefaultValue": "",
19
+ "MaxLength": 50,
20
+ "IsRequired": false,
21
+ "IsPrimaryKey": false,
22
+ "FieldType": "Text"
23
+ },
24
+ {
25
+ "Name": "LastName",
26
+ "DefaultValue": "",
27
+ "MaxLength": 50,
28
+ "IsRequired": false,
29
+ "IsPrimaryKey": false,
30
+ "FieldType": "Text"
31
+ },
32
+ {
33
+ "Name": "EmailAddress",
34
+ "DefaultValue": "",
35
+ "MaxLength": 254,
36
+ "IsRequired": true,
37
+ "IsPrimaryKey": false,
38
+ "FieldType": "EmailAddress"
39
+ },
40
+ {
41
+ "Name": "ContactKey",
42
+ "DefaultValue": "",
43
+ "MaxLength": 50,
44
+ "IsRequired": true,
45
+ "IsPrimaryKey": true,
46
+ "FieldType": "Text"
47
+ }
48
+ ],
49
+ "r__folder_ContentType": "dataextension",
50
+ "r__folder_Path": "Data Extensions"
51
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "CustomerKey": "testDataExtension",
3
+ "Name": "testDataExtension",
4
+ "Description": "",
5
+ "IsSendable": false,
6
+ "IsTestable": false,
7
+ "RowBasedRetention": false,
8
+ "ResetRetentionPeriodOnImport": false,
9
+ "DeleteAtEndOfRetentionPeriod": false,
10
+ "RetainUntil": "",
11
+ "Fields": [
12
+ {
13
+ "Name": "testField",
14
+ "DefaultValue": "",
15
+ "MaxLength": 254,
16
+ "IsRequired": true,
17
+ "IsPrimaryKey": false,
18
+ "FieldType": "Text"
19
+ }
20
+ ],
21
+ "r__folder_ContentType": "dataextension",
22
+ "r__folder_Path": "Data Extensions"
23
+ }
@@ -0,0 +1,54 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>CreateResponse</wsa:Action>
5
+ <wsa:MessageID>urn:uuid:3a5f1edf-dacb-4d19-a0d3-4e0dcc9f507d</wsa:MessageID>
6
+ <wsa:RelatesTo>urn:uuid:fb395987-bf45-42d6-af73-f51816c7b73f</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-b5d88471-97ad-4070-a18f-4c148a52da96">
10
+ <wsu:Created>2022-04-24T20:35:10Z</wsu:Created>
11
+ <wsu:Expires>2022-04-24T20:40:10Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <CreateResponse xmlns="http://exacttarget.com/wsdl/partnerAPI">
17
+ <Results>
18
+ <StatusCode>OK</StatusCode>
19
+ <StatusMessage>Data Extension created.</StatusMessage>
20
+ <OrdinalID>0</OrdinalID>
21
+ <NewID>0</NewID>
22
+ <NewObjectID>30400c03-0ec4-ec11-b83c-48df37d1de8a</NewObjectID>
23
+ <Object xsi:type="DataExtension">
24
+ <PartnerKey xsi:nil="true" />
25
+ <ObjectID>30400c03-0ec4-ec11-b83c-48df37d1de8a</ObjectID>
26
+ <CustomerKey>testDataExtension</CustomerKey>
27
+ <Name>testDataExtension</Name>
28
+ <Description />
29
+ <IsSendable>false</IsSendable>
30
+ <IsTestable>false</IsTestable>
31
+ <RowBasedRetention>false</RowBasedRetention>
32
+ <ResetRetentionPeriodOnImport>false</ResetRetentionPeriodOnImport>
33
+ <DeleteAtEndOfRetentionPeriod>false</DeleteAtEndOfRetentionPeriod>
34
+ <RetainUntil />
35
+ <Fields>
36
+ <Field>
37
+ <PartnerKey xsi:nil="true" />
38
+ <ObjectID xsi:nil="true" />
39
+ <Name>testField</Name>
40
+ <DefaultValue />
41
+ <MaxLength>254</MaxLength>
42
+ <IsRequired>true</IsRequired>
43
+ <IsPrimaryKey>false</IsPrimaryKey>
44
+ <FieldType>Text</FieldType>
45
+ </Field>
46
+ </Fields>
47
+ <CategoryID>2</CategoryID>
48
+ </Object>
49
+ </Results>
50
+ <RequestID>c41aa55a-90e3-4021-9f82-103796aae6da</RequestID>
51
+ <OverallStatus>OK</OverallStatus>
52
+ </CreateResponse>
53
+ </soap:Body>
54
+ </soap:Envelope>
@@ -0,0 +1,51 @@
1
+ {
2
+ "CustomerKey": "childBU_dataextension_test",
3
+ "Name": "childBU_dataextension_test",
4
+ "Description": "Container for my test emails",
5
+ "IsSendable": true,
6
+ "IsTestable": true,
7
+ "SendableDataExtensionField": { "Name": "ContactKey" },
8
+ "SendableSubscriberField": { "Name": "Subscriber Key" },
9
+ "DataRetentionPeriodLength": 6,
10
+ "DataRetentionPeriodUnitOfMeasure": 5,
11
+ "RowBasedRetention": true,
12
+ "ResetRetentionPeriodOnImport": false,
13
+ "DeleteAtEndOfRetentionPeriod": false,
14
+ "RetainUntil": "",
15
+ "Fields": [
16
+ {
17
+ "Name": "FirstName",
18
+ "DefaultValue": "",
19
+ "MaxLength": 50,
20
+ "IsRequired": false,
21
+ "IsPrimaryKey": false,
22
+ "FieldType": "Text"
23
+ },
24
+ {
25
+ "Name": "LastName",
26
+ "DefaultValue": "",
27
+ "MaxLength": 50,
28
+ "IsRequired": false,
29
+ "IsPrimaryKey": false,
30
+ "FieldType": "Text"
31
+ },
32
+ {
33
+ "Name": "EmailAddress",
34
+ "DefaultValue": "",
35
+ "MaxLength": 254,
36
+ "IsRequired": true,
37
+ "IsPrimaryKey": false,
38
+ "FieldType": "EmailAddress"
39
+ },
40
+ {
41
+ "Name": "ContactKey",
42
+ "DefaultValue": "",
43
+ "MaxLength": 50,
44
+ "IsRequired": true,
45
+ "IsPrimaryKey": true,
46
+ "FieldType": "Text"
47
+ }
48
+ ],
49
+ "r__folder_ContentType": "dataextension",
50
+ "r__folder_Path": "Data Extensions"
51
+ }
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>RetrieveResponse</wsa:Action>
5
+ <wsa:MessageID>urn:uuid:c198cc12-c34c-4d1d-90b0-5b785a342efc</wsa:MessageID>
6
+ <wsa:RelatesTo>urn:uuid:a0506b59-1847-4405-8231-6a15e26bbcc9</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-52fe9187-6f22-4701-bd57-d0eaa4aef215">
10
+ <wsu:Created>2022-04-21T19:21:50Z</wsu:Created>
11
+ <wsu:Expires>2022-04-21T19:26:50Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <RetrieveResponseMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
17
+ <OverallStatus>OK</OverallStatus>
18
+ <RequestID>d175de6e-c8e4-4f5d-9c1d-ad64426ff4b7</RequestID>
19
+ <Results xsi:type="DataExtension">
20
+ <PartnerKey xsi:nil="true" />
21
+ <CreatedDate>2022-04-21T06:56:27.927</CreatedDate>
22
+ <ModifiedDate>2022-04-21T06:56:27.927</ModifiedDate>
23
+ <ObjectID>21711373-72c1-ec11-b83b-48df37d1deb7</ObjectID>
24
+ <CustomerKey>childBU_dataextension_test</CustomerKey>
25
+ <Name>childBU_dataextension_test</Name>
26
+ <Description>Container for my test emails</Description>
27
+ <IsSendable>true</IsSendable>
28
+ <IsTestable>true</IsTestable>
29
+ <SendableDataExtensionField>
30
+ <PartnerKey xsi:nil="true" />
31
+ <ObjectID xsi:nil="true" />
32
+ <Name>ContactKey</Name>
33
+ </SendableDataExtensionField>
34
+ <SendableSubscriberField>
35
+ <Name>_SubscriberKey</Name>
36
+ </SendableSubscriberField>
37
+ <DataRetentionPeriodLength>6</DataRetentionPeriodLength>
38
+ <DataRetentionPeriodUnitOfMeasure>5</DataRetentionPeriodUnitOfMeasure>
39
+ <RowBasedRetention>true</RowBasedRetention>
40
+ <ResetRetentionPeriodOnImport>false</ResetRetentionPeriodOnImport>
41
+ <DeleteAtEndOfRetentionPeriod>false</DeleteAtEndOfRetentionPeriod>
42
+ <RetainUntil />
43
+ <CategoryID>2</CategoryID>
44
+ </Results>
45
+ </RetrieveResponseMsg>
46
+ </soap:Body>
47
+ </soap:Envelope>
@@ -0,0 +1,51 @@
1
+ {
2
+ "CustomerKey": "childBU_dataextension{{{suffix}}}",
3
+ "Name": "childBU_dataextension{{{suffix}}}",
4
+ "Description": "Container for my test emails",
5
+ "IsSendable": true,
6
+ "IsTestable": true,
7
+ "SendableDataExtensionField": { "Name": "ContactKey" },
8
+ "SendableSubscriberField": { "Name": "Subscriber Key" },
9
+ "DataRetentionPeriodLength": 6,
10
+ "DataRetentionPeriodUnitOfMeasure": 5,
11
+ "RowBasedRetention": true,
12
+ "ResetRetentionPeriodOnImport": false,
13
+ "DeleteAtEndOfRetentionPeriod": false,
14
+ "RetainUntil": "",
15
+ "Fields": [
16
+ {
17
+ "Name": "FirstName",
18
+ "DefaultValue": "",
19
+ "MaxLength": 50,
20
+ "IsRequired": false,
21
+ "IsPrimaryKey": false,
22
+ "FieldType": "Text"
23
+ },
24
+ {
25
+ "Name": "LastName",
26
+ "DefaultValue": "",
27
+ "MaxLength": 50,
28
+ "IsRequired": false,
29
+ "IsPrimaryKey": false,
30
+ "FieldType": "Text"
31
+ },
32
+ {
33
+ "Name": "EmailAddress",
34
+ "DefaultValue": "",
35
+ "MaxLength": 254,
36
+ "IsRequired": true,
37
+ "IsPrimaryKey": false,
38
+ "FieldType": "EmailAddress"
39
+ },
40
+ {
41
+ "Name": "ContactKey",
42
+ "DefaultValue": "",
43
+ "MaxLength": 50,
44
+ "IsRequired": true,
45
+ "IsPrimaryKey": true,
46
+ "FieldType": "Text"
47
+ }
48
+ ],
49
+ "r__folder_ContentType": "dataextension",
50
+ "r__folder_Path": "Data Extensions"
51
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "CustomerKey": "childBU_dataextension_test",
3
+ "Name": "childBU_dataextension_test",
4
+ "Description": "",
5
+ "IsSendable": false,
6
+ "IsTestable": false,
7
+ "RowBasedRetention": true,
8
+ "ResetRetentionPeriodOnImport": false,
9
+ "DeleteAtEndOfRetentionPeriod": false,
10
+ "RetainUntil": "",
11
+ "Fields": [
12
+ {
13
+ "Name": "FirstName",
14
+ "DefaultValue": "",
15
+ "MaxLength": 50,
16
+ "IsRequired": false,
17
+ "IsPrimaryKey": false,
18
+ "FieldType": "Text"
19
+ },
20
+ {
21
+ "Name": "LastName",
22
+ "DefaultValue": "",
23
+ "MaxLength": 55,
24
+ "IsRequired": false,
25
+ "IsPrimaryKey": false,
26
+ "FieldType": "Text"
27
+ },
28
+ {
29
+ "Name": "EmailAddress",
30
+ "DefaultValue": "",
31
+ "MaxLength": 254,
32
+ "IsRequired": true,
33
+ "IsPrimaryKey": false,
34
+ "FieldType": "EmailAddress"
35
+ },
36
+ {
37
+ "Name": "ContactKey",
38
+ "DefaultValue": "",
39
+ "MaxLength": 50,
40
+ "IsRequired": true,
41
+ "IsPrimaryKey": true,
42
+ "FieldType": "Text"
43
+ },
44
+ {
45
+ "Name": "testField",
46
+ "DefaultValue": "",
47
+ "MaxLength": 254,
48
+ "IsRequired": false,
49
+ "IsPrimaryKey": false,
50
+ "FieldType": "Text"
51
+ }
52
+ ],
53
+ "r__folder_ContentType": "dataextension",
54
+ "r__folder_Path": "Data Extensions"
55
+ }
@@ -0,0 +1,52 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
3
+ <soap:Header>
4
+ <wsa:Action>UpdateResponse</wsa:Action>
5
+ <wsa:MessageID>urn:uuid:994e213d-1125-450d-b187-32e3870147d1</wsa:MessageID>
6
+ <wsa:RelatesTo>urn:uuid:f1fc86ef-c0c8-4c17-a901-a15fc2631f76</wsa:RelatesTo>
7
+ <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
8
+ <wsse:Security>
9
+ <wsu:Timestamp wsu:Id="Timestamp-88cf0bce-bf0f-4d5f-90a6-2897708181b5">
10
+ <wsu:Created>2022-04-26T20:49:03Z</wsu:Created>
11
+ <wsu:Expires>2022-04-26T20:54:03Z</wsu:Expires>
12
+ </wsu:Timestamp>
13
+ </wsse:Security>
14
+ </soap:Header>
15
+ <soap:Body>
16
+ <UpdateResponse xmlns="http://exacttarget.com/wsdl/partnerAPI">
17
+ <Results>
18
+ <StatusCode>OK</StatusCode>
19
+ <StatusMessage>Data Extension updated.</StatusMessage>
20
+ <OrdinalID>0</OrdinalID>
21
+ <Object xsi:type="DataExtension">
22
+ <PartnerKey xsi:nil="true" />
23
+ <ObjectID>30400c03-0ec4-ec11-b83c-48df37d1de8b</ObjectID>
24
+ <CustomerKey>childBU_dataextension_test</CustomerKey>
25
+ <Name>childBU_dataextension_test</Name>
26
+ <Description />
27
+ <IsSendable>false</IsSendable>
28
+ <IsTestable>false</IsTestable>
29
+ <RowBasedRetention>false</RowBasedRetention>
30
+ <ResetRetentionPeriodOnImport>false</ResetRetentionPeriodOnImport>
31
+ <DeleteAtEndOfRetentionPeriod>false</DeleteAtEndOfRetentionPeriod>
32
+ <RetainUntil />
33
+ <Fields>
34
+ <Field>
35
+ <PartnerKey xsi:nil="true" />
36
+ <ObjectID xsi:nil="true" />
37
+ <Name>testField</Name>
38
+ <DefaultValue />
39
+ <MaxLength>254</MaxLength>
40
+ <IsRequired>true</IsRequired>
41
+ <IsPrimaryKey>false</IsPrimaryKey>
42
+ <FieldType>Text</FieldType>
43
+ </Field>
44
+ </Fields>
45
+ <CategoryID>2</CategoryID>
46
+ </Object>
47
+ </Results>
48
+ <RequestID>dbfedcb6-a809-4101-b314-a7b920c9fb1e</RequestID>
49
+ <OverallStatus>OK</OverallStatus>
50
+ </UpdateResponse>
51
+ </soap:Body>
52
+ </soap:Envelope>