mcdev 4.3.4 → 5.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/.coverage-comment-template.md +20 -0
- package/.coverage-comment-template.svelte +178 -0
- package/.eslintrc.json +2 -0
- package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
- package/.github/workflows/code-test.yml +36 -0
- package/.github/workflows/coverage-base-update.yml +57 -0
- package/.github/workflows/coverage-develop-branch.yml +41 -0
- package/.github/workflows/coverage-main-branch.yml +41 -0
- package/.github/workflows/coverage.yml +77 -0
- package/.husky/post-checkout +1 -1
- package/.prettierrc +1 -1
- package/.vscode/extensions.json +0 -4
- package/boilerplate/config.json +1 -1
- package/boilerplate/files/.prettierrc +1 -1
- package/boilerplate/files/.vscode/extensions.json +1 -1
- package/boilerplate/forcedUpdates.json +4 -0
- package/docs/dist/documentation.md +1196 -430
- package/lib/Builder.js +6 -1
- package/lib/Deployer.js +30 -5
- package/lib/MetadataTypeDefinitions.js +8 -6
- package/lib/MetadataTypeInfo.js +8 -6
- package/lib/cli.js +54 -42
- package/lib/index.js +82 -8
- package/lib/metadataTypes/Asset.js +73 -1
- package/lib/metadataTypes/AttributeGroup.js +0 -1
- package/lib/metadataTypes/Automation.js +48 -5
- package/lib/metadataTypes/Campaign.js +20 -7
- package/lib/metadataTypes/ContentArea.js +1 -1
- package/lib/metadataTypes/DataExtension.js +221 -184
- package/lib/metadataTypes/DataExtensionField.js +12 -19
- package/lib/metadataTypes/DataExtensionTemplate.js +1 -1
- package/lib/metadataTypes/DataExtract.js +1 -1
- package/lib/metadataTypes/DataExtractType.js +1 -1
- package/lib/metadataTypes/Email.js +1 -1
- package/lib/metadataTypes/{EmailSendDefinition.js → EmailSend.js} +5 -5
- package/lib/metadataTypes/{EventDefinition.js → Event.js} +17 -35
- package/lib/metadataTypes/{FtpLocation.js → FileLocation.js} +2 -2
- package/lib/metadataTypes/FileTransfer.js +8 -7
- package/lib/metadataTypes/Filter.js +1 -1
- package/lib/metadataTypes/Folder.js +8 -3
- package/lib/metadataTypes/ImportFile.js +6 -6
- package/lib/metadataTypes/{Interaction.js → Journey.js} +311 -147
- package/lib/metadataTypes/List.js +2 -2
- package/lib/metadataTypes/MetadataType.js +318 -90
- package/lib/metadataTypes/MobileCode.js +0 -1
- package/lib/metadataTypes/MobileKeyword.js +336 -40
- package/lib/metadataTypes/MobileMessage.js +473 -0
- package/lib/metadataTypes/Query.js +114 -32
- package/lib/metadataTypes/Role.js +60 -21
- package/lib/metadataTypes/Script.js +2 -3
- package/lib/metadataTypes/SendClassification.js +40 -0
- package/lib/metadataTypes/SetDefinition.js +1 -7
- package/lib/metadataTypes/TransactionalEmail.js +2 -3
- package/lib/metadataTypes/TransactionalMessage.js +1 -2
- package/lib/metadataTypes/TransactionalSMS.js +8 -15
- package/lib/metadataTypes/{TriggeredSendDefinition.js → TriggeredSend.js} +35 -27
- package/lib/metadataTypes/User.js +1177 -0
- package/lib/metadataTypes/definitions/Asset.definition.js +1 -0
- package/lib/metadataTypes/definitions/AttributeGroup.definition.js +1 -0
- package/lib/metadataTypes/definitions/Automation.definition.js +3 -2
- package/lib/metadataTypes/definitions/Campaign.definition.js +79 -4
- package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
- package/lib/metadataTypes/definitions/DataExtension.definition.js +2 -1
- package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -0
- package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -0
- package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -0
- package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -0
- package/lib/metadataTypes/definitions/Discovery.definition.js +1 -0
- package/lib/metadataTypes/definitions/Email.definition.js +1 -0
- package/lib/metadataTypes/definitions/{EmailSendDefinition.definition.js → EmailSend.definition.js} +4 -2
- package/lib/metadataTypes/definitions/{EventDefinition.definition.js → Event.definition.js} +2 -1
- package/lib/metadataTypes/definitions/{FtpLocation.definition.js → FileLocation.definition.js} +4 -3
- package/lib/metadataTypes/definitions/FileTransfer.definition.js +3 -2
- package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
- package/lib/metadataTypes/definitions/Folder.definition.js +2 -0
- package/lib/metadataTypes/definitions/ImportFile.definition.js +4 -3
- package/lib/metadataTypes/definitions/{Interaction.definition.js → Journey.definition.js} +11 -2
- package/lib/metadataTypes/definitions/List.definition.js +1 -0
- package/lib/metadataTypes/definitions/MobileCode.definition.js +3 -1
- package/lib/metadataTypes/definitions/MobileKeyword.definition.js +27 -17
- package/lib/metadataTypes/definitions/MobileMessage.definition.js +743 -0
- package/lib/metadataTypes/definitions/Query.definition.js +3 -2
- package/lib/metadataTypes/definitions/Role.definition.js +5 -0
- package/lib/metadataTypes/definitions/Script.definition.js +1 -0
- package/lib/metadataTypes/definitions/SendClassification.definition.js +114 -0
- package/lib/metadataTypes/definitions/SetDefinition.definition.js +1 -0
- package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -1
- package/lib/metadataTypes/definitions/TransactionalPush.definition.js +1 -0
- package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +1 -0
- package/lib/metadataTypes/definitions/{TriggeredSendDefinition.definition.js → TriggeredSend.definition.js} +5 -3
- package/lib/metadataTypes/definitions/User.definition.js +365 -0
- package/lib/retrieveChangelog.js +1 -2
- package/lib/util/auth.js +29 -9
- package/lib/util/businessUnit.js +3 -3
- package/lib/util/cli.js +55 -7
- package/lib/util/devops.js +6 -4
- package/lib/util/file.js +55 -13
- package/lib/util/init.config.js +1 -2
- package/lib/util/init.npm.js +3 -3
- package/lib/util/util.js +23 -14
- package/package.json +16 -15
- package/test/general.test.js +62 -0
- package/test/mockRoot/.mcdevrc.json +7 -5
- package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testBlocked_user.user-meta.json +23 -0
- package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testExisting_user.user-meta.json +31 -0
- package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testNew_user.user-meta.json +27 -0
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{childBU_dataextension_test.dataExtension-meta.json → testExisting_dataExtension.dataExtension-meta.json} +2 -2
- package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{testDataExtension.dataExtension-meta.json → testNew_dataExtension.dataExtension-meta.json} +2 -2
- package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_interaction.interaction-meta.json +576 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.amp +2 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +10 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.amp +2 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +10 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.amp +1 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.json +61 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.amp +1 -0
- package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.json +60 -0
- package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +1 -1
- package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json +1 -1
- package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.sql +1 -1
- package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +1 -1
- package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -1
- package/test/resourceFactory.js +13 -0
- package/test/resources/1111111/accountUser/configure-response.xml +70 -0
- package/test/resources/1111111/accountUser/create-response.xml +97 -0
- package/test/resources/1111111/accountUser/retrieve-response.xml +156 -0
- package/test/resources/1111111/accountUser/update-response.xml +111 -0
- package/test/resources/1111111/accountUserAccount/retrieve-response.xml +77 -0
- package/test/resources/1111111/platform/v1/setup/quickflow/data/get-response.json +455 -0
- package/test/resources/1111111/role/retrieve-response.xml +76 -0
- package/test/resources/1111111/user/build-expected.json +16 -0
- package/test/resources/1111111/user/create-expected.json +21 -0
- package/test/resources/1111111/user/retrieve-expected.json +24 -0
- package/test/resources/1111111/user/template-expected.json +16 -0
- package/test/resources/1111111/user/update-expected.json +21 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/delete-response.json +1 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +17 -0
- package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +3 -3
- package/test/resources/9999999/automation/v1/queries/get-response.json +21 -4
- package/test/resources/9999999/automation/v1/queries/post-response.json +4 -4
- package/test/resources/9999999/data/v1/customobjectdata/key/{childBU_dataextension_test → testExisting_dataExtension}/rowset/get-response.json +1 -1
- package/test/resources/9999999/dataExtension/build-expected.json +3 -3
- package/test/resources/9999999/dataExtension/create-expected.json +2 -2
- package/test/resources/9999999/dataExtension/create-response.xml +8 -3
- package/test/resources/9999999/dataExtension/retrieve-expected.json +3 -3
- package/test/resources/9999999/dataExtension/retrieve-response.xml +9 -4
- package/test/resources/9999999/dataExtension/template-expected.json +3 -3
- package/test/resources/9999999/dataExtension/update-expected.json +3 -3
- package/test/resources/9999999/dataExtension/update-response.xml +9 -4
- package/test/resources/9999999/dataExtensionField/retrieve-response.xml +14 -9
- package/test/resources/9999999/interaction/v1/interactions/get-response.json +312 -0
- package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +312 -0
- package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/put-response.json +592 -0
- package/test/resources/9999999/journey/build-expected.json +572 -0
- package/test/resources/9999999/journey/get-expected.json +576 -0
- package/test/resources/9999999/journey/put-expected.json +576 -0
- package/test/resources/9999999/journey/template-expected.json +572 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json +42 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/keyword/cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow/delete-response.json +0 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json +1 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/keyword/post-response.json +3 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/delete-response.json +0 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json +106 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/post-response.json +0 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/message/NTQ3Ojc4OjA/get-response.json +127 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json +129 -0
- package/test/resources/9999999/legacy/v1/beta/mobile/message/post-response.json +3 -0
- package/test/resources/9999999/legacy/v1/beta2/data/campaign/get-response.json +29 -0
- package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
- package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json +1 -1
- package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json +1 -1
- package/test/resources/9999999/mobileKeyword/build-expected.amp +2 -0
- package/test/resources/9999999/mobileKeyword/build-expected.json +9 -0
- package/test/resources/9999999/mobileKeyword/get-expected.amp +2 -0
- package/test/resources/9999999/mobileKeyword/get-expected.json +15 -0
- package/test/resources/9999999/mobileKeyword/post-create-expected.amp +2 -0
- package/test/resources/9999999/mobileKeyword/post-create-expected.json +17 -0
- package/test/resources/9999999/mobileKeyword/template-expected.amp +2 -0
- package/test/resources/9999999/mobileKeyword/template-expected.json +9 -0
- package/test/resources/9999999/mobileMessage/build-expected.amp +1 -0
- package/test/resources/9999999/mobileMessage/build-expected.json +60 -0
- package/test/resources/9999999/mobileMessage/get-expected.amp +1 -0
- package/test/resources/9999999/mobileMessage/get-expected.json +61 -0
- package/test/resources/9999999/mobileMessage/post-create-expected.amp +1 -0
- package/test/resources/9999999/mobileMessage/post-create-expected.json +63 -0
- package/test/resources/9999999/mobileMessage/post-update-expected.amp +1 -0
- package/test/resources/9999999/mobileMessage/post-update-expected.json +61 -0
- package/test/resources/9999999/mobileMessage/template-expected.amp +1 -0
- package/test/resources/9999999/mobileMessage/template-expected.json +60 -0
- package/test/resources/9999999/query/build-expected.json +1 -1
- package/test/resources/9999999/query/get-expected.json +1 -1
- package/test/resources/9999999/query/get2-expected.json +11 -0
- package/test/resources/9999999/query/patch-expected.json +1 -1
- package/test/resources/9999999/query/post-expected.json +1 -1
- package/test/resources/9999999/query/template-expected.json +1 -1
- package/test/resources/9999999/queryDefinition/retrieve-response.xml +30 -0
- package/test/resources/9999999/transactionalEmail/build-expected.json +5 -5
- package/test/resources/9999999/transactionalEmail/get-expected.json +1 -1
- package/test/resources/9999999/transactionalEmail/patch-expected.json +1 -1
- package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
- package/test/resources/9999999/transactionalEmail/template-expected.json +5 -5
- package/test/resources/9999999/transactionalPush/build-expected.json +2 -2
- package/test/resources/9999999/transactionalPush/template-expected.json +2 -2
- package/test/resources/9999999/transactionalSMS/build-expected.json +3 -3
- package/test/resources/9999999/transactionalSMS/template-expected.json +3 -3
- package/test/{dataExtension.test.js → type.dataExtension.test.js} +78 -21
- package/test/{interaction.test.js → type.journey.test.js} +64 -30
- package/test/type.mobileKeyword.test.js +250 -0
- package/test/type.mobileMessage.test.js +205 -0
- package/test/{query.test.js → type.query.test.js} +102 -5
- package/test/{transactionalEmail.test.js → type.transactionalEmail.test.js} +40 -2
- package/test/{transactionalPush.test.js → type.transactionalPush.test.js} +41 -2
- package/test/{transactionalSMS.test.js → type.transactionalSMS.test.js} +73 -3
- package/test/type.user.test.js +160 -0
- package/test/utils.js +17 -5
- package/types/mcdev.d.js +48 -15
- package/.github/workflows/code-analysis.yml +0 -57
- package/lib/metadataTypes/AccountUser.js +0 -426
- package/lib/metadataTypes/definitions/AccountUser.definition.js +0 -227
- package/test/mockRoot/deploy/testInstance/testBU/interaction/testExisting_interaction.interaction-meta.json +0 -266
- package/test/resources/9999999/interaction/build-expected.json +0 -260
- package/test/resources/9999999/interaction/get-expected.json +0 -264
- package/test/resources/9999999/interaction/put-expected.json +0 -264
- package/test/resources/9999999/interaction/template-expected.json +0 -260
- package/test/resources/9999999/interaction/v1/interactions/put-response.json +0 -280
- /package/test/mockRoot/deploy/testInstance/testBU/{interaction → journey}/testNew_interaction.interaction-meta.json +0 -0
- /package/test/resources/9999999/{interaction → journey}/post-expected.json +0 -0
|
@@ -4,6 +4,7 @@ const TYPE = require('../../types/mcdev.d');
|
|
|
4
4
|
const MetadataType = require('./MetadataType');
|
|
5
5
|
const Util = require('../util/util');
|
|
6
6
|
const File = require('../util/file');
|
|
7
|
+
const cache = require('../util/cache');
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* ImportFile MetadataType
|
|
@@ -28,15 +29,8 @@ class Role extends MetadataType {
|
|
|
28
29
|
return;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
const fields =
|
|
32
|
-
|
|
33
|
-
accumulator.push(currentValue);
|
|
34
|
-
}
|
|
35
|
-
return accumulator;
|
|
36
|
-
}, []);
|
|
37
|
-
// manually add ObjectID for retrieves as it is no longer automatically returned, and is needed for updates
|
|
38
|
-
fields.push('ObjectID');
|
|
39
|
-
/** @type {TYPE.SoapRequestParams} */
|
|
32
|
+
const fields = super.getFieldNamesToRetrieve(null, !retrieveDir);
|
|
33
|
+
|
|
40
34
|
let requestParams = {
|
|
41
35
|
// filter individual roles
|
|
42
36
|
filter: {
|
|
@@ -45,24 +39,63 @@ class Role extends MetadataType {
|
|
|
45
39
|
rightOperand: false,
|
|
46
40
|
},
|
|
47
41
|
};
|
|
42
|
+
/** @type {TYPE.SoapRequestParams} */
|
|
48
43
|
if (key) {
|
|
49
44
|
// move original filter down one level into rightOperand and add key filter into leftOperand
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
operator: 'equals',
|
|
55
|
-
rightOperand: key,
|
|
56
|
-
},
|
|
57
|
-
operator: 'AND',
|
|
58
|
-
rightOperand: requestParams.filter,
|
|
59
|
-
},
|
|
45
|
+
const keyFilter = {
|
|
46
|
+
leftOperand: 'CustomerKey',
|
|
47
|
+
operator: 'equals',
|
|
48
|
+
rightOperand: key,
|
|
60
49
|
};
|
|
50
|
+
requestParams = requestParams
|
|
51
|
+
? {
|
|
52
|
+
filter: {
|
|
53
|
+
leftOperand: keyFilter,
|
|
54
|
+
operator: 'AND',
|
|
55
|
+
rightOperand: requestParams.filter,
|
|
56
|
+
},
|
|
57
|
+
}
|
|
58
|
+
: keyFilter;
|
|
61
59
|
}
|
|
62
60
|
|
|
63
61
|
const results = await this.client.soap.retrieve('Role', fields, requestParams);
|
|
64
62
|
|
|
65
63
|
const parsed = this.parseResponseBody(results);
|
|
64
|
+
if (!retrieveDir) {
|
|
65
|
+
// retrieve "Marketing Cloud%" roles not returned by SOAP API
|
|
66
|
+
const { roles, timeZones } = await this.client.rest.get(
|
|
67
|
+
'/platform/v1/setup/quickflow/data'
|
|
68
|
+
);
|
|
69
|
+
// this endpoint does not provide keys
|
|
70
|
+
const roleNameKeyMap = {
|
|
71
|
+
'Marketing Cloud Administrator': 'SYS_DEF_IMHADMIN',
|
|
72
|
+
'Marketing Cloud Channel Manager': 'SYS_DEF_CHANNELMANAGER',
|
|
73
|
+
'Marketing Cloud Content Editor/Publisher': 'SYS_DEF_CONTENTEDIT',
|
|
74
|
+
'Marketing Cloud Security Administrator': 'SYS_DEF_SECURITYADMIN',
|
|
75
|
+
'Marketing Cloud Viewer': 'SYS_DEF_VIEWER',
|
|
76
|
+
};
|
|
77
|
+
for (const role of roles) {
|
|
78
|
+
if (roleNameKeyMap[role.roleName]) {
|
|
79
|
+
parsed[roleNameKeyMap[role.roleName]] = {
|
|
80
|
+
CustomerKey: roleNameKeyMap[role.roleName],
|
|
81
|
+
Name: role.roleName,
|
|
82
|
+
ObjectID: role.roleID,
|
|
83
|
+
Desscription: role.description,
|
|
84
|
+
CreatedDate: '2012-02-21T02:09:19.983',
|
|
85
|
+
IsSystemDefined: true,
|
|
86
|
+
c__notAssignable: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// the languages object is incomplete. the actual list is much longer --> ignoring it here
|
|
91
|
+
// convert timeZones to object
|
|
92
|
+
const timeZonesObj = {};
|
|
93
|
+
for (const timeZone of timeZones) {
|
|
94
|
+
timeZonesObj[timeZone.id] = timeZone;
|
|
95
|
+
}
|
|
96
|
+
// cache timeZones to share it with other type-classes
|
|
97
|
+
cache.setMetadata('_timezone', timeZonesObj);
|
|
98
|
+
}
|
|
66
99
|
if (retrieveDir) {
|
|
67
100
|
const savedMetadata = await super.saveResults(parsed, retrieveDir, null);
|
|
68
101
|
Util.logger.info(
|
|
@@ -238,8 +271,14 @@ class Role extends MetadataType {
|
|
|
238
271
|
// Reached end: write permission into this.allPermissions
|
|
239
272
|
if (element.Operation) {
|
|
240
273
|
const permSplit = _permission.split(' > ');
|
|
241
|
-
const
|
|
242
|
-
|
|
274
|
+
const permOperation = permSplit.pop();
|
|
275
|
+
let basePermission = permSplit.shift();
|
|
276
|
+
if (basePermission === 'Interactive Marketing Hub') {
|
|
277
|
+
basePermission = 'Salesforce Marketing Cloud';
|
|
278
|
+
}
|
|
279
|
+
const permissionName = `<nobr><b>${permSplit.join(
|
|
280
|
+
' > '
|
|
281
|
+
)}</b> > ${permOperation}</nobr>`;
|
|
243
282
|
if (!this.allPermissions[basePermission]) {
|
|
244
283
|
this.allPermissions[basePermission] = {};
|
|
245
284
|
}
|
|
@@ -23,7 +23,7 @@ class Script extends MetadataType {
|
|
|
23
23
|
*/
|
|
24
24
|
static async retrieve(retrieveDir, _, __, key) {
|
|
25
25
|
await File.initPrettier('ssjs');
|
|
26
|
-
return super.retrieveREST(retrieveDir, '/automation/v1/scripts/', null,
|
|
26
|
+
return super.retrieveREST(retrieveDir, '/automation/v1/scripts/', null, key);
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Retrieves script metadata for caching
|
|
@@ -47,7 +47,6 @@ class Script extends MetadataType {
|
|
|
47
47
|
return super.retrieveREST(
|
|
48
48
|
templateDir,
|
|
49
49
|
'/automation/v1/scripts/?$filter=name%20eq%20' + encodeURIComponent(name),
|
|
50
|
-
null,
|
|
51
50
|
templateVariables
|
|
52
51
|
);
|
|
53
52
|
}
|
|
@@ -91,7 +90,7 @@ class Script extends MetadataType {
|
|
|
91
90
|
* @returns {Promise.<string>} content for metadata.script
|
|
92
91
|
*/
|
|
93
92
|
static async _mergeCode(metadata, deployDir, templateName) {
|
|
94
|
-
templateName
|
|
93
|
+
templateName ||= metadata[this.definition.keyField];
|
|
95
94
|
let code;
|
|
96
95
|
const codePath = File.normalizePath([
|
|
97
96
|
deployDir,
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const TYPE = require('../../types/mcdev.d');
|
|
4
|
+
const MetadataType = require('./MetadataType');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* SendClassification MetadataType
|
|
8
|
+
*
|
|
9
|
+
* @augments MetadataType
|
|
10
|
+
*/
|
|
11
|
+
class SendClassification extends MetadataType {
|
|
12
|
+
/**
|
|
13
|
+
* Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
|
|
14
|
+
*
|
|
15
|
+
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
16
|
+
* @param {void} [_] unused parameter
|
|
17
|
+
* @param {void} [__] unused parameter
|
|
18
|
+
* @param {string} [key] customer key of single item to retrieve
|
|
19
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
|
|
20
|
+
*/
|
|
21
|
+
static retrieve(retrieveDir, _, __, key) {
|
|
22
|
+
/** @type {TYPE.SoapRequestParams} */
|
|
23
|
+
let requestParams = null;
|
|
24
|
+
if (key) {
|
|
25
|
+
requestParams = {
|
|
26
|
+
filter: {
|
|
27
|
+
leftOperand: 'CustomerKey',
|
|
28
|
+
operator: 'equals',
|
|
29
|
+
rightOperand: key,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return super.retrieveSOAP(retrieveDir, requestParams, key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Assign definition to static attributes
|
|
38
|
+
SendClassification.definition = require('../MetadataTypeDefinitions').sendClassification;
|
|
39
|
+
|
|
40
|
+
module.exports = SendClassification;
|
|
@@ -19,13 +19,7 @@ class SetDefinition extends MetadataType {
|
|
|
19
19
|
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
|
|
20
20
|
*/
|
|
21
21
|
static retrieve(retrieveDir, _, __, key) {
|
|
22
|
-
return super.retrieveREST(
|
|
23
|
-
retrieveDir,
|
|
24
|
-
'/hub/v1/contacts/schema/setDefinitions',
|
|
25
|
-
null,
|
|
26
|
-
null,
|
|
27
|
-
key
|
|
28
|
-
);
|
|
22
|
+
return super.retrieveREST(retrieveDir, '/hub/v1/contacts/schema/setDefinitions', null, key);
|
|
29
23
|
}
|
|
30
24
|
/**
|
|
31
25
|
* Retrieves Metadata of schema set definitions for caching.
|
|
@@ -71,8 +71,7 @@ class TransactionalEmail extends TransactionalMessage {
|
|
|
71
71
|
// journey
|
|
72
72
|
if (metadata.journey?.interactionKey) {
|
|
73
73
|
// ! update & create enpoints dont accept journey.interactionKey. They only allow to create a new journey
|
|
74
|
-
|
|
75
|
-
metadata.options = metadata.options || {};
|
|
74
|
+
metadata.options ||= {};
|
|
76
75
|
metadata.options.createJourney = true; // only send this during create or else we might end up with an unexpected outcome
|
|
77
76
|
delete metadata.journey.interactionKey;
|
|
78
77
|
}
|
|
@@ -143,7 +142,7 @@ class TransactionalEmail extends TransactionalMessage {
|
|
|
143
142
|
if (metadata.journey?.interactionKey) {
|
|
144
143
|
try {
|
|
145
144
|
// we merely want to be able to show a warning if it does not exist
|
|
146
|
-
cache.searchForField('
|
|
145
|
+
cache.searchForField('journey', metadata.journey.interactionKey, 'key', 'key');
|
|
147
146
|
} catch (ex) {
|
|
148
147
|
Util.logger.warn(
|
|
149
148
|
` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
|
|
@@ -13,8 +13,7 @@ class TransactionalMessage extends MetadataType {
|
|
|
13
13
|
// define this.subType as string here for intellisense; requires to be redefined in child class
|
|
14
14
|
static subType;
|
|
15
15
|
/**
|
|
16
|
-
* Retrieves Metadata
|
|
17
|
-
* Endpoint /legacy/v1/beta/mobile/code/ return all Mobile Codes with all details.
|
|
16
|
+
* Retrieves Metadata
|
|
18
17
|
*
|
|
19
18
|
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
|
|
20
19
|
* @param {void} [_] unused parameter
|
|
@@ -21,29 +21,22 @@ class TransactionalSMS extends TransactionalMessage {
|
|
|
21
21
|
* @returns {void}
|
|
22
22
|
*/
|
|
23
23
|
static async postDeleteTasks(customerKey) {
|
|
24
|
-
// delete local copy: retrieve/cred/bu/type
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
this.buObject.credential,
|
|
28
|
-
this.buObject.businessUnit,
|
|
29
|
-
this.definition.type,
|
|
30
|
-
`${customerKey}.${this.definition.type}-meta.`,
|
|
31
|
-
]);
|
|
32
|
-
await File.remove(fileName + 'json');
|
|
33
|
-
await File.remove(fileName + 'amp');
|
|
24
|
+
// delete local copy: retrieve/cred/bu/type/...-meta.json
|
|
25
|
+
// delete local copy: retrieve/cred/bu/type/...-meta.amp
|
|
26
|
+
super.postDeleteTasks(customerKey, [`${this.definition.type}-meta.amp`]);
|
|
34
27
|
}
|
|
35
28
|
|
|
36
29
|
/**
|
|
37
30
|
* prepares for deployment
|
|
38
31
|
*
|
|
39
32
|
* @param {TYPE.MetadataTypeItem} metadata a single item
|
|
40
|
-
* @param {string}
|
|
41
|
-
* @returns {TYPE.MetadataTypeItem} Promise
|
|
33
|
+
* @param {string} deployDir directory of deploy files
|
|
34
|
+
* @returns {Promise.<TYPE.MetadataTypeItem>} Promise
|
|
42
35
|
*/
|
|
43
|
-
static async preDeployTasks(metadata,
|
|
36
|
+
static async preDeployTasks(metadata, deployDir) {
|
|
44
37
|
// code
|
|
45
38
|
metadata.content = {
|
|
46
|
-
message: await this._mergeCode(metadata,
|
|
39
|
+
message: await this._mergeCode(metadata, deployDir),
|
|
47
40
|
};
|
|
48
41
|
|
|
49
42
|
if (this._isHTML(metadata.content?.message)) {
|
|
@@ -81,7 +74,7 @@ class TransactionalSMS extends TransactionalMessage {
|
|
|
81
74
|
* @returns {Promise.<string>} content for metadata.script
|
|
82
75
|
*/
|
|
83
76
|
static async _mergeCode(metadata, deployDir, templateName) {
|
|
84
|
-
templateName
|
|
77
|
+
templateName ||= metadata[this.definition.keyField];
|
|
85
78
|
const codePath = File.normalizePath([
|
|
86
79
|
deployDir,
|
|
87
80
|
this.definition.type,
|
|
@@ -16,7 +16,7 @@ const cacheTypes = {
|
|
|
16
16
|
*
|
|
17
17
|
* @augments MetadataType
|
|
18
18
|
*/
|
|
19
|
-
class
|
|
19
|
+
class TriggeredSend extends MetadataType {
|
|
20
20
|
/**
|
|
21
21
|
* Retrieves SOAP based metadata of metadata type into local filesystem. executes callback with retrieved metadata
|
|
22
22
|
*
|
|
@@ -50,7 +50,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
return super.retrieveSOAP(retrieveDir, requestParams);
|
|
53
|
+
return super.retrieveSOAP(retrieveDir, requestParams, key);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/**
|
|
@@ -67,13 +67,12 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
67
67
|
* Updates a single TSD.
|
|
68
68
|
*
|
|
69
69
|
* @param {TYPE.MetadataTypeItem} metadata single metadata entry
|
|
70
|
-
* @param {boolean} [handleOutside] if the API reponse is irregular this allows you to handle it outside of this generic method
|
|
71
70
|
* @returns {Promise} Promise
|
|
72
71
|
*/
|
|
73
|
-
static update(metadata
|
|
72
|
+
static update(metadata) {
|
|
74
73
|
// * in case of update and active definition, we need to pause first.
|
|
75
74
|
// * this should be done manually to not accidentally pause production queues without restarting them
|
|
76
|
-
return super.updateSOAP(metadata
|
|
75
|
+
return super.updateSOAP(metadata);
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
/**
|
|
@@ -83,7 +82,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
83
82
|
* @returns {Promise.<boolean>} deletion success status
|
|
84
83
|
*/
|
|
85
84
|
static deleteByKey(customerKey) {
|
|
86
|
-
return super.deleteByKeySOAP(customerKey
|
|
85
|
+
return super.deleteByKeySOAP(customerKey);
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
/**
|
|
@@ -153,7 +152,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
153
152
|
'legacyData.legacyId',
|
|
154
153
|
'name'
|
|
155
154
|
);
|
|
156
|
-
metadata.
|
|
155
|
+
metadata.r__assetMessage_Name_readOnly = contentBuilderEmailName;
|
|
157
156
|
const contentBuilderEmailKey = cache.searchForField(
|
|
158
157
|
'asset',
|
|
159
158
|
metadata.Email.ID,
|
|
@@ -213,7 +212,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
213
212
|
delete metadata.r__email_Name;
|
|
214
213
|
} else if (metadata.r__assetMessage_Key) {
|
|
215
214
|
// content builder
|
|
216
|
-
// * this ignores
|
|
215
|
+
// * this ignores r__assetMessage_Name_readOnly on purpose as that is only unique per parent folder but useful during PR reviews
|
|
217
216
|
metadata.Email = {
|
|
218
217
|
ID: cache.searchForField(
|
|
219
218
|
'asset',
|
|
@@ -223,7 +222,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
223
222
|
),
|
|
224
223
|
};
|
|
225
224
|
delete metadata.r__assetMessage_Key;
|
|
226
|
-
delete metadata.
|
|
225
|
+
delete metadata.r__assetMessage_Name_readOnly;
|
|
227
226
|
} else if (metadata?.Email?.ID) {
|
|
228
227
|
throw new Error(
|
|
229
228
|
`r__assetMessage_Key / r__email_Name not defined but instead found Email.ID. Please try re-retrieving this TSD from your BU.`
|
|
@@ -247,13 +246,13 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
247
246
|
* TSD-specific refresh method that finds active TSDs and refreshes them
|
|
248
247
|
*
|
|
249
248
|
* @param {string[]} [keyArr] metadata keys
|
|
249
|
+
* @param {boolean} [checkKey=true] whether to check if the key is valid
|
|
250
250
|
* @returns {Promise.<void>} -
|
|
251
251
|
*/
|
|
252
|
-
static async refresh(keyArr) {
|
|
252
|
+
static async refresh(keyArr, checkKey = true) {
|
|
253
253
|
console.time('Time'); // eslint-disable-line no-console
|
|
254
|
-
let checkKey = true;
|
|
255
254
|
if (!keyArr) {
|
|
256
|
-
keyArr = await this.
|
|
255
|
+
keyArr = await this.getKeysForValidTSDs((await this.findRefreshableItems()).metadata);
|
|
257
256
|
checkKey = false;
|
|
258
257
|
}
|
|
259
258
|
// then executes pause, publish, start on them.
|
|
@@ -269,16 +268,31 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
269
268
|
}
|
|
270
269
|
|
|
271
270
|
/**
|
|
272
|
-
* helper for {@link refresh} that
|
|
271
|
+
* helper for {@link refresh} that extracts the keys from the TSD item map and eli
|
|
273
272
|
*
|
|
273
|
+
* @param {TYPE.MetadataTypeMapObj} metadata TSD item map
|
|
274
274
|
* @returns {Promise.<string[]>} keyArr
|
|
275
275
|
*/
|
|
276
|
-
static async
|
|
276
|
+
static async getKeysForValidTSDs(metadata) {
|
|
277
|
+
const keyArr = Object.keys(metadata).filter((key) => {
|
|
278
|
+
const test = this.postRetrieveTasks(metadata[key]);
|
|
279
|
+
return test?.CustomerKey || false;
|
|
280
|
+
});
|
|
281
|
+
Util.logger.info(`Found ${keyArr.length} refreshable items.`);
|
|
282
|
+
return keyArr;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* helper for {@link refresh} that finds active TSDs on the server and filters it by the same rules that {@link retrieve} is using to avoid refreshing TSDs with broken dependencies
|
|
286
|
+
*
|
|
287
|
+
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of TSD item map
|
|
288
|
+
*/
|
|
289
|
+
static async findRefreshableItems() {
|
|
277
290
|
Util.logger.info('Finding refreshable items...');
|
|
278
291
|
// cache dependencies to test for broken links
|
|
279
292
|
// skip deprecated classic emails here, assuming they cannot be updated and hence are not relevant for {@link refresh}
|
|
280
293
|
const requiredCache = {
|
|
281
294
|
folder: [
|
|
295
|
+
'hidden',
|
|
282
296
|
'list',
|
|
283
297
|
'mysubs',
|
|
284
298
|
'suppression_list',
|
|
@@ -311,13 +325,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
311
325
|
rightOperand: ['dummy', 'Active'], // using equals does not work for this field for an unknown reason and IN requires at least 2 values, hence the 'dummy' entry
|
|
312
326
|
},
|
|
313
327
|
};
|
|
314
|
-
|
|
315
|
-
const keyArr = Object.keys(metadata).filter((key) => {
|
|
316
|
-
const test = this.postRetrieveTasks(metadata[key]);
|
|
317
|
-
return test?.CustomerKey || false;
|
|
318
|
-
});
|
|
319
|
-
Util.logger.info(`Found ${keyArr.length} refreshable items.`);
|
|
320
|
-
return keyArr;
|
|
328
|
+
return super.retrieveSOAP(null, requestParams);
|
|
321
329
|
}
|
|
322
330
|
|
|
323
331
|
/**
|
|
@@ -343,7 +351,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
343
351
|
};
|
|
344
352
|
try {
|
|
345
353
|
test = (
|
|
346
|
-
await super.retrieveSOAP(null, requestParams, [
|
|
354
|
+
await super.retrieveSOAP(null, requestParams, key, [
|
|
347
355
|
'CustomerKey',
|
|
348
356
|
'TriggeredSendStatus',
|
|
349
357
|
])
|
|
@@ -370,7 +378,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
370
378
|
// pause
|
|
371
379
|
try {
|
|
372
380
|
item.TriggeredSendStatus = 'Inactive';
|
|
373
|
-
test = await
|
|
381
|
+
test = await super.updateSOAP(item, true);
|
|
374
382
|
if (test.OverallStatus !== 'OK') {
|
|
375
383
|
throw new Error(test.Results[0].StatusMessage);
|
|
376
384
|
}
|
|
@@ -388,7 +396,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
388
396
|
// publish
|
|
389
397
|
try {
|
|
390
398
|
item.RefreshContent = 'true';
|
|
391
|
-
test = await
|
|
399
|
+
test = await super.updateSOAP(item, true);
|
|
392
400
|
if (test.OverallStatus !== 'OK') {
|
|
393
401
|
throw new Error(test.Results[0].StatusMessage);
|
|
394
402
|
}
|
|
@@ -405,7 +413,7 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
405
413
|
// start
|
|
406
414
|
try {
|
|
407
415
|
item.TriggeredSendStatus = 'Active';
|
|
408
|
-
test = await
|
|
416
|
+
test = await super.updateSOAP(item, true);
|
|
409
417
|
if (test.OverallStatus !== 'OK') {
|
|
410
418
|
throw new Error(test.Results[0].StatusMessage);
|
|
411
419
|
}
|
|
@@ -423,6 +431,6 @@ class TriggeredSendDefinition extends MetadataType {
|
|
|
423
431
|
}
|
|
424
432
|
|
|
425
433
|
// Assign definition to static attributes
|
|
426
|
-
|
|
434
|
+
TriggeredSend.definition = require('../MetadataTypeDefinitions').triggeredSend;
|
|
427
435
|
|
|
428
|
-
module.exports =
|
|
436
|
+
module.exports = TriggeredSend;
|