mcdev 3.1.3 → 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.
- package/.eslintrc.json +67 -7
- package/.github/ISSUE_TEMPLATE/bug.yml +2 -1
- package/.github/PULL_REQUEST_TEMPLATE.md +5 -3
- package/.github/dependabot.yml +14 -0
- package/.github/workflows/code-analysis.yml +57 -0
- package/.husky/commit-msg +10 -0
- package/.husky/post-checkout +5 -0
- package/.husky/pre-commit +2 -1
- package/.prettierrc +8 -0
- package/.vscode/settings.json +1 -1
- package/LICENSE +2 -2
- package/README.md +134 -45
- package/boilerplate/config.json +5 -11
- package/boilerplate/files/.prettierrc +8 -0
- package/boilerplate/files/.vscode/extensions.json +0 -1
- package/boilerplate/files/.vscode/settings.json +28 -2
- package/boilerplate/files/README.md +2 -2
- package/boilerplate/forcedUpdates.json +10 -0
- package/boilerplate/npm-dependencies.json +5 -5
- package/docs/dist/documentation.md +2795 -1724
- package/jsconfig.json +1 -1
- package/lib/Builder.js +166 -75
- package/lib/Deployer.js +244 -96
- package/lib/MetadataTypeDefinitions.js +2 -0
- package/lib/MetadataTypeInfo.js +2 -0
- package/lib/Retriever.js +61 -84
- package/lib/cli.js +116 -11
- package/lib/index.js +241 -561
- package/lib/metadataTypes/AccountUser.js +101 -95
- package/lib/metadataTypes/Asset.js +677 -248
- package/lib/metadataTypes/AttributeGroup.js +23 -12
- package/lib/metadataTypes/Automation.js +451 -354
- package/lib/metadataTypes/Campaign.js +33 -93
- package/lib/metadataTypes/ContentArea.js +31 -11
- package/lib/metadataTypes/DataExtension.js +387 -372
- package/lib/metadataTypes/DataExtensionField.js +131 -54
- package/lib/metadataTypes/DataExtensionTemplate.js +22 -4
- package/lib/metadataTypes/DataExtract.js +61 -48
- package/lib/metadataTypes/DataExtractType.js +14 -8
- package/lib/metadataTypes/Discovery.js +21 -16
- package/lib/metadataTypes/Email.js +32 -12
- package/lib/metadataTypes/EmailSendDefinition.js +85 -80
- package/lib/metadataTypes/EventDefinition.js +61 -43
- package/lib/metadataTypes/FileTransfer.js +72 -52
- package/lib/metadataTypes/Filter.js +11 -4
- package/lib/metadataTypes/Folder.js +149 -117
- package/lib/metadataTypes/FtpLocation.js +14 -8
- package/lib/metadataTypes/ImportFile.js +61 -64
- package/lib/metadataTypes/Interaction.js +19 -4
- package/lib/metadataTypes/List.js +54 -13
- package/lib/metadataTypes/MetadataType.js +668 -454
- package/lib/metadataTypes/MobileCode.js +46 -0
- package/lib/metadataTypes/MobileKeyword.js +114 -0
- package/lib/metadataTypes/Query.js +204 -103
- package/lib/metadataTypes/Role.js +76 -61
- package/lib/metadataTypes/Script.js +145 -81
- package/lib/metadataTypes/SetDefinition.js +20 -8
- package/lib/metadataTypes/TriggeredSendDefinition.js +78 -58
- package/lib/metadataTypes/definitions/Asset.definition.js +21 -10
- package/lib/metadataTypes/definitions/AttributeGroup.definition.js +12 -0
- package/lib/metadataTypes/definitions/Automation.definition.js +10 -5
- package/lib/metadataTypes/definitions/Campaign.definition.js +44 -1
- package/lib/metadataTypes/definitions/DataExtension.definition.js +4 -0
- package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +6 -0
- package/lib/metadataTypes/definitions/DataExtract.definition.js +18 -14
- package/lib/metadataTypes/definitions/Discovery.definition.js +12 -0
- package/lib/metadataTypes/definitions/EmailSendDefinition.definition.js +4 -0
- package/lib/metadataTypes/definitions/EventDefinition.definition.js +22 -0
- package/lib/metadataTypes/definitions/FileTransfer.definition.js +4 -0
- package/lib/metadataTypes/definitions/Filter.definition.js +4 -0
- package/lib/metadataTypes/definitions/Folder.definition.js +6 -0
- package/lib/metadataTypes/definitions/FtpLocation.definition.js +4 -0
- package/lib/metadataTypes/definitions/ImportFile.definition.js +10 -5
- package/lib/metadataTypes/definitions/Interaction.definition.js +4 -0
- package/lib/metadataTypes/definitions/MobileCode.definition.js +163 -0
- package/lib/metadataTypes/definitions/MobileKeyword.definition.js +253 -0
- package/lib/metadataTypes/definitions/Query.definition.js +4 -0
- package/lib/metadataTypes/definitions/Role.definition.js +5 -0
- package/lib/metadataTypes/definitions/Script.definition.js +4 -0
- package/lib/metadataTypes/definitions/SetDefinition.definition.js +28 -0
- package/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js +4 -0
- package/lib/retrieveChangelog.js +7 -6
- package/lib/util/auth.js +117 -0
- package/lib/util/businessUnit.js +55 -66
- package/lib/util/cache.js +194 -0
- package/lib/util/cli.js +90 -116
- package/lib/util/config.js +302 -0
- package/lib/util/devops.js +240 -50
- package/lib/util/file.js +120 -191
- package/lib/util/init.config.js +195 -69
- package/lib/util/init.git.js +45 -50
- package/lib/util/init.js +72 -59
- package/lib/util/init.npm.js +48 -39
- package/lib/util/util.js +280 -564
- package/package.json +44 -33
- package/test/dataExtension.test.js +152 -0
- package/test/mockRoot/.mcdev-auth.json +8 -0
- package/test/mockRoot/.mcdevrc.json +67 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json +39 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/testDataExtension.dataExtension-meta.json +23 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +11 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql +4 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json +11 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql +4 -0
- package/test/query.test.js +149 -0
- package/test/resourceFactory.js +142 -0
- package/test/resources/1111111/dataFolder/retrieve-response.xml +43 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +18 -0
- package/test/resources/9999999/automation/v1/queries/get-response.json +24 -0
- package/test/resources/9999999/automation/v1/queries/post-response.json +18 -0
- package/test/resources/9999999/dataExtension/build-expected.json +51 -0
- package/test/resources/9999999/dataExtension/create-expected.json +23 -0
- package/test/resources/9999999/dataExtension/create-response.xml +54 -0
- package/test/resources/9999999/dataExtension/retrieve-expected.json +51 -0
- package/test/resources/9999999/dataExtension/retrieve-response.xml +47 -0
- package/test/resources/9999999/dataExtension/template-expected.json +51 -0
- package/test/resources/9999999/dataExtension/update-expected.json +55 -0
- package/test/resources/9999999/dataExtension/update-response.xml +52 -0
- package/test/resources/9999999/dataExtensionField/retrieve-response.xml +93 -0
- package/test/resources/9999999/dataExtensionTemplate/retrieve-response.xml +303 -0
- package/test/resources/9999999/dataFolder/retrieve-response.xml +65 -0
- package/test/resources/9999999/query/build-expected.json +8 -0
- package/test/resources/9999999/query/get-expected.json +11 -0
- package/test/resources/9999999/query/patch-expected.json +11 -0
- package/test/resources/9999999/query/post-expected.json +11 -0
- package/test/resources/9999999/query/template-expected.json +8 -0
- package/test/resources/auth.json +32 -0
- package/test/resources/rest404-response.json +5 -0
- package/test/resources/retrieve-response.xml +21 -0
- package/test/utils.js +107 -0
- package/types/mcdev.d.js +301 -0
- package/CHANGELOG.md +0 -126
- package/PULL_REQUEST_TEMPLATE.md +0 -19
- package/test/util/file.js +0 -51
|
@@ -1,41 +1,47 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
3
4
|
const MetadataType = require('./MetadataType');
|
|
4
5
|
const Util = require('../util/util');
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* ImportFile MetadataType
|
|
9
|
+
*
|
|
8
10
|
* @augments MetadataType
|
|
9
11
|
*/
|
|
10
12
|
class Discovery extends MetadataType {
|
|
11
13
|
/**
|
|
12
14
|
* Retrieves API endpoint
|
|
13
15
|
* documentation: https://developer.salesforce.com/docs/atlas.en-us.noversion.mc-apis.meta/mc-apis/routes.htm
|
|
14
|
-
*
|
|
15
|
-
* @param {
|
|
16
|
-
* @param {
|
|
17
|
-
* @
|
|
16
|
+
*
|
|
17
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
18
|
+
* @param {void} [_] not used
|
|
19
|
+
* @param {TYPE.BuObject} buObject properties for auth
|
|
20
|
+
* @param {void} [___] unused parameter
|
|
21
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
22
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
18
23
|
*/
|
|
19
|
-
static async retrieve(retrieveDir, _, buObject) {
|
|
24
|
+
static async retrieve(retrieveDir, _, buObject, ___, key) {
|
|
25
|
+
if (key) {
|
|
26
|
+
Util.logger.error('Discovery.retrieve() does not support key parameter');
|
|
27
|
+
}
|
|
20
28
|
if (buObject.eid !== buObject.mid) {
|
|
21
29
|
// don't run for BUs other than Parent BU
|
|
22
|
-
Util.logger.warn('Skipping Discovery retrieval on non-parent BU');
|
|
30
|
+
Util.logger.warn(' - Skipping Discovery retrieval on non-parent BU');
|
|
23
31
|
return;
|
|
24
32
|
} else {
|
|
25
|
-
const res = await
|
|
26
|
-
Object.keys(this.definition.endPointMapping).map(
|
|
27
|
-
this.
|
|
28
|
-
uri: this.definition.endPointMapping[endpoint],
|
|
29
|
-
headers: {},
|
|
30
|
-
})
|
|
33
|
+
const res = await this.client.rest.getCollection(
|
|
34
|
+
Object.keys(this.definition.endPointMapping).map(
|
|
35
|
+
(endpoint) => this.definition.endPointMapping[endpoint]
|
|
31
36
|
)
|
|
32
37
|
);
|
|
38
|
+
|
|
33
39
|
const metadataStructure = {};
|
|
34
40
|
for (const [i, v] of res.entries()) {
|
|
35
|
-
v.
|
|
36
|
-
metadataStructure[v.
|
|
41
|
+
v.key = Object.keys(this.definition.endPointMapping)[i];
|
|
42
|
+
metadataStructure[v.key] = v;
|
|
37
43
|
}
|
|
38
|
-
await
|
|
44
|
+
await super.saveResults(metadataStructure, retrieveDir, null);
|
|
39
45
|
Util.logger.info('Downloaded: ' + this.definition.type);
|
|
40
46
|
return { metadata: metadataStructure, type: this.definition.type };
|
|
41
47
|
}
|
|
@@ -44,6 +50,5 @@ class Discovery extends MetadataType {
|
|
|
44
50
|
|
|
45
51
|
// Assign definition to static attributes
|
|
46
52
|
Discovery.definition = require('../MetadataTypeDefinitions').discovery;
|
|
47
|
-
Discovery.client = undefined;
|
|
48
53
|
|
|
49
54
|
module.exports = Discovery;
|
|
@@ -1,43 +1,63 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
3
4
|
const MetadataType = require('./MetadataType');
|
|
4
5
|
const Util = require('../util/util');
|
|
6
|
+
const cache = require('../util/cache');
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Email MetadataType
|
|
10
|
+
*
|
|
8
11
|
* @augments MetadataType
|
|
9
12
|
*/
|
|
10
13
|
class Email extends MetadataType {
|
|
11
14
|
/**
|
|
12
15
|
* Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
|
|
13
|
-
*
|
|
14
|
-
* @
|
|
16
|
+
*
|
|
17
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
18
|
+
* @param {void} [_] unused parameter
|
|
19
|
+
* @param {void} [__] unused parameter
|
|
20
|
+
* @param {void} [___] unused parameter
|
|
21
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
22
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
|
|
15
23
|
*/
|
|
16
|
-
static retrieve(retrieveDir) {
|
|
24
|
+
static retrieve(retrieveDir, _, __, ___, key) {
|
|
17
25
|
Util.logger.warn(
|
|
18
|
-
'Classic E-Mails are deprecated and will be discontinued by SFMC in the near future. Ensure that you migrate any existing E-Mails to Content Builder as soon as possible.'
|
|
26
|
+
' - Classic E-Mails are deprecated and will be discontinued by SFMC in the near future. Ensure that you migrate any existing E-Mails to Content Builder as soon as possible.'
|
|
19
27
|
);
|
|
28
|
+
/** @type {TYPE.SoapRequestParams} */
|
|
29
|
+
let requestParams = null;
|
|
30
|
+
if (key) {
|
|
31
|
+
requestParams = {
|
|
32
|
+
filter: {
|
|
33
|
+
leftOperand: 'CustomerKey',
|
|
34
|
+
operator: 'equals',
|
|
35
|
+
rightOperand: key,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
20
39
|
// !dont activate `await File.initPrettier('html');` as we only want to retrieve for migration and formatting might mess with the outcome
|
|
21
|
-
return super.
|
|
40
|
+
return super.retrieveSOAP(retrieveDir, null, requestParams);
|
|
22
41
|
}
|
|
23
42
|
/**
|
|
24
43
|
* manages post retrieve steps
|
|
25
|
-
*
|
|
26
|
-
* @
|
|
44
|
+
*
|
|
45
|
+
* @param {TYPE.MetadataTypeItem} metadata a single query
|
|
46
|
+
* @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
|
|
27
47
|
*/
|
|
28
48
|
static postRetrieveTasks(metadata) {
|
|
29
49
|
return this.parseMetadata(metadata);
|
|
30
50
|
}
|
|
31
51
|
/**
|
|
32
52
|
* parses retrieved Metadata before saving
|
|
33
|
-
*
|
|
34
|
-
* @
|
|
53
|
+
*
|
|
54
|
+
* @param {TYPE.MetadataTypeItem} metadata a single query activity definition
|
|
55
|
+
* @returns {TYPE.MetadataTypeItem} Array with one metadata object and one sql string
|
|
35
56
|
*/
|
|
36
57
|
static parseMetadata(metadata) {
|
|
37
58
|
// folder
|
|
38
59
|
try {
|
|
39
|
-
metadata.r__folder_Path =
|
|
40
|
-
this.cache,
|
|
60
|
+
metadata.r__folder_Path = cache.searchForField(
|
|
41
61
|
'folder',
|
|
42
62
|
metadata.CategoryID,
|
|
43
63
|
'ID',
|
|
@@ -46,7 +66,7 @@ class Email extends MetadataType {
|
|
|
46
66
|
delete metadata.CategoryID;
|
|
47
67
|
} catch (ex) {
|
|
48
68
|
Util.logger.warn(
|
|
49
|
-
`Classic E-Mail '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
69
|
+
` - Classic E-Mail '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
50
70
|
);
|
|
51
71
|
}
|
|
52
72
|
|
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
3
4
|
const MetadataType = require('./MetadataType');
|
|
4
5
|
const Util = require('../util/util');
|
|
6
|
+
const cache = require('../util/cache');
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* MessageSendActivity MetadataType
|
|
10
|
+
*
|
|
8
11
|
* @augments MetadataType
|
|
9
12
|
*/
|
|
10
13
|
class EmailSendDefinition extends MetadataType {
|
|
11
14
|
/**
|
|
12
15
|
* Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
|
|
13
|
-
*
|
|
14
|
-
* @param {
|
|
15
|
-
* @param {
|
|
16
|
-
* @
|
|
16
|
+
*
|
|
17
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
18
|
+
* @param {void} [_] unused parameter
|
|
19
|
+
* @param {void} [__] unused parameter
|
|
20
|
+
* @param {void} [___] unused parameter
|
|
21
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
22
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
|
|
17
23
|
*/
|
|
18
|
-
static retrieve(retrieveDir, _,
|
|
19
|
-
|
|
24
|
+
static retrieve(retrieveDir, _, __, ___, key) {
|
|
25
|
+
/** @type {TYPE.SoapRequestParams} */
|
|
26
|
+
let requestParams = {
|
|
20
27
|
filter: {
|
|
21
28
|
leftOperand: {
|
|
22
29
|
// somehow that parameter controls visible (non deleted?) email send activities
|
|
@@ -32,12 +39,27 @@ class EmailSendDefinition extends MetadataType {
|
|
|
32
39
|
},
|
|
33
40
|
},
|
|
34
41
|
};
|
|
35
|
-
|
|
42
|
+
if (key) {
|
|
43
|
+
// move original filter down one level into rightOperand and add key filter into leftOperand
|
|
44
|
+
requestParams = {
|
|
45
|
+
filter: {
|
|
46
|
+
leftOperand: {
|
|
47
|
+
leftOperand: 'CustomerKey',
|
|
48
|
+
operator: 'equals',
|
|
49
|
+
rightOperand: key,
|
|
50
|
+
},
|
|
51
|
+
operator: 'AND',
|
|
52
|
+
rightOperand: requestParams.filter,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return super.retrieveSOAP(retrieveDir, null, requestParams);
|
|
36
57
|
}
|
|
37
58
|
|
|
38
59
|
/**
|
|
39
60
|
* Updates a single item
|
|
40
|
-
*
|
|
61
|
+
*
|
|
62
|
+
* @param {TYPE.MetadataTypeItem} metadataItem a single item
|
|
41
63
|
* @returns {Promise} Promise
|
|
42
64
|
*/
|
|
43
65
|
static update(metadataItem) {
|
|
@@ -46,62 +68,54 @@ class EmailSendDefinition extends MetadataType {
|
|
|
46
68
|
|
|
47
69
|
/**
|
|
48
70
|
* Creates a single item
|
|
49
|
-
*
|
|
71
|
+
*
|
|
72
|
+
* @param {TYPE.MetadataTypeItem} metadataItem a single item
|
|
50
73
|
* @returns {Promise} Promise
|
|
51
74
|
*/
|
|
52
75
|
static create(metadataItem) {
|
|
53
76
|
return super.createSOAP(metadataItem);
|
|
54
77
|
}
|
|
55
78
|
|
|
79
|
+
/**
|
|
80
|
+
* Delete a metadata item from the specified business unit
|
|
81
|
+
*
|
|
82
|
+
* @param {TYPE.BuObject} buObject references credentials
|
|
83
|
+
* @param {string} customerKey Identifier of data extension
|
|
84
|
+
* @returns {Promise.<boolean>} deletion success status
|
|
85
|
+
*/
|
|
86
|
+
static deleteByKey(buObject, customerKey) {
|
|
87
|
+
return super.deleteByKeySOAP(buObject, customerKey, false);
|
|
88
|
+
}
|
|
89
|
+
|
|
56
90
|
/**
|
|
57
91
|
* prepares a single item for deployment
|
|
58
|
-
*
|
|
59
|
-
* @
|
|
92
|
+
*
|
|
93
|
+
* @param {TYPE.MetadataTypeItem} metadata a single script activity definition
|
|
94
|
+
* @returns {Promise.<TYPE.MetadataTypeItem>} Promise
|
|
60
95
|
*/
|
|
61
96
|
static async preDeployTasks(metadata) {
|
|
62
97
|
// re-add IsPlatformObject, required for visibility
|
|
63
98
|
metadata.IsPlatformObject = false;
|
|
64
99
|
// folder
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.cache,
|
|
68
|
-
'folder',
|
|
69
|
-
metadata.r__folder_Path,
|
|
70
|
-
'Path',
|
|
71
|
-
'ID'
|
|
72
|
-
);
|
|
73
|
-
delete metadata.r__folder_Path;
|
|
74
|
-
} catch (ex) {
|
|
75
|
-
Util.logger.error(`${this.definition.typeName} '${metadata.key}': ${ex.message}`);
|
|
76
|
-
}
|
|
100
|
+
metadata.CategoryID = cache.searchForField('folder', metadata.r__folder_Path, 'Path', 'ID');
|
|
101
|
+
delete metadata.r__folder_Path;
|
|
77
102
|
// email
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
this.cache,
|
|
95
|
-
'asset',
|
|
96
|
-
metadata.r__assetMessage_Key,
|
|
97
|
-
'customerKey',
|
|
98
|
-
'legacyData.legacyId'
|
|
99
|
-
);
|
|
100
|
-
delete metadata.r__assetMessage_Key;
|
|
101
|
-
delete metadata.r__assetMessage_Name;
|
|
102
|
-
}
|
|
103
|
-
} catch (ex) {
|
|
104
|
-
Util.logger.error(`${this.definition.typeName} '${metadata.key}': ${ex.message}`);
|
|
103
|
+
metadata.Email = {};
|
|
104
|
+
if (metadata.r__email_Name) {
|
|
105
|
+
// classic
|
|
106
|
+
metadata.Email.ID = cache.searchForField('email', metadata.r__email_Name, 'Name', 'ID');
|
|
107
|
+
delete metadata.r__email_Name;
|
|
108
|
+
} else if (metadata.r__assetMessage_Key) {
|
|
109
|
+
// content builder
|
|
110
|
+
// * this ignores r__assetMessage_Name on purpose as that is only unique per parent folder but useful during PR reviews
|
|
111
|
+
metadata.Email.ID = cache.searchForField(
|
|
112
|
+
'asset',
|
|
113
|
+
metadata.r__assetMessage_Key,
|
|
114
|
+
'customerKey',
|
|
115
|
+
'legacyData.legacyId'
|
|
116
|
+
);
|
|
117
|
+
delete metadata.r__assetMessage_Key;
|
|
118
|
+
delete metadata.r__assetMessage_Name;
|
|
105
119
|
}
|
|
106
120
|
// Target Audience DataExtension
|
|
107
121
|
// normalize first because this can be an array
|
|
@@ -121,8 +135,7 @@ class EmailSendDefinition extends MetadataType {
|
|
|
121
135
|
`Skipping ${metadata.Name} (${metadata.CustomerKey}): Expecting DataSourceTypeID to equal 'CustomObject' when r__dataExtension_Key is defined; Found '${sdl.DataSourceTypeID}'`
|
|
122
136
|
);
|
|
123
137
|
}
|
|
124
|
-
sdl.CustomObjectID =
|
|
125
|
-
this.cache,
|
|
138
|
+
sdl.CustomObjectID = cache.searchForField(
|
|
126
139
|
'dataExtension',
|
|
127
140
|
sdl.r__dataExtension_Key,
|
|
128
141
|
'CustomerKey',
|
|
@@ -137,7 +150,7 @@ class EmailSendDefinition extends MetadataType {
|
|
|
137
150
|
// get List (required)
|
|
138
151
|
if (sdl.r__list_PathName) {
|
|
139
152
|
sdl.List = {
|
|
140
|
-
ID:
|
|
153
|
+
ID: cache.getListObjectId(sdl.r__list_PathName, 'ID'),
|
|
141
154
|
};
|
|
142
155
|
delete sdl.r__list_PathName;
|
|
143
156
|
} else {
|
|
@@ -152,24 +165,25 @@ class EmailSendDefinition extends MetadataType {
|
|
|
152
165
|
|
|
153
166
|
/**
|
|
154
167
|
* manages post retrieve steps
|
|
155
|
-
*
|
|
156
|
-
* @
|
|
168
|
+
*
|
|
169
|
+
* @param {TYPE.MetadataTypeItem} metadata a single query
|
|
170
|
+
* @returns {TYPE.MetadataTypeItem} Array with one metadata object and one query string
|
|
157
171
|
*/
|
|
158
172
|
static postRetrieveTasks(metadata) {
|
|
159
173
|
return this.parseMetadata(metadata);
|
|
160
174
|
}
|
|
161
175
|
/**
|
|
162
176
|
* parses retrieved Metadata before saving
|
|
163
|
-
*
|
|
164
|
-
* @
|
|
177
|
+
*
|
|
178
|
+
* @param {TYPE.MetadataTypeItem} metadata a single query activity definition
|
|
179
|
+
* @returns {TYPE.MetadataTypeItem} Array with one metadata object and one sql string
|
|
165
180
|
*/
|
|
166
181
|
static parseMetadata(metadata) {
|
|
167
182
|
// remove IsPlatformObject, always has to be 'false'
|
|
168
183
|
delete metadata.IsPlatformObject;
|
|
169
184
|
// folder
|
|
170
185
|
try {
|
|
171
|
-
metadata.r__folder_Path =
|
|
172
|
-
this.cache,
|
|
186
|
+
metadata.r__folder_Path = cache.searchForField(
|
|
173
187
|
'folder',
|
|
174
188
|
metadata.CategoryID,
|
|
175
189
|
'ID',
|
|
@@ -178,34 +192,26 @@ class EmailSendDefinition extends MetadataType {
|
|
|
178
192
|
delete metadata.CategoryID;
|
|
179
193
|
} catch (ex) {
|
|
180
194
|
Util.logger.warn(
|
|
181
|
-
|
|
195
|
+
` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
182
196
|
);
|
|
183
197
|
}
|
|
184
198
|
// email
|
|
185
199
|
try {
|
|
186
200
|
// classic
|
|
187
|
-
const classicEmail =
|
|
188
|
-
this.cache,
|
|
189
|
-
'email',
|
|
190
|
-
metadata.Email.ID,
|
|
191
|
-
'ID',
|
|
192
|
-
'Name'
|
|
193
|
-
);
|
|
201
|
+
const classicEmail = cache.searchForField('email', metadata.Email.ID, 'ID', 'Name');
|
|
194
202
|
metadata.r__email_Name = classicEmail;
|
|
195
203
|
delete metadata.Email;
|
|
196
|
-
} catch
|
|
204
|
+
} catch {
|
|
197
205
|
try {
|
|
198
206
|
// content builder
|
|
199
|
-
const contentBuilderEmailName =
|
|
200
|
-
this.cache,
|
|
207
|
+
const contentBuilderEmailName = cache.searchForField(
|
|
201
208
|
'asset',
|
|
202
209
|
metadata.Email.ID,
|
|
203
210
|
'legacyData.legacyId',
|
|
204
211
|
'name'
|
|
205
212
|
);
|
|
206
213
|
metadata.r__assetMessage_Name = contentBuilderEmailName;
|
|
207
|
-
const contentBuilderEmailKey =
|
|
208
|
-
this.cache,
|
|
214
|
+
const contentBuilderEmailKey = cache.searchForField(
|
|
209
215
|
'asset',
|
|
210
216
|
metadata.Email.ID,
|
|
211
217
|
'legacyData.legacyId',
|
|
@@ -213,9 +219,9 @@ class EmailSendDefinition extends MetadataType {
|
|
|
213
219
|
);
|
|
214
220
|
metadata.r__assetMessage_Key = contentBuilderEmailKey;
|
|
215
221
|
delete metadata.Email;
|
|
216
|
-
} catch
|
|
222
|
+
} catch {
|
|
217
223
|
Util.logger.warn(
|
|
218
|
-
|
|
224
|
+
` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find email with ID ${metadata.Email.ID} in Classic nor in Content Builder.`
|
|
219
225
|
);
|
|
220
226
|
}
|
|
221
227
|
}
|
|
@@ -231,27 +237,26 @@ class EmailSendDefinition extends MetadataType {
|
|
|
231
237
|
// get DataExtension keys
|
|
232
238
|
if (sdl.CustomObjectID) {
|
|
233
239
|
try {
|
|
234
|
-
sdl.r__dataExtension_Key =
|
|
235
|
-
this.cache,
|
|
240
|
+
sdl.r__dataExtension_Key = cache.searchForField(
|
|
236
241
|
'dataExtension',
|
|
237
242
|
sdl.CustomObjectID,
|
|
238
243
|
'ObjectID',
|
|
239
244
|
'CustomerKey'
|
|
240
245
|
);
|
|
241
246
|
delete sdl.CustomObjectID;
|
|
242
|
-
} catch
|
|
247
|
+
} catch {
|
|
243
248
|
Util.logger.warn(
|
|
244
|
-
|
|
249
|
+
` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': Could not find Target Audience (DataExtension) with ObjectID ${sdl.CustomObjectID}.`
|
|
245
250
|
);
|
|
246
251
|
}
|
|
247
252
|
}
|
|
248
253
|
// List
|
|
249
254
|
try {
|
|
250
|
-
sdl.r__list_PathName =
|
|
255
|
+
sdl.r__list_PathName = cache.getListPathName(sdl.List.ID, 'ID');
|
|
251
256
|
delete sdl.List;
|
|
252
257
|
} catch (ex) {
|
|
253
258
|
Util.logger.warn(
|
|
254
|
-
|
|
259
|
+
` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
|
|
255
260
|
);
|
|
256
261
|
}
|
|
257
262
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
3
4
|
const MetadataType = require('./MetadataType');
|
|
4
5
|
const Util = require('../util/util');
|
|
5
6
|
const File = require('../util/file');
|
|
7
|
+
const cache = require('../util/cache');
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* EventDefinition MetadataType
|
|
11
|
+
*
|
|
9
12
|
* @augments MetadataType
|
|
10
13
|
*/
|
|
11
14
|
class EventDefinition extends MetadataType {
|
|
@@ -13,35 +16,48 @@ class EventDefinition extends MetadataType {
|
|
|
13
16
|
* Retrieves Metadata of Event Definition.
|
|
14
17
|
* Endpoint /interaction/v1/EventDefinitions return all Event Definitions with all details.
|
|
15
18
|
* Currently it is not needed to loop over Imports with endpoint /interaction/v1/EventDefinitions/{id}
|
|
16
|
-
*
|
|
17
|
-
* @
|
|
19
|
+
*
|
|
20
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
21
|
+
* @param {void} [_] unused parameter
|
|
22
|
+
* @param {void} [__] unused parameter
|
|
23
|
+
* @param {void} [___] unused parameter
|
|
24
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
25
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
|
|
18
26
|
*/
|
|
19
|
-
static retrieve(retrieveDir) {
|
|
20
|
-
return super.retrieveREST(
|
|
27
|
+
static retrieve(retrieveDir, _, __, ___, key) {
|
|
28
|
+
return super.retrieveREST(
|
|
29
|
+
retrieveDir,
|
|
30
|
+
`/interaction/v1/EventDefinitions${
|
|
31
|
+
key ? '/key:' + encodeURIComponent(key) : ''
|
|
32
|
+
}?extras=all`,
|
|
33
|
+
null,
|
|
34
|
+
null,
|
|
35
|
+
key
|
|
36
|
+
);
|
|
21
37
|
}
|
|
22
38
|
|
|
23
39
|
/**
|
|
24
40
|
* Retrieves event definition metadata for caching
|
|
25
|
-
*
|
|
41
|
+
*
|
|
42
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
|
|
26
43
|
*/
|
|
27
44
|
static retrieveForCache() {
|
|
28
|
-
return super.retrieveREST(null, '/interaction/v1/EventDefinitions/'
|
|
45
|
+
return super.retrieveREST(null, '/interaction/v1/EventDefinitions/');
|
|
29
46
|
}
|
|
30
47
|
|
|
31
48
|
/**
|
|
32
49
|
* Retrieve a specific Event Definition by Name
|
|
33
|
-
*
|
|
34
|
-
* @param {
|
|
35
|
-
* @param {
|
|
36
|
-
* @
|
|
50
|
+
*
|
|
51
|
+
* @param {string} templateDir Directory where retrieved metadata directory will be saved
|
|
52
|
+
* @param {string} name name of the metadata file
|
|
53
|
+
* @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
|
|
54
|
+
* @returns {Promise.<TYPE.MetadataTypeItemObj>} Promise of metadata
|
|
37
55
|
*/
|
|
38
56
|
static async retrieveAsTemplate(templateDir, name, templateVariables) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const res = await this.client.RestClient.get(options);
|
|
44
|
-
const event = res.body.items.filter((item) => item.name === name);
|
|
57
|
+
const res = await this.client.rest.get(
|
|
58
|
+
'/interaction/v1/EventDefinitions?name=' + encodeURIComponent(name)
|
|
59
|
+
);
|
|
60
|
+
const event = res.items.filter((item) => item.name === name);
|
|
45
61
|
try {
|
|
46
62
|
if (!event || event.length === 0) {
|
|
47
63
|
throw new Error(`No Event Definitions Found with name "${name}"`);
|
|
@@ -50,7 +66,7 @@ class EventDefinition extends MetadataType {
|
|
|
50
66
|
`Multiple Event Definitions with name "${name}"` +
|
|
51
67
|
`please rename to be unique to avoid issues`
|
|
52
68
|
);
|
|
53
|
-
} else if (event
|
|
69
|
+
} else if (event?.length === 1) {
|
|
54
70
|
const originalKey = event[0][this.definition.keyField];
|
|
55
71
|
const eventDef = JSON.parse(
|
|
56
72
|
Util.replaceByObject(
|
|
@@ -69,14 +85,12 @@ class EventDefinition extends MetadataType {
|
|
|
69
85
|
|
|
70
86
|
// remove all fields listed in Definition for templating
|
|
71
87
|
this.keepTemplateFields(eventDef);
|
|
72
|
-
File.writeJSONToFile(
|
|
88
|
+
await File.writeJSONToFile(
|
|
73
89
|
[templateDir, this.definition.type].join('/'),
|
|
74
90
|
originalKey + '.' + this.definition.type + '-meta',
|
|
75
91
|
JSON.parse(Util.replaceByObject(JSON.stringify(eventDef), templateVariables))
|
|
76
92
|
);
|
|
77
|
-
Util.logger.info(
|
|
78
|
-
`EventDefinition.retrieveAsTemplate:: Written Metadata to filesystem (${name})`
|
|
79
|
-
);
|
|
93
|
+
Util.logger.info(`- templated ${this.definition.type}: ${name}`);
|
|
80
94
|
return { metadata: eventDef, type: this.definition.type };
|
|
81
95
|
} else {
|
|
82
96
|
throw new Error(
|
|
@@ -93,8 +107,9 @@ class EventDefinition extends MetadataType {
|
|
|
93
107
|
|
|
94
108
|
/**
|
|
95
109
|
* manages post retrieve steps
|
|
96
|
-
*
|
|
97
|
-
* @
|
|
110
|
+
*
|
|
111
|
+
* @param {TYPE.MetadataTypeItem} eventDef a single item of Event Definition
|
|
112
|
+
* @returns {TYPE.MetadataTypeItem} metadata
|
|
98
113
|
*/
|
|
99
114
|
static postRetrieveTasks(eventDef) {
|
|
100
115
|
const val = this.parseMetadata(eventDef);
|
|
@@ -104,7 +119,8 @@ class EventDefinition extends MetadataType {
|
|
|
104
119
|
|
|
105
120
|
/**
|
|
106
121
|
* Creates a single Event Definition
|
|
107
|
-
*
|
|
122
|
+
*
|
|
123
|
+
* @param {TYPE.MetadataTypeItem} EventDefinition a single Event Definition
|
|
108
124
|
* @returns {Promise} Promise
|
|
109
125
|
*/
|
|
110
126
|
static create(EventDefinition) {
|
|
@@ -113,18 +129,22 @@ class EventDefinition extends MetadataType {
|
|
|
113
129
|
|
|
114
130
|
/**
|
|
115
131
|
* Updates a single Event Definition (using PUT method since PATCH isn't supported)
|
|
116
|
-
*
|
|
132
|
+
*
|
|
133
|
+
* @param {TYPE.MetadataTypeItem} metadataEntry a single Event Definition
|
|
117
134
|
* @returns {Promise} Promise
|
|
118
135
|
*/
|
|
119
|
-
static async update(
|
|
120
|
-
|
|
136
|
+
static async update(metadataEntry) {
|
|
137
|
+
if (metadataEntry === null || metadataEntry === undefined) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
this.removeNotUpdateableFields(metadataEntry);
|
|
121
141
|
const options = {
|
|
122
|
-
uri: '/interaction/v1/EventDefinitions/' +
|
|
123
|
-
json:
|
|
142
|
+
uri: '/interaction/v1/EventDefinitions/' + metadataEntry.id,
|
|
143
|
+
json: metadataEntry,
|
|
124
144
|
headers: {},
|
|
125
145
|
};
|
|
126
146
|
try {
|
|
127
|
-
const response = await this.client.
|
|
147
|
+
const response = await this.client.rest.put(options);
|
|
128
148
|
super.checkForErrors(response);
|
|
129
149
|
return response;
|
|
130
150
|
} catch (ex) {
|
|
@@ -133,7 +153,7 @@ class EventDefinition extends MetadataType {
|
|
|
133
153
|
this.definition.type,
|
|
134
154
|
'updateREST',
|
|
135
155
|
ex,
|
|
136
|
-
|
|
156
|
+
metadataEntry.name
|
|
137
157
|
);
|
|
138
158
|
return null;
|
|
139
159
|
}
|
|
@@ -141,12 +161,12 @@ class EventDefinition extends MetadataType {
|
|
|
141
161
|
|
|
142
162
|
/**
|
|
143
163
|
* prepares an event definition for deployment
|
|
144
|
-
*
|
|
145
|
-
* @
|
|
164
|
+
*
|
|
165
|
+
* @param {TYPE.MetadataTypeItem} metadata a single eventDefinition
|
|
166
|
+
* @returns {TYPE.MetadataTypeItem} parsed version
|
|
146
167
|
*/
|
|
147
|
-
static
|
|
148
|
-
metadata.dataExtensionId =
|
|
149
|
-
this.cache,
|
|
168
|
+
static preDeployTasks(metadata) {
|
|
169
|
+
metadata.dataExtensionId = cache.searchForField(
|
|
150
170
|
'dataExtension',
|
|
151
171
|
metadata.dataExtensionName,
|
|
152
172
|
'Name',
|
|
@@ -158,13 +178,13 @@ class EventDefinition extends MetadataType {
|
|
|
158
178
|
|
|
159
179
|
/**
|
|
160
180
|
* parses retrieved Metadata before saving
|
|
161
|
-
*
|
|
162
|
-
* @
|
|
181
|
+
*
|
|
182
|
+
* @param {TYPE.MetadataTypeItem} metadata a single event definition
|
|
183
|
+
* @returns {TYPE.MetadataTypeItem} parsed metadata
|
|
163
184
|
*/
|
|
164
185
|
static parseMetadata(metadata) {
|
|
165
186
|
try {
|
|
166
|
-
metadata.dataExtensionId =
|
|
167
|
-
this.cache,
|
|
187
|
+
metadata.dataExtensionId = cache.searchForField(
|
|
168
188
|
'dataExtension',
|
|
169
189
|
metadata.dataExtensionId,
|
|
170
190
|
'ObjectID',
|
|
@@ -172,7 +192,7 @@ class EventDefinition extends MetadataType {
|
|
|
172
192
|
);
|
|
173
193
|
metadata.arguments.dataExtensionId = metadata.dataExtensionId;
|
|
174
194
|
return JSON.parse(JSON.stringify(metadata));
|
|
175
|
-
} catch
|
|
195
|
+
} catch {
|
|
176
196
|
Util.metadataLogger(
|
|
177
197
|
'verbose',
|
|
178
198
|
this.definition.type,
|
|
@@ -186,7 +206,5 @@ class EventDefinition extends MetadataType {
|
|
|
186
206
|
|
|
187
207
|
// Assign definition to static attributes
|
|
188
208
|
EventDefinition.definition = require('../MetadataTypeDefinitions').eventDefinition;
|
|
189
|
-
EventDefinition.cache = {};
|
|
190
|
-
EventDefinition.client = undefined;
|
|
191
209
|
|
|
192
210
|
module.exports = EventDefinition;
|