From 7c705970b912c6fe9273b10fe75b1b147a76ffb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 30 Aug 2024 11:49:53 +0200 Subject: [PATCH] #1510: ensure we always cache default roles & timezones (relevant for retrieve-user) --- @types/lib/metadataTypes/Role.d.ts | 7 +++ @types/lib/metadataTypes/Role.d.ts.map | 2 +- lib/metadataTypes/Role.js | 82 +++++++++++++++----------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/@types/lib/metadataTypes/Role.d.ts b/@types/lib/metadataTypes/Role.d.ts index 60fb3651f..cb876ea74 100644 --- a/@types/lib/metadataTypes/Role.d.ts +++ b/@types/lib/metadataTypes/Role.d.ts @@ -39,6 +39,13 @@ declare class Role extends MetadataType { * @returns {Promise.} Metadata store object */ static retrieve(retrieveDir: string, _?: void | string[], ___?: void | string[], key?: string): Promise; + /** + * adds default roles to the list of retrieved roles for proper caching (but not storing) + * also caches available timezones for retrieve-user + * + * @param {MetadataTypeMap} parsed list or previously retrieved items as reference + */ + static cacheDefaultRolesAndTimezones(parsed: MetadataTypeMap): Promise; /** * Gets executed before deploying metadata * diff --git a/@types/lib/metadataTypes/Role.d.ts.map b/@types/lib/metadataTypes/Role.d.ts.map index 30483fc20..f13852fbb 100644 --- a/@types/lib/metadataTypes/Role.d.ts.map +++ b/@types/lib/metadataTypes/Role.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Role.d.ts","sourceRoot":"","sources":["../../../lib/metadataTypes/Role.js"],"names":[],"mappings":";uBAQa,OAAO,wBAAwB,EAAE,QAAQ;0BACzC,OAAO,wBAAwB,EAAE,WAAW;8BAC5C,OAAO,wBAAwB,EAAE,eAAe;+BAChD,OAAO,wBAAwB,EAAE,gBAAgB;mCACjD,OAAO,wBAAwB,EAAE,oBAAoB;kCACrD,OAAO,wBAAwB,EAAE,mBAAmB;8BACpD,OAAO,wBAAwB,EAAE,eAAe;iCAChD,OAAO,wBAAwB,EAAE,kBAAkB;gCACnD,OAAO,wBAAwB,EAAE,iBAAiB;kCAClD,OAAO,wBAAwB,EAAE,mBAAmB;0BACpD,OAAO,wBAAwB,EAAE,WAAW;AAXzD;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH;IACI;;;;;;;;OAQG;IACH,6BANW,MAAM,MACN,IAAI,GAAG,MAAM,EAAE,QACf,IAAI,GAAG,MAAM,EAAE,QACf,MAAM,GACJ,OAAO,CAAE,kBAAkB,CAAC,CAsFxC;IAED;;;;;OAKG;IACH,gCAHW,gBAAgB,GACd,gBAAgB,CAS5B;IAED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAK1B;IAED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAK1B;IAED;;;;;OAKG;IACH,2BAHW,eAAe,GACb,OAAO,CAAE,IAAI,CAAC,CA4G1B;IAED;;;;;;;;;;OAUG;IACH,4BAPW,MAAM,WACN,MAAM,eACN,MAAM,cACN,MAAM,GAEJ,IAAI,CAyDhB;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAhVwB,mBAAmB"} \ No newline at end of file +{"version":3,"file":"Role.d.ts","sourceRoot":"","sources":["../../../lib/metadataTypes/Role.js"],"names":[],"mappings":";uBAQa,OAAO,wBAAwB,EAAE,QAAQ;0BACzC,OAAO,wBAAwB,EAAE,WAAW;8BAC5C,OAAO,wBAAwB,EAAE,eAAe;+BAChD,OAAO,wBAAwB,EAAE,gBAAgB;mCACjD,OAAO,wBAAwB,EAAE,oBAAoB;kCACrD,OAAO,wBAAwB,EAAE,mBAAmB;8BACpD,OAAO,wBAAwB,EAAE,eAAe;iCAChD,OAAO,wBAAwB,EAAE,kBAAkB;gCACnD,OAAO,wBAAwB,EAAE,iBAAiB;kCAClD,OAAO,wBAAwB,EAAE,mBAAmB;0BACpD,OAAO,wBAAwB,EAAE,WAAW;AAXzD;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH;IACI;;;;;;;;OAQG;IACH,6BANW,MAAM,MACN,IAAI,GAAG,MAAM,EAAE,QACf,IAAI,GAAG,MAAM,EAAE,QACf,MAAM,GACJ,OAAO,CAAE,kBAAkB,CAAC,CAsDxC;IAED;;;;;OAKG;IACH,6CAFW,eAAe,iBAsCzB;IAED;;;;;OAKG;IACH,gCAHW,gBAAgB,GACd,gBAAgB,CAS5B;IAED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAK1B;IAED;;;;;OAKG;IACH,wBAHW,gBAAgB,gBAK1B;IAED;;;;;OAKG;IACH,2BAHW,eAAe,GACb,OAAO,CAAE,IAAI,CAAC,CA4G1B;IAED;;;;;;;;;;OAUG;IACH,4BAPW,MAAM,WACN,MAAM,eACN,MAAM,cACN,MAAM,GAEJ,IAAI,CAyDhB;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA5VwB,mBAAmB"} \ No newline at end of file diff --git a/lib/metadataTypes/Role.js b/lib/metadataTypes/Role.js index 8286b6b85..eae687288 100644 --- a/lib/metadataTypes/Role.js +++ b/lib/metadataTypes/Role.js @@ -73,41 +73,6 @@ class Role extends MetadataType { const results = await this.client.soap.retrieve('Role', fields, requestParams); const parsed = this.parseResponseBody(results); - if (!retrieveDir) { - // retrieve "Marketing Cloud%" roles not returned by SOAP API - const { roles, timeZones } = await this.client.rest.get( - '/platform/v1/setup/quickflow/data' - ); - // this endpoint does not provide keys - const roleNameKeyMap = { - 'Marketing Cloud Administrator': 'SYS_DEF_IMHADMIN', - 'Marketing Cloud Channel Manager': 'SYS_DEF_CHANNELMANAGER', - 'Marketing Cloud Content Editor/Publisher': 'SYS_DEF_CONTENTEDIT', - 'Marketing Cloud Security Administrator': 'SYS_DEF_SECURITYADMIN', - 'Marketing Cloud Viewer': 'SYS_DEF_VIEWER', - }; - for (const role of roles) { - if (roleNameKeyMap[role.roleName]) { - parsed[roleNameKeyMap[role.roleName]] = { - CustomerKey: roleNameKeyMap[role.roleName], - Name: role.roleName, - ObjectID: role.roleID, - Desscription: role.description, - CreatedDate: '2012-02-21T02:09:19.983', - IsSystemDefined: true, - c__notAssignable: true, - }; - } - } - // the languages object is incomplete. the actual list is much longer --> ignoring it here - // convert timeZones to object - const timeZonesObj = {}; - for (const timeZone of timeZones) { - timeZonesObj[timeZone.id] = timeZone; - } - // cache timeZones to share it with other type-classes - cache.setMetadata('_timezone', timeZonesObj); - } if (retrieveDir) { const savedMetadata = await super.saveResults(parsed, retrieveDir, null); Util.logger.info( @@ -117,9 +82,56 @@ class Role extends MetadataType { await this.runDocumentOnRetrieve(key, savedMetadata); } + + await this.cacheDefaultRolesAndTimezones(parsed); + return { metadata: parsed, type: this.definition.type }; } + /** + * adds default roles to the list of retrieved roles for proper caching (but not storing) + * also caches available timezones for retrieve-user + * + * @param {MetadataTypeMap} parsed list or previously retrieved items as reference + */ + static async cacheDefaultRolesAndTimezones(parsed) { + // retrieve "Marketing Cloud%" roles not returned by SOAP API for cache (required by retrieve-user) + // also cache available timezones for retrieve-user + Util.logger.info(Util.getGrayMsg(' - Caching default roles and timezones')); + const { roles, timeZones } = await this.client.rest.get( + '/platform/v1/setup/quickflow/data' + ); + // this endpoint does not provide keys + const roleNameKeyMap = { + 'Marketing Cloud Administrator': 'SYS_DEF_IMHADMIN', + 'Marketing Cloud Channel Manager': 'SYS_DEF_CHANNELMANAGER', + 'Marketing Cloud Content Editor/Publisher': 'SYS_DEF_CONTENTEDIT', + 'Marketing Cloud Security Administrator': 'SYS_DEF_SECURITYADMIN', + 'Marketing Cloud Viewer': 'SYS_DEF_VIEWER', + }; + for (const role of roles) { + if (roleNameKeyMap[role.roleName]) { + parsed[roleNameKeyMap[role.roleName]] = { + CustomerKey: roleNameKeyMap[role.roleName], + Name: role.roleName, + ObjectID: role.roleID, + Desscription: role.description, + CreatedDate: '2012-02-21T02:09:19.983', + IsSystemDefined: true, + c__notAssignable: true, + }; + } + } + // the languages object is incomplete. the actual list is much longer --> ignoring it here + // convert timeZones to object + const timeZonesObj = {}; + for (const timeZone of timeZones) { + timeZonesObj[timeZone.id] = timeZone; + } + // cache timeZones to share it with other type-classes + cache.setMetadata('_timezone', timeZonesObj); + } + /** * Gets executed before deploying metadata *