Skip to content

Commit e792082

Browse files
Merge pull request #1094 from Accenture/develop
Release 5.3
2 parents 2f06f26 + e4e4f47 commit e792082

File tree

105 files changed

+5649
-1492
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+5649
-1492
lines changed

.github/ISSUE_TEMPLATE/bug.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ body:
3939
label: Version
4040
description: What version of our software are you running? (mcdev --version)
4141
options:
42+
- 5.3.0
4243
- 5.2.0
4344
- 5.1.0
4445
- 5.0.2

docs/dist/documentation.md

Lines changed: 400 additions & 9 deletions
Large diffs are not rendered by default.

lib/MetadataTypeDefinitions.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const MetadataTypeDefinitions = {
3838
transactionalSMS: require('./metadataTypes/definitions/TransactionalSMS.definition'),
3939
triggeredSend: require('./metadataTypes/definitions/TriggeredSend.definition'),
4040
user: require('./metadataTypes/definitions/User.definition'),
41+
verification: require('./metadataTypes/definitions/Verification.definition'),
4142
};
4243

4344
module.exports = MetadataTypeDefinitions;

lib/MetadataTypeInfo.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const MetadataTypeInfo = {
3838
transactionalSMS: require('./metadataTypes/TransactionalSMS'),
3939
triggeredSend: require('./metadataTypes/TriggeredSend'),
4040
user: require('./metadataTypes/User'),
41+
verification: require('./metadataTypes/Verification'),
4142
};
4243

4344
module.exports = MetadataTypeInfo;

