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
@@ -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
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
17
- * @returns {Promise<Object>} Promise of metadata
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(retrieveDir, '/interaction/v1/EventDefinitions/', null);
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
- * @returns {Promise<Object>} Promise of metadata
41
+ *
42
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
26
43
  */
27
44
  static retrieveForCache() {
28
- return super.retrieveREST(null, '/interaction/v1/EventDefinitions/', null);
45
+ return super.retrieveREST(null, '/interaction/v1/EventDefinitions/');
29
46
  }
30
47
 
31
48
  /**
32
49
  * Retrieve a specific Event Definition by Name
33
- * @param {String} templateDir Directory where retrieved metadata directory will be saved
34
- * @param {String} name name of the metadata file
35
- * @param {Object} variables variables to be replaced in the metadata
36
- * @returns {Promise<Object>} Promise of metadata
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
- static async retrieveAsTemplate(templateDir, name, variables) {
39
- // todo template based on name
40
- const options = {
41
- uri: '/interaction/v1/EventDefinitions?name=' + encodeURIComponent(name),
42
- };
43
- const res = await this.client.RestClient.get(options);
44
- const event = res.body.items.filter((item) => item.name === name);
56
+ static async retrieveAsTemplate(templateDir, name, templateVariables) {
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,9 +66,13 @@ 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 && event.length === 1) {
69
+ } else if (event?.length === 1) {
70
+ const originalKey = event[0][this.definition.keyField];
54
71
  const eventDef = JSON.parse(
55
- Util.replaceByObject(JSON.stringify(this.parseMetadata(event[0])), variables)
72
+ Util.replaceByObject(
73
+ JSON.stringify(this.parseMetadata(event[0])),
74
+ templateVariables
75
+ )
56
76
  );
57
77
  if (!eventDef.dataExtensionId) {
58
78
  throw new Error(
@@ -65,14 +85,12 @@ class EventDefinition extends MetadataType {
65
85
 
66
86
  // remove all fields listed in Definition for templating
67
87
  this.keepTemplateFields(eventDef);
68
- File.writeJSONToFile(
88
+ await File.writeJSONToFile(
69
89
  [templateDir, this.definition.type].join('/'),
70
- eventDef.customerKey + '.' + this.definition.type + '-meta',
71
- JSON.parse(Util.replaceByObject(JSON.stringify(eventDef), variables))
72
- );
73
- Util.logger.info(
74
- `EventDefinition.retrieveAsTemplate:: Written Metadata to filesystem (${name})`
90
+ originalKey + '.' + this.definition.type + '-meta',
91
+ JSON.parse(Util.replaceByObject(JSON.stringify(eventDef), templateVariables))
75
92
  );
93
+ Util.logger.info(`- templated ${this.definition.type}: ${name}`);
76
94
  return { metadata: eventDef, type: this.definition.type };
77
95
  } else {
78
96
  throw new Error(
@@ -89,8 +107,9 @@ class EventDefinition extends MetadataType {
89
107
 
90
108
  /**
91
109
  * manages post retrieve steps
92
- * @param {Object} eventDef a single importDef
93
- * @returns {Object[]} metadata
110
+ *
111
+ * @param {TYPE.MetadataTypeItem} eventDef a single item of Event Definition
112
+ * @returns {TYPE.MetadataTypeItem} metadata
94
113
  */
