Skip to content

Commit

Permalink
fix #4 handle missing target of rt gracefully
Browse files Browse the repository at this point in the history
  • Loading branch information
JoernBerkefeld committed Apr 9, 2021
1 parent 4ebfb4a commit 1d1d919
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 40 deletions.
31 changes: 13 additions & 18 deletions lib/metadataTypes/DataExtension.js
Original file line number Diff line number Diff line change
Expand Up @@ -829,28 +829,22 @@ class DataExtension extends MetadataType {
* @returns {Promise<{metadata:DataExtensionMap,type:string}>} Promise of items
*/
static async retrieveAsTemplate(templateDir, name, variables) {
const templateFields = this.getFieldNamesToRetrieve();
const dataExtensionOptions = {
props: templateFields,
const options = {
filter: {
leftOperand: 'Name',
operator: 'equals',
rightOperand: name,
},
};

const p = new Promise((resolve) => {
this.client.dataExtension(dataExtensionOptions).get((error, response) => {
if (error) {
throw new Error(error);
} else {
resolve(response);
}
});
});
const response = await p;
/** @type DataExtensionMap */
const metadata = super.parseResponseBody(response.body);
// const metadata = super.parseResponseBody(response.body);
const metadata = await this._retrieveAll(null, options);

if (!Object.keys(metadata).length) {
Util.logger.error(`${this.definition.type} '${name}' not found on server.`);
Util.logger.info('Downloaded: dataExtension (0)');
return { metadata: {}, type: 'dataExtension' };
}
const customerKey = Object.keys(metadata)[0];
await this._retrieveFieldsForSingleDe(metadata, customerKey);

Expand Down Expand Up @@ -966,13 +960,14 @@ class DataExtension extends MetadataType {
}

/**
* Retrieves dataExtension metadata. Afterwards starts retrieval of dataExtensionColumn metadata retrieval
* Retrieves dataExtension metadata and cleans it
* @private
* @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
* @param {Object} [options] e.g. filter
* @returns {Promise<DataExtensionMap>} keyField => metadata map
*/
static async _retrieveAll(additionalFields) {
const metadata = (await super.retrieveSOAPgeneric(null, null, null, additionalFields))
static async _retrieveAll(additionalFields, options) {
const metadata = (await super.retrieveSOAPgeneric(null, null, options, additionalFields))
.metadata;
for (const key in metadata) {
// some system data extensions do not have CategoryID which throws errors in other places. These do not need to be parsed
Expand Down
45 changes: 23 additions & 22 deletions lib/metadataTypes/MetadataType.js
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,9 @@ class MetadataType {
* @returns {Promise<{metadata:MetadataTypeMap,type:string}>} metadata
*/
static retrieveAsTemplate(templateDir, name, templateVariables, subType) {
Util.logger.error('retrieveAsTemplate is not supported yet for ' + this.definition.type);
Util.metadataLogger(
'error',
'debug',
this.definition.type,
'retrieveAsTemplate',
`(${templateDir}, ${name}, ${templateVariables}) no templating function`
Expand Down Expand Up @@ -542,9 +543,13 @@ class MetadataType {
options || {},
(error, response) => {
if (error) {
throw new Error(error);
} else {
Util.logger.debug(`SOAP.retrieve Error: ${error.message}`);
}
if (response) {
resolve(response.body);
} else {
// fallback, lets make sure surrounding methods know we got an empty result back
resolve({});
}
}
);
Expand Down Expand Up @@ -639,28 +644,24 @@ class MetadataType {
/**
* Builds map of metadata entries mapped to their keyfields
* @param {Object} body json of response body
* @param {string} [bodyIteratorField] overrides bodyIteratorField of definition
* @param {string} [keyField] overrides keyField of definition
* @returns {Promise<MetadataTypeMap>} keyField => metadata map
*/
static parseResponseBody(body, bodyIteratorField, keyField) {
if (!bodyIteratorField) {
bodyIteratorField = this.definition.bodyIteratorField;
}
if (!keyField) {
keyField = this.definition.keyField;
}
static parseResponseBody(body) {
const bodyIteratorField = this.definition.bodyIteratorField;
const keyField = this.definition.keyField;
const metadataStructure = {};
// in some cases data is just an array
if (Array.isArray(bodyIteratorField)) {
for (const item of body) {
const key = item[keyField];
metadataStructure[key] = item;
}
} else {
for (const item of body[bodyIteratorField]) {
const key = item[keyField];
metadataStructure[key] = item;
if (body !== null) {
// in some cases data is just an array
if (Array.isArray(bodyIteratorField)) {
for (const item of body) {
const key = item[keyField];
metadataStructure[key] = item;
}
} else if (body[bodyIteratorField]) {
for (const item of body[bodyIteratorField]) {
const key = item[keyField];
metadataStructure[key] = item;
}
}
}
return metadataStructure;
Expand Down

0 comments on commit 1d1d919

Please sign in to comment.