lib/cli.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ yargs
4545
},
4646
})
4747
.command({
48-
command: 'deploy [BU] [TYPE] [KEY] [--fromRetrieve] [--refresh]',
48+
command: 'deploy [BU] [TYPE] [KEY]',
4949
aliases: ['d'],
5050
desc: 'deploys local metadata to a business unit',
5151
builder: (yargs) => {
@@ -97,6 +97,11 @@ yargs
9797
group: 'Options for deploy:',
9898
describe:
9999
'optionally start existing schedule instead of running item once immediately (only works for automations)',
100+
})
101+
.option('fixShared', {
102+
group: 'Options for deploy:',
103+
describe:
104+
"optionally ensure that updates to shared DataExtensions become visible in child BU's data designer (SF Known issue W-11031095)",
100105
});
101106
},
102107
handler: (argv) => {

lib/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,14 @@ class Mcdev {
5656
'commitHistory',
5757
'execute',
5858
'filter',
59+
'fixShared',
5960
'fromRetrieve',
6061
'json',
6162
'like',
6263
'noLogColors',
6364
'noLogFile',
6465
'refresh',
66+
'_runningTest',
6567
'schedule',
6668
'skipInteraction',
6769
];
@@ -310,7 +312,8 @@ class Mcdev {
310312
triggeredSend: 'triggeredSendDefinition',
311313
user: 'accountUser',
312314
};
313-
Util.logger.info(`:: Retrieving ${cred}/${bu}\n`);
315+
Util.logger.info('');
316+
Util.logger.info(`:: Retrieving ${cred}/${bu}`);
314317
const retrieveTypesArr = [];
315318
if (selectedTypesArr) {
316319
for (const selectedType of Array.isArray(selectedTypesArr)

lib/metadataTypes/AttributeSet.js

Lines changed: 118 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,7 @@ class AttributeSet extends MetadataType {
3131
const result = await AttributeGroup.retrieveForCache();
3232
cache.setMetadata('attributeGroup', result.metadata);
3333
}
34-
return super.retrieveREST(
35-
retrieveDir,
36-
'/hub/v1/contacts/schema/setDefinitions',
37-
null,
38-
null,
39-
key
40-
);
34+
return super.retrieveREST(retrieveDir, '/hub/v1/contacts/schema/setDefinitions', null, key);
4135
}
4236
/**
4337
* Retrieves Metadata of schema set definitions for caching.
@@ -47,6 +41,110 @@ class AttributeSet extends MetadataType {
4741
static retrieveForCache() {
4842
return super.retrieveREST(null, '/hub/v1/contacts/schema/setDefinitions');
4943
}
44+
/**
45+
* used to identify updated shared data extensions that are used in attributeSets.
46+
* helper for DataExtension.#fixShared_onBU
47+
*
48+
* @param {Object.<string, string>} sharedDataExtensionMap ID-Key relationship of shared data extensions
49+
* @param {object} fixShared_fields DataExtensionField.fixShared_fields
50+
* @returns {Promise.<string[]>} Promise of list of shared dataExtension IDs
51+
*/
52+
static async fixShared_retrieve(sharedDataExtensionMap, fixShared_fields) {
53+
if (!Object.keys(sharedDataExtensionMap).length) {
54+
return [];
55+
}
56+
const result = await super.retrieveREST(null, '/hub/v1/contacts/schema/setDefinitions');
57+
const metadataMap = result?.metadata;
58+
if (metadataMap && Object.keys(metadataMap).length) {
59+
const sharedDeIds = Object.keys(metadataMap)
60+
.filter(
61+
(asKey) =>
62+
metadataMap[asKey].storageLogicalType === 'ExactTargetSchema' ||
63+
metadataMap[asKey].storageLogicalType === 'DataExtension'
64+
)
65+
.filter((asKey) => {
66+
// check if dataExtension ID is found on any attributeSet of this BU
67+
if (sharedDataExtensionMap[metadataMap[asKey].storageReferenceID.value]) {
68+
Util.logger.debug(
69+
` shared dataExtension ID ${metadataMap[asKey].storageReferenceID.value} found in attributeSet ${asKey}`
70+
);
71+
return true;
72+
} else {
73+
return false;
74+
}
75+
})
76+
.filter((asKey) => {
77+
// check if any of the dataExtension fields dont exist on the attributeSet or are out of date
78+
const deKey =
79+
sharedDataExtensionMap[metadataMap[asKey].storageReferenceID.value];
80+
const asFields = metadataMap[asKey].valueDefinitions;
81+
const deFields = Object.values(fixShared_fields[deKey]);
82+
return deFields.some((deField) => {
83+
const search = asFields.filter((asf) => asf.name === deField.Name);
84+
if (!search.length) {
85+
Util.logger.debug(
86+
Util.getGrayMsg(
87+
` - Field ${deField.Name} not found in attributeSet; Note: only first recognized difference is printed to log`
88+
)
89+
);
90+
return true;
91+
}
92+
const asField = search[0];
93+
if (asField.dataType !== deField.FieldType) {
94+
Util.logger.debug(
95+
Util.getGrayMsg(
96+
` - Field ${deField.Name} FieldType changed (old: ${asField.dataType}; new: ${deField.FieldType}); Note: only first recognized difference is printed to log`
97+
)
98+
);
99+
return true;
100+
}
101+
asField.defaultValue ||= '';
102+
if (
103+
(asField.defaultValue && deField.DefaultValue === '') ||
104+
(deField.FieldType === 'Boolean' &&
105+
deField.DefaultValue !== '' &&
106+
(deField.DefaultValue
107+
? 'True'
108+
: 'False' !== asField.defaultValue)) ||
109+
(deField.FieldType !== 'Boolean' &&
110+
deField.DefaultValue !== asField.defaultValue)
111+
) {
112+
Util.logger.debug(
113+
` - Field ${deField.Name} DefaultValue changed (old: ${asField.defaultValue}; new: ${deField.DefaultValue}); Note: only first recognized difference is printed to log`
114+
);
115+
return true;
116+
}
117+
// some field types don't carry the length property. reset to 0 to ease comparison
118+
asField.length ||= 0;
119+
if (asField.length !== deField.MaxLength) {
120+
Util.logger.debug(
121+
` - Field ${deField.Name} MaxLength changed (old: ${asField.length}; new: ${deField.MaxLength}); Note: only first recognized difference is printed to log`
122+
);
123+
return true;
124+
}
125+
if (asField.isNullable !== deField.IsRequired) {
126+
Util.logger.debug(
127+
` - Field ${deField.Name} IsRequired changed (old: ${asField.isNullable}; new: ${deField.IsRequired}); Note: only first recognized difference is printed to log`
128+
);
129+
return true;
130+
}
131+
if (asField.isPrimaryKey !== deField.IsPrimaryKey) {
132+
Util.logger.debug(
133+
` - Field ${deField.Name} IsPrimaryKey changed (old: ${asField.isPrimaryKey}; new: ${deField.IsPrimaryKey}); Note: only first recognized difference is printed to log`
134+
);
135+
return true;
136+
}
137+
return false;
138+
});
139+
})
140+
.map((key) => metadataMap[key].storageReferenceID.value)
141+
.filter(Boolean);
142+
return sharedDeIds;
143+
} else {
144+
// nothing to do - return empty array
145+
return [];
146+
}
147+
}
50148

51149
/**
52150
* Builds map of metadata entries mapped to their keyfields
@@ -83,7 +181,7 @@ class AttributeSet extends MetadataType {
83181
switch (metadata.storageLogicalType) {
84182
case 'ExactTargetSchema': // synced / shared DEs
85183
case 'DataExtension': {
86-
// local DEs
184+
// shared / local DEs
87185
try {
88186
metadata.r__dataExtension_CustomerKey = cache.searchForField(
89187
'dataExtension',
@@ -226,6 +324,12 @@ class AttributeSet extends MetadataType {
226324
// Member ID
227325
delete metadata.customObjectOwnerMID;
228326

327+
// remove duplicate ID fields (main field is definitionID)
328+
delete metadata.setDefinitionID;
329+
if (metadata.dataRetentionProperties?.setDefinitionID) {
330+
delete metadata.dataRetentionProperties?.setDefinitionID;
331+
}
332+
229333
// connectingID.identifierType seems to be always set to 'FullyQualifiedName' - to be sure we check it here and remove it if it's the case
230334
if (metadata.connectingID?.identifierType === 'FullyQualifiedName') {
231335
// remove useless field
@@ -241,16 +345,19 @@ class AttributeSet extends MetadataType {
241345
* @returns {object[]} all system value definitions
242346
*/
243347
static _getSystemValueDefinitions() {
244-
if (!this.systemValueDefinitions) {
245-
this.systemValueDefinitions = Object.values(cache.getCache()['attributeSet'])
348+
this.systemValueDefinitions ||= {};
349+
if (!this.systemValueDefinitions[this.buObject.mid]) {
350+
this.systemValueDefinitions[this.buObject.mid] = Object.values(
351+
cache.getCache()['attributeSet']
352+
)
246353
.flatMap((item) => {
247354
if (item.isSystemDefined) {
248355
return item.valueDefinitions;
249356
}
250357
})
251358
.filter(Boolean);
252359
}
253-
return this.systemValueDefinitions;
360+
return this.systemValueDefinitions[this.buObject.mid];
254361
}
255362
}
256363

0 commit comments

Comments
 (0)