Skip to content

Commit

Permalink
#789: switch campaigns to different API endpoint to get alphanumeric …
Browse files Browse the repository at this point in the history
…ID for mobileMessage
  • Loading branch information
JoernBerkefeld committed Mar 28, 2023
1 parent 437b814 commit a279330
Show file tree
Hide file tree
Showing 4 changed files with 217 additions and 28 deletions.
37 changes: 29 additions & 8 deletions docs/dist/documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -1475,7 +1475,9 @@ Campaign MetadataType
* [Campaign](#Campaign)[<code>MetadataType</code>](#MetadataType)
* [.retrieve(retrieveDir, [_], [__], [key])](#Campaign.retrieve) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
* [.retrieveForCache()](#Campaign.retrieveForCache) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
* [.getAssetTags(retrieveDir, id, name)](#Campaign.getAssetTags) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
* [.upgradeGetBulk()](#Campaign.upgradeGetBulk)
* [.getBulkForMobileApi(url, [pageSize], [iteratorField])](#Campaign.getBulkForMobileApi) ⇒ <code>Promise.&lt;object&gt;</code>
* [.getAssetTags(retrieveDir, campaignId, name)](#Campaign.getAssetTags) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>

<a name="Campaign.retrieve"></a>

Expand All @@ -1499,9 +1501,29 @@ Retrieves event definition metadata for caching

**Kind**: static method of [<code>Campaign</code>](#Campaign)
**Returns**: <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code> - Promise of metadata
<a name="Campaign.upgradeGetBulk"></a>

### Campaign.upgradeGetBulk()
helper for [retrieve](#MobileMessage.retrieve) and [retrieveForCache](#MobileMessage.retrieveForCache)

**Kind**: static method of [<code>Campaign</code>](#Campaign)
<a name="Campaign.getBulkForMobileApi"></a>

### Campaign.getBulkForMobileApi(url, [pageSize], [iteratorField]) ⇒ <code>Promise.&lt;object&gt;</code>
Method that makes paginated GET API Requests using $pageSize and $page parameters

**Kind**: static method of [<code>Campaign</code>](#Campaign)
**Returns**: <code>Promise.&lt;object&gt;</code> - API response combined items

| Param | Type | Description |
| --- | --- | --- |
| url | <code>string</code> | of the resource to retrieve |
| [pageSize] | <code>number</code> | of the response, defaults to 50 |
| [iteratorField] | <code>&#x27;items&#x27;</code> \| <code>&#x27;definitions&#x27;</code> \| <code>&#x27;entry&#x27;</code> | attribute of the response to iterate over |

<a name="Campaign.getAssetTags"></a>

### Campaign.getAssetTags(retrieveDir, id, name) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
### Campaign.getAssetTags(retrieveDir, campaignId, name) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
Parses campaign asset response body and returns metadata entries mapped to their id

**Kind**: static method of [<code>Campaign</code>](#Campaign)
Expand All @@ -1510,7 +1532,7 @@ Parses campaign asset response body and returns metadata entries mapped to their
| Param | Type | Description |
| --- | --- | --- |
| retrieveDir | <code>string</code> | folder where to save |
| id | <code>string</code> | of camapaign to retrieve |
| campaignId | <code>string</code> | of camapaign to retrieve |
| name | <code>string</code> | of camapaign for saving |

<a name="ContentArea"></a>
Expand Down Expand Up @@ -4031,7 +4053,7 @@ MobileMessage MetadataType
* [MobileMessage](#MobileMessage)[<code>MetadataType</code>](#MetadataType)
* [.retrieve(retrieveDir, [_], [__], [key])](#MobileMessage.retrieve) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code> \| <code>void</code>
* [.retrieveForCache()](#MobileMessage.retrieveForCache) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
* [._upgradeGetBulk()](#MobileMessage._upgradeGetBulk)
* [.upgradeGetBulk()](#MobileMessage.upgradeGetBulk)
* [.getBulkForMobileApi(url, [pageSize], [iteratorField])](#MobileMessage.getBulkForMobileApi) ⇒ <code>Promise.&lt;object&gt;</code>
* [.update(metadata)](#MobileMessage.update) ⇒ <code>Promise</code>
* [.create(metadata)](#MobileMessage.create) ⇒ <code>Promise</code>
Expand Down Expand Up @@ -4068,9 +4090,9 @@ Retrieves event definition metadata for caching

**Kind**: static method of [<code>MobileMessage</code>](#MobileMessage)
**Returns**: <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code> - Promise of metadata
<a name="MobileMessage._upgradeGetBulk"></a>
<a name="MobileMessage.upgradeGetBulk"></a>

### MobileMessage.\_upgradeGetBulk()
### MobileMessage.upgradeGetBulk()
helper for [retrieve](#MobileMessage.retrieve) and [retrieveForCache](#MobileMessage.retrieveForCache)

**Kind**: static method of [<code>MobileMessage</code>](#MobileMessage)
Expand Down Expand Up @@ -4912,8 +4934,7 @@ TransactionalMessage MetadataType
<a name="TransactionalMessage.retrieve"></a>

### TransactionalMessage.retrieve(retrieveDir, [_], [__], [key]) ⇒ <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code>
Retrieves Metadata of Mobile Keywords
Endpoint /legacy/v1/beta/mobile/code/ return all Mobile Codes with all details.
Retrieves Metadata

**Kind**: static method of [<code>TransactionalMessage</code>](#TransactionalMessage)
**Returns**: <code>Promise.&lt;TYPE.MetadataTypeMapObj&gt;</code> - Promise of metadata
Expand Down
105 changes: 97 additions & 8 deletions lib/metadataTypes/Campaign.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,22 @@ class Campaign extends MetadataType {
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise
*/
static async retrieve(retrieveDir, _, __, key) {
const res = await super.retrieveREST(retrieveDir, '/hub/v1/campaigns', null, key);
this.upgradeGetBulk();
const res = await super.retrieveREST(
retrieveDir,
'/legacy/v1/beta2/data/campaign/',
null,
key
);
// get assignments

Util.logger.info(`Retrieving: campaignAsset`);
const campaignAssets = await Promise.all(
Object.keys(res.metadata).map((key) =>
this.getAssetTags(retrieveDir, res.metadata[key].id, key)
this.getAssetTags(retrieveDir, res.metadata[key].campaignId, key)
)
);
Util.logger.info(
`Downloaded: campaignAssets (${campaignAssets.flat().length})` + Util.getKeysString(key)
`Downloaded: campaignAsset (${campaignAssets.flat().length})` + Util.getKeysString(key)
);

return res;
Expand All @@ -41,19 +47,102 @@ class Campaign extends MetadataType {
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
*/
static retrieveForCache() {
return super.retrieveREST(null, '/hub/v1/campaigns');
this.upgradeGetBulk();
return super.retrieveREST(null, '/legacy/v1/beta2/data/campaign/');
}
/**
* helper for {@link MobileMessage.retrieve} and {@link MobileMessage.retrieveForCache}
*/
static upgradeGetBulk() {
this.getBulkBackup ||= this.client.rest.getBulk;
this.client.rest.getBulk = this.getBulkForMobileApi.bind(this.client.rest);
}

/**
* Method that makes paginated GET API Requests using $pageSize and $page parameters
*
* @param {string} url of the resource to retrieve
* @param {number} [pageSize] of the response, defaults to 50
* @param {'items'|'definitions'|'entry'} [iteratorField] attribute of the response to iterate over
* @returns {Promise.<object>} API response combined items
*/
static async getBulkForMobileApi(url, pageSize, iteratorField) {
let page = 1;
const baseUrl = url.split('?')[0];
const isTransactionalMessageApi = this.isTransactionalMessageApi(baseUrl);
const isLegacyApi = baseUrl && baseUrl.startsWith('/legacy/v1/');
const queryParams = new URLSearchParams(url.split('?')[1]);
let collector;
let shouldPaginate = false;
let pageSizeName = '$pageSize';
let pageName = '$page';
let countName = 'count';
if (isLegacyApi) {
pageSizeName = '$top';
pageName = '$skip';
countName = 'totalResults';
page = 0; // index starts with 0 for mobileMessage
if (pageSize != 50) {
// values other than 50 are ignore by at least some of the sub-endpoints; while others have 50 as the maximum.
pageSize = 50;
}
}
queryParams.set(pageSizeName, Number(pageSize || 50).toString());
do {
queryParams.set(pageName, Number(page).toString());
const temp = await this._apiRequest(
{
method: 'GET',
url: baseUrl + '?' + decodeURIComponent(queryParams.toString()),
},
this.options.requestAttempts
);
if (!iteratorField) {
if (Array.isArray(temp.items)) {
iteratorField = 'items';
} else if (Array.isArray(temp.definitions)) {
iteratorField = 'definitions';
} else if (Array.isArray(temp.entry)) {
iteratorField = 'entry';
} else {
throw new TypeError('Could not find an array to iterate over');
}
}
if (collector && Array.isArray(temp[iteratorField])) {
collector[iteratorField].push(...temp[iteratorField]);
} else if (collector == null) {
collector = temp;
}
if (
Array.isArray(collector[iteratorField]) &&
collector[iteratorField].length >= temp[countName] &&
(!isTransactionalMessageApi ||
(isTransactionalMessageApi && temp[countName] != temp[pageSizeName]))
) {
// ! the transactional message API returns a value for "count" that represents the currently returned number of records, instead of the total amount. checking for count != pageSize is a workaround for this
// * opened Support Case #43988240 for this issue
shouldPaginate = false;
} else {
page++;
shouldPaginate = true;
if (this.options?.eventHandlers?.onLoop) {
this.options.eventHandlers.onLoop(null, collector?.[iteratorField]);
}
}
} while (shouldPaginate);
return collector;
}

/**
* Parses campaign asset response body and returns metadata entries mapped to their id
*
* @param {string} retrieveDir folder where to save
* @param {string} id of camapaign to retrieve
* @param {string} campaignId of camapaign to retrieve
* @param {string} name of camapaign for saving
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Campaign Asset Object
*/
static async getAssetTags(retrieveDir, id, name) {
const res = await this.client.rest.getBulk(`/hub/v1/campaigns/${id}/assets`);
static async getAssetTags(retrieveDir, campaignId, name) {
const res = await this.client.rest.getBulk(`/hub/v1/campaigns/${campaignId}/assets`);

for (const asset of res.items) {
await File.writeJSONToFile(
Expand Down
22 changes: 14 additions & 8 deletions lib/metadataTypes/MobileMessage.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class MobileMessage extends MetadataType {
* @returns {Promise.<TYPE.MetadataTypeMapObj> | void} Promise of metadata
*/
static retrieve(retrieveDir, _, __, key) {
this._upgradeGetBulk();
this.upgradeGetBulk();
try {
return super.retrieveREST(
retrieveDir,
Expand Down Expand Up @@ -51,7 +51,7 @@ class MobileMessage extends MetadataType {
* @returns {Promise.<TYPE.MetadataTypeMapObj>} Promise of metadata
*/
static retrieveForCache() {
this._upgradeGetBulk();
this.upgradeGetBulk();
return super.retrieveREST(
null,
'/legacy/v1/beta/mobile/message/' +
Expand All @@ -62,7 +62,7 @@ class MobileMessage extends MetadataType {
/**
* helper for {@link MobileMessage.retrieve} and {@link MobileMessage.retrieveForCache}
*/
static _upgradeGetBulk() {
static upgradeGetBulk() {
this.getBulkBackup ||= this.client.rest.getBulk;
this.client.rest.getBulk = this.getBulkForMobileApi.bind(this.client.rest);
}
Expand All @@ -79,14 +79,14 @@ class MobileMessage extends MetadataType {
let page = 1;
const baseUrl = url.split('?')[0];
const isTransactionalMessageApi = this.isTransactionalMessageApi(baseUrl);
const isMobileApi = baseUrl && baseUrl.startsWith('/legacy/v1/beta/mobile');
const isLegacyApi = baseUrl && baseUrl.startsWith('/legacy/v1/');
const queryParams = new URLSearchParams(url.split('?')[1]);
let collector;
let shouldPaginate = false;
let pageSizeName = '$pageSize';
let pageName = '$page';
let countName = 'count';
if (isMobileApi) {
if (isLegacyApi) {
pageSizeName = '$top';
pageName = '$skip';
countName = 'totalResults';
Expand Down Expand Up @@ -279,9 +279,12 @@ class MobileMessage extends MetadataType {
for (const campaign of metadata.campaigns) {
try {
// test if exists
cache.getByKey('campaign', campaign.name);
const test = cache.getByKey('campaign', campaign.name);
if (!test) {
throw new Error(`campaign ${campaign.name} not found in cache`);
}

metadata.c__campaignNames.push(campaign.name);
// TODO figure out what campaign.id stands for - it cant be found on campaigns.
} catch (ex) {
Util.logger.warn(
` - ${this.definition.type} ${metadata[this.definition.nameField]}: ${
Expand Down Expand Up @@ -359,7 +362,10 @@ class MobileMessage extends MetadataType {

for (const campaignName of metadata.c__campaignNames) {
const campaign = cache.getByKey('campaign', campaignName);
metadata.c__campaignNames.push({
if (!campaign) {
throw new Error(`campaign ${campaignName} not found in cache`);
}
metadata.campaigns.push({
id: campaign.id,
name: campaignName,
display: {
Expand Down
Loading

0 comments on commit a279330

Please sign in to comment.