95
114
  static postRetrieveTasks(eventDef) {
96
115
  const val = this.parseMetadata(eventDef);
@@ -100,7 +119,8 @@ class EventDefinition extends MetadataType {
100
119
 
101
120
  /**
102
121
  * Creates a single Event Definition
103
- * @param {Object} EventDefinition a single Event Definition
122
+ *
123
+ * @param {TYPE.MetadataTypeItem} EventDefinition a single Event Definition
104
124
  * @returns {Promise} Promise
105
125
  */
106
126
  static create(EventDefinition) {
@@ -109,18 +129,22 @@ class EventDefinition extends MetadataType {
109
129
 
110
130
  /**
111
131
  * Updates a single Event Definition (using PUT method since PATCH isn't supported)
112
- * @param {Object} EventDefinition a single Event Definition
132
+ *
133
+ * @param {TYPE.MetadataTypeItem} metadataEntry a single Event Definition
113
134
  * @returns {Promise} Promise
114
135
  */
115
- static async update(EventDefinition) {
116
- this.removeNotUpdateableFields(EventDefinition);
136
+ static async update(metadataEntry) {
137
+ if (metadataEntry === null || metadataEntry === undefined) {
138
+ return null;
139
+ }
140
+ this.removeNotUpdateableFields(metadataEntry);
117
141
  const options = {
118
- uri: '/interaction/v1/EventDefinitions/' + EventDefinition.id,
119
- json: EventDefinition,
142
+ uri: '/interaction/v1/EventDefinitions/' + metadataEntry.id,
143
+ json: metadataEntry,
120
144
  headers: {},
121
145
  };
122
146
  try {
123
- const response = await this.client.RestClient.put(options);
147
+ const response = await this.client.rest.put(options);
124
148
  super.checkForErrors(response);
125
149
  return response;
126
150
  } catch (ex) {
@@ -129,7 +153,7 @@ class EventDefinition extends MetadataType {
129
153
  this.definition.type,
130
154
  'updateREST',
131
155
  ex,
132
- EventDefinition.name
156
+ metadataEntry.name
133
157
  );
134
158
  return null;
135
159
  }
@@ -137,12 +161,12 @@ class EventDefinition extends MetadataType {
137
161
 
138
162
  /**
139
163
  * prepares an event definition for deployment
140
- * @param {Object} metadata a single eventDefinition
141
- * @returns {Promise} Promise
164
+ *
165
+ * @param {TYPE.MetadataTypeItem} metadata a single eventDefinition
166
+ * @returns {TYPE.MetadataTypeItem} parsed version
142
167
  */
143
- static async preDeployTasks(metadata) {
144
- metadata.dataExtensionId = Util.getFromCache(
145
- this.cache,
168
+ static preDeployTasks(metadata) {
169
+ metadata.dataExtensionId = cache.searchForField(
146
170
  'dataExtension',
147
171
  metadata.dataExtensionName,
148
172
  'Name',
@@ -154,13 +178,13 @@ class EventDefinition extends MetadataType {
154
178
 
155
179
  /**
156
180
  * parses retrieved Metadata before saving
157
- * @param {Object} metadata a single event definition
158
- * @returns {Array} Array with one metadata object and one sql string
181
+ *
182
+ * @param {TYPE.MetadataTypeItem} metadata a single event definition
183
+ * @returns {TYPE.MetadataTypeItem} parsed metadata
159
184
  */
160
185
  static parseMetadata(metadata) {
161
186
  try {
162
- metadata.dataExtensionId = Util.getFromCache(
163
- this.cache,
187
+ metadata.dataExtensionId = cache.searchForField(
164
188
  'dataExtension',
165
189
  metadata.dataExtensionId,
166
190
  'ObjectID',
@@ -168,7 +192,7 @@ class EventDefinition extends MetadataType {
168
192
  );
169
193
  metadata.arguments.dataExtensionId = metadata.dataExtensionId;
170
194
  return JSON.parse(JSON.stringify(metadata));
171
- } catch (ex) {
195
+ } catch {
172
196
  Util.metadataLogger(
173
197
  'verbose',
174
198
  this.definition.type,
@@ -182,7 +206,5 @@ class EventDefinition extends MetadataType {
182
206
 
183
207
  // Assign definition to static attributes
184
208
  EventDefinition.definition = require('../MetadataTypeDefinitions').eventDefinition;
185
- EventDefinition.cache = {};
186
- EventDefinition.client = undefined;
187
209
 
188
210
  module.exports = EventDefinition;
@@ -1,86 +1,97 @@
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
  * FileTransfer MetadataType
11
+ *
9
12
  * @augments MetadataType
10
13
  */
11
14
  class FileTransfer extends MetadataType {
12
15
  /**
13
16
  * Retrieves Metadata of FileTransfer Activity.
14
17
  * Endpoint /automation/v1/filetransfers/ returns all File Transfers
15
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
16
- * @returns {Promise} Promise
18
+ *
19
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
20
+ * @param {void} [_] unused parameter
21
+ * @param {void} [__] unused parameter
22
+ * @param {void} [___] unused parameter
23
+ * @param {string} [key] customer key of single item to retrieve
24
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
17
25
  */
18
- static async retrieve(retrieveDir) {
19
- return super.retrieveREST(retrieveDir, '/automation/v1/filetransfers/', null);
26
+ static async retrieve(retrieveDir, _, __, ___, key) {
27
+ return super.retrieveREST(retrieveDir, '/automation/v1/filetransfers/', null, null, key);
20
28
  }
21
29
  /**
22
30
  * Retrieves Metadata of FileTransfer Activity for caching
23
- * @returns {Promise} Promise
31
+ *
32
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
24
33
  */
25
34
  static async retrieveForCache() {
26
- return super.retrieveREST(null, '/automation/v1/filetransfers/', null);
35
+ return super.retrieveREST(null, '/automation/v1/filetransfers/');
27
36
  }
28
37
 
29
38
  /**
30
39
  * Retrieve a specific File Transfer Definition by Name
31
- * @param {String} templateDir Directory where retrieved metadata directory will be saved
32
- * @param {String} name name of the metadata file
33
- * @param {Object} variables variables to be replaced in the metadata
34
- * @returns {Promise} Promise
40
+ *
41
+ * @param {string} templateDir Directory where retrieved metadata directory will be saved
42
+ * @param {string} name name of the metadata file
43
+ * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
44
+ * @returns {Promise.<TYPE.MetadataTypeItemObj>} Promise
35
45
  */
36
- static async retrieveAsTemplate(templateDir, name, variables) {
37
- const options = {
38
- uri: '/automation/v1/filetransfers/?$filter=name%20eq%20' + name.split(' ').join('%20'),
39
- };
40
-
41
- const res = await this.client.RestClient.get(options);
42
- if (res.body && Array.isArray(res.body.items) && res.body.items.length) {
46
+ static async retrieveAsTemplate(templateDir, name, templateVariables) {
47
+ const res = await this.client.rest.get(
48
+ '/automation/v1/filetransfers/?$filter=name%20eq%20' + encodeURIComponent(name)
49
+ );
50
+ if (Array.isArray(res?.items) && res?.items?.length) {
43
51
  // eq-operator returns a similar, not exact match and hence might return more than 1 entry
44
- const [metadata] = res.body.items.filter((item) => item.name === name);
52
+ const metadata = res.items.find((item) => item.name === name);
45
53
  if (!metadata) {
46
54
  Util.logger.error(`No ${this.definition.typeName} found with name "${name}"`);
47
55
  return;
48
56
  }
49
57
 
50
58
  // get full definition
51
- const extended = await this.client.RestClient.get({
52
- uri: '/automation/v1/filetransfers/' + metadata.id,
53
- });
59
+ const extended = await this.client.rest.get(
60
+ '/automation/v1/filetransfers/' + metadata[this.definition.idField]
61
+ );
62
+ const originalKey = extended[this.definition.keyField];
54
63
  const val = JSON.parse(
55
- Util.replaceByObject(JSON.stringify(this.parseMetadata(extended.body)), variables)
64
+ Util.replaceByObject(
65
+ JSON.stringify(this.parseMetadata(extended)),
66
+ templateVariables
67
+ )
56
68
  );
57
69
 
58
70
  // remove all fields listed in Definition for templating
59
71
  this.keepTemplateFields(val);
60
- File.writeJSONToFile(
72
+ await File.writeJSONToFile(
61
73
  [templateDir, this.definition.type].join('/'),
62
- val.customerKey + '.' + this.definition.type + '-meta',
63
- JSON.parse(Util.replaceByObject(JSON.stringify(val), variables))
64
- );
65
- Util.logger.info(
66
- `FileTransfer.retrieveAsTemplate:: Written Metadata to filesystem (${name})`
74
+ originalKey + '.' + this.definition.type + '-meta',
75
+ JSON.parse(Util.replaceByObject(JSON.stringify(val), templateVariables))
67
76
  );
77
+ Util.logger.info(`- templated ${this.definition.type}: ${name}`);
68
78
  return { metadata: val, type: this.definition.type };
69
- } else if (res.body && res.body.items) {
79
+ } else if (res?.items) {
70
80
  Util.logger.error(`No ${this.definition.typeName} found with name "${name}"`);
71
81
  } else {
72
82
  throw new Error(
73
83
  `Encountered unknown error when retrieveing ${
74
84
  this.definition.typeName
75
- } "${name}": ${JSON.stringify(res.body)}`
85
+ } "${name}": ${JSON.stringify(res)}`
76
86
  );
77
87
  }
78
88
  }
79
89
 
80
90
  /**
81
91
  * manages post retrieve steps
82
- * @param {Object} metadata a single fileTransfer activity definition
83
- * @returns {Object[]} metadata
92
+ *
93
+ * @param {TYPE.MetadataTypeItem} metadata a single fileTransfer activity definition
94
+ * @returns {object[]} metadata
84
95
  */
85
96
  static postRetrieveTasks(metadata) {
86
97
  const values = this.parseMetadata(metadata);
@@ -89,7 +100,8 @@ class FileTransfer extends MetadataType {
89
100
 
90
101
  /**
91
102
  * Creates a single File Transfer
92
- * @param {Object} fileTransfer a single File Transfer
103
+ *
104
+ * @param {TYPE.MetadataTypeItem} fileTransfer a single File Transfer
93
105
  * @returns {Promise} Promise
94
106
  */
95
107
  static create(fileTransfer) {
@@ -98,7 +110,8 @@ class FileTransfer extends MetadataType {
98
110
 
99
111
  /**
100
112
  * Updates a single File Transfer
101
- * @param {Object} fileTransfer a single File Transfer
113
+ *
114
+ * @param {TYPE.MetadataTypeItem} fileTransfer a single File Transfer
102
115
  * @returns {Promise} Promise
103
116
  */
104
117
  static update(fileTransfer) {
@@ -107,40 +120,51 @@ class FileTransfer extends MetadataType {
107
120
 
108
121
  /**
109
122
  * prepares a fileTransfer for deployment
110
- * @param {Object} metadata a single fileTransfer activity definition
123
+ *
124
+ * @param {TYPE.MetadataTypeItem} metadata a single fileTransfer activity definition
111
125
  * @returns {Promise} Promise
112
126
  */
113
127
  static async preDeployTasks(metadata) {
114
- metadata.fileTransferLocationId = Util.getFromCache(
115
- this.cache,
116
- 'ftpLocation',
117
- metadata.r__ftpLocation_name,
118
- 'name',
119
- 'id'
120
- );
128
+ if (metadata.r__ftpLocation_name) {
129
+ metadata.fileTransferLocationId = cache.searchForField(
130
+ 'ftpLocation',
131
+ metadata.r__ftpLocation_name,
132
+ 'name',
133
+ 'id'
134
+ );
135
+ } else {
136
+ throw new Error(
137
+ 'r__ftpLocation_name not set. Please ensure the source is properly set up and re-retrieve it first.'
138
+ );
139
+ }
121
140
  return metadata;
122
141
  }
123
142
  /**
124
143
  * parses retrieved Metadata before saving
125
- * @param {Object} metadata a single fileTransfer activity definition
126
- * @returns {Array} Array with one metadata object and one sql string
144
+ *
145
+ * @param {TYPE.MetadataTypeItem} metadata a single fileTransfer activity definition
146
+ * @returns {TYPE.MetadataTypeItem} parsed metadata
127
147
  */
128
148
  static parseMetadata(metadata) {
129
- metadata.r__ftpLocation_name = Util.getFromCache(
130
- this.cache,
131
- 'ftpLocation',
132
- metadata.fileTransferLocationId,
133
- 'id',
134
- 'name'
135
- );
136
- delete metadata.fileTransferLocationId;
149
+ try {
150
+ metadata.r__ftpLocation_name = cache.searchForField(
151
+ 'ftpLocation',
152
+ metadata.fileTransferLocationId,
153
+ 'id',
154
+ 'name'
155
+ );
156
+ delete metadata.fileTransferLocationId;
157
+ } catch (ex) {
158
+ Util.logger.warn(
159
+ ` - FileTransfer '${metadata[this.definition.keyField]}': ${ex.message}`
160
+ );
161
+ }
162
+
137
163
  return metadata;
138
164
  }
139
165
  }
140
166
 
141
167
  // Assign definition to static attributes
142
168
  FileTransfer.definition = require('../MetadataTypeDefinitions').fileTransfer;
143
- FileTransfer.cache = {};
144
- FileTransfer.client = undefined;
145
169
 
146
170
  module.exports = FileTransfer;
@@ -1,9 +1,11 @@
1
1
  'use strict';
2
2
 
3
+ const TYPE = require('../../types/mcdev.d');
3
4
  const MetadataType = require('./MetadataType');
4
5
 
5
6
  /**
6
7
  * Filter MetadataType
8
+ *
7
9
  * @augments MetadataType
8
10
  */
9
11
  class Filter extends MetadataType {
@@ -12,11 +14,16 @@ class Filter extends MetadataType {
12
14
  * Endpoint /automation/v1/filters/ returns all Filters,
13
15
  * but only with some of the fields. So it is needed to loop over
14
16
  * Filters with the endpoint /automation/v1/filters/{id}
15
- * @param {String} retrieveDir Directory where retrieved metadata directory will be saved
16
- * @returns {Promise} Promise
17
+ *
18
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
19
+ * @param {void} [_] unused parameter
20
+ * @param {void} [__] unused parameter
21
+ * @param {void} [___] unused parameter
22
+ * @param {string} [key] customer key of single item to retrieve
23
+ * @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
17
24
  */
18
- static async retrieve(retrieveDir) {
19
- return super.retrieveREST(retrieveDir, '/automation/v1/filters/', null);
25
+ static async retrieve(retrieveDir, _, __, ___, key) {
26
+ return super.retrieveREST(retrieveDir, '/automation/v1/filters/', null, null, key);
20
27
  }
21
28
  }
22
29