From aed580537cf67bbb8b36d57405da2ce1f2a18fd5 Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Thu, 12 Dec 2024 23:28:09 -0800 Subject: [PATCH 1/2] add campaign id parameters --- spec/src/modules/tracker.js | 18 +++++++++++++++++- src/modules/tracker.js | 25 +++++++++++++++++++++++++ src/types/index.d.ts | 2 ++ src/types/tracker.d.ts | 4 ++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index c1bf6089..8adba820 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -7,6 +7,7 @@ const sinonChai = require('sinon-chai'); const cloneDeep = require('lodash.clonedeep'); const store = require('../../../test/utils/store'); // eslint-disable-line import/extensions const helpers = require('../../mocha.helpers'); +const clientHelpers = require('../../../src/utils/helpers'); const jsdom = require('../utils/jsdom-global'); const { addOrderIdRecord } = require('../../../src/utils/helpers'); let ConstructorIO = require('../../../test/constructorio'); // eslint-disable-line import/extensions @@ -1973,7 +1974,7 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { selectedFilters: { test: ['test'] }, section: 'Products', analyticsTags: testAnalyticsTag, - items: [{ itemId: '1' }, { item_id: '2' }], + items: [{ itemId: '1', slCampaignId: 'Campaign 123', slCampaignOwner: 'Campaign Man' }, { item_id: '2' }], }; it('Backwards Compatibility - V2 Should respond with a valid response when term and snake cased parameters are provided', (done) => { @@ -2062,6 +2063,7 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(bodyParams).to.have.property('selected_filters').to.deep.equal(v2Parameters.selectedFilters); expect(bodyParams).to.have.property('section').to.deep.equal(v2Parameters.section); expect(bodyParams).to.have.property('analytics_tags').to.deep.equal(v2Parameters.analyticsTags); + expect(bodyParams).to.have.property('items').to.deep.equal(v2Parameters.items.map((item) => clientHelpers.toSnakeCaseKeys(item, false))); // Response expect(responseParams).to.have.property('method').to.equal('POST'); @@ -2592,6 +2594,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { resultId: 'result-id', section: 'Products', analyticsTags: testAnalyticsTag, + slCampaignOwner: 'Campaign Man', + slCampaignId: 'Campaign 123', }; const v2Parameters = { resultCount: 1337, @@ -2685,6 +2689,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(bodyParams).to.have.property('item_id').to.equal(requiredParameters.itemId); expect(bodyParams).to.have.property('variation_id').to.equal(optionalParameters.variationId); expect(bodyParams).to.have.property('section').to.deep.equal(optionalParameters.section); + expect(bodyParams).to.have.property('sl_campaign_id').to.equal(optionalParameters.slCampaignId); + expect(bodyParams).to.have.property('sl_campaign_owner').to.deep.equal(optionalParameters.slCampaignOwner); expect(bodyParams).to.have.property('result_page').to.equal(v2Parameters.resultPage); expect(bodyParams).to.have.property('result_position_on_page').to.equal(v2Parameters.resultPositionOnPage); expect(bodyParams).to.have.property('result_count').to.equal(v2Parameters.resultCount); @@ -2895,6 +2901,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(requestParams).to.have.property('result_id').to.equal(optionalParameters.resultId); expect(requestParams).to.have.property('variation_id').to.equal(optionalParameters.variationId); expect(requestParams).to.have.property('analytics_tags').to.deep.equal(testAnalyticsTag); + expect(requestParams).to.have.property('sl_campaign_owner').to.deep.equal(optionalParameters.slCampaignOwner); + expect(requestParams).to.have.property('sl_campaign_id').to.deep.equal(optionalParameters.slCampaignId); // Response expect(responseParams).to.have.property('method').to.equal('GET'); @@ -5304,6 +5312,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { { itemId: '123', variationId: '456', + slCampaignId: 'Campaign 123', + slCampaignOwner: 'Campaign Man', }, { itemId: '789', @@ -5315,6 +5325,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { { item_id: '123', variation_id: '456', + sl_campaign_id: 'Campaign 123', + sl_campaign_owner: 'Campaign Man', }, { item_id: '789', @@ -6074,6 +6086,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { numResultsPerPage: 5, selectedFilters: { foo: ['bar'] }, analyticsTags: testAnalyticsTag, + slCampaignOwner: 'Campaign Man', + slCampaignId: 'Campaign 123', }; it('Backwards Compatibility - Should respond with a valid response when snake cased parameters are provided', (done) => { @@ -6280,6 +6294,8 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(requestParams).to.have.property('num_results_per_page').to.equal(optionalParameters.numResultsPerPage); expect(requestParams).to.have.property('selected_filters').to.deep.equal(optionalParameters.selectedFilters); expect(requestParams).to.have.property('analytics_tags').to.deep.equal(testAnalyticsTag); + expect(requestParams).to.have.property('sl_campaign_id').to.deep.equal(optionalParameters.slCampaignId); + expect(requestParams).to.have.property('sl_campaign_owner').to.deep.equal(optionalParameters.slCampaignOwner); // Response expect(responseParams).to.have.property('method').to.equal('POST'); diff --git a/src/modules/tracker.js b/src/modules/tracker.js index b01bc6fb..8a303c64 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -1,3 +1,4 @@ +/* eslint-disable complexity */ /* eslint-disable max-len */ /* eslint-disable object-curly-newline, no-underscore-dangle, camelcase, no-unneeded-ternary */ const EventEmitter = require('../utils/events'); @@ -852,8 +853,12 @@ class Tracker { selectedFilters = selected_filters, section, analyticsTags, + slCampaignId, + slCampaignOwner, } = parameters; const bodyParams = { + sl_campaign_id: slCampaignId, + sl_campaign_owner: slCampaignOwner, item_name: itemName, item_id: itemId, variation_id: variationId, @@ -949,6 +954,8 @@ class Tracker { itemIsConvertible = item_is_convertible, section, analyticsTags, + slCampaignOwner, + slCampaignId, } = parameters; // Ensure support for both item_name and name as parameters @@ -981,6 +988,14 @@ class Tracker { queryParams.analytics_tags = analyticsTags; } + if (slCampaignId) { + queryParams.sl_campaign_id = slCampaignId; + } + + if (slCampaignOwner) { + queryParams.sl_campaign_owner = slCampaignOwner; + } + this.requests.queue(`${url}${applyParamsAsString(queryParams, this.options)}`, undefined, undefined, networkParameters); this.requests.send(); @@ -1659,6 +1674,8 @@ class Tracker { name, itemName = item_name || name, analyticsTags, + slCampaignId, + slCampaignOwner, } = parameters; if (section) { @@ -1714,6 +1731,14 @@ class Tracker { bodyParams.analytics_tags = analyticsTags; } + if (slCampaignId) { + bodyParams.sl_campaign_id = slCampaignId; + } + + if (slCampaignOwner) { + bodyParams.sl_campaign_owner = slCampaignOwner; + } + const requestURL = `${requestPath}${applyParamsAsString({}, this.options)}`; const requestMethod = 'POST'; const requestBody = applyParams(bodyParams, { ...this.options, requestMethod }); diff --git a/src/types/index.d.ts b/src/types/index.d.ts index e35ae725..cc8f9279 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -233,6 +233,8 @@ export interface ItemTracked { itemName?: string; itemId?: string; variationId?: string; + slCampaignId?: string; + slCampaignOwner?: string; } export interface ItemTrackedPurchase extends ItemTracked { diff --git a/src/types/tracker.d.ts b/src/types/tracker.d.ts index e47537cd..f95c40d8 100644 --- a/src/types/tracker.d.ts +++ b/src/types/tracker.d.ts @@ -108,6 +108,8 @@ declare class Tracker { itemIsConvertible?: string; section?: string; analyticsTags?: Record; + slCampaignId?: string; + slCampaignOwner?: string; }, networkParameters?: NetworkParameters ): true | Error; @@ -204,6 +206,8 @@ declare class Tracker { numResultsPerPage?: number; selectedFilters?: object; analyticsTags?: Record; + slCampaignId?: string; + slCampaignOwner?: string; }, networkParameters?: NetworkParameters ): true | Error; From 2467563952116c031c7db21d7591f45529a2518e Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Tue, 17 Dec 2024 11:06:23 -0800 Subject: [PATCH 2/2] jsdocs --- src/modules/tracker.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/modules/tracker.js b/src/modules/tracker.js index 8a303c64..bd34f396 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -809,6 +809,8 @@ class Tracker { * @param {object} [parameters.selectedFilters] - Key - Value map of selected filters * @param {string} [parameters.section] - The section name for the item Ex. "Products" * @param {object} [parameters.analyticsTags] - Pass additional analytics data + * @param {object} [parameters.slCampaignId] - Pass campaign id of sponsored listing + * @param {object} [parameters.slCampaignOwner] - Pass campaign owner of sponsored listing * @param {object} [networkParameters] - Parameters relevant to the network request * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds) * @returns {(true|Error)} @@ -820,6 +822,8 @@ class Tracker { * itemName: 'Red T-Shirt', * itemId: 'KMH876', * resultId: '019927c2-f955-4020-8b8d-6b21b93cb5a2', + * slCampaignId: 'Campaign 123', + * slCampaignOwner: 'Store 123', * }, * ); */ @@ -917,6 +921,8 @@ class Tracker { * @param {string} [parameters.itemIsConvertible] - Whether or not an item is available for a conversion * @param {string} [parameters.section] - The section name for the item Ex. "Products" * @param {object} [parameters.analyticsTags] - Pass additional analytics data + * @param {object} [parameters.slCampaignId] - Pass campaign id of sponsored listing + * @param {object} [parameters.slCampaignOwner] - Pass campaign owner of sponsored listing * @param {object} [networkParameters] - Parameters relevant to the network request * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds) * @returns {(true|Error)} @@ -928,6 +934,8 @@ class Tracker { * itemName: 'Red T-Shirt', * itemId: 'KMH876', * resultId: '019927c2-f955-4020-8b8d-6b21b93cb5a2', + * slCampaignId: 'Campaign 123', + * slCampaignOwner: 'Store 123', * }, * ); */ @@ -1621,6 +1629,8 @@ class Tracker { * @param {number} [parameters.numResultsPerPage] - Number of results shown * @param {object} [parameters.selectedFilters] - Selected filters * @param {object} [parameters.analyticsTags] - Pass additional analytics data + * @param {object} [parameters.slCampaignId] - Pass campaign id of sponsored listing + * @param {object} [parameters.slCampaignOwner] - Pass campaign owner of sponsored listing * @param {object} [networkParameters] - Parameters relevant to the network request * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds) * @returns {(true|Error)} @@ -1638,6 +1648,8 @@ class Tracker { * filterName: 'brand', * filterValue: 'XYZ', * itemId: 'KMH876', + * slCampaignId: 'Campaign 123', + * slCampaignOwner: 'Store 123', * }, * ); */