From 3ed4d12c583cdb7d1cf5cef1760603eedc3a4a2f Mon Sep 17 00:00:00 2001 From: Jimmy Tu Date: Wed, 29 Apr 2020 22:38:34 -0700 Subject: [PATCH 1/2] feat(openxAnalyticsAdaptor): Added userId tracking for v2 pipeline. --- modules/openxAnalyticsAdapter.js | 41 ++++++++++++--- .../modules/openxAnalyticsAdapter_spec.js | 51 +++++++++---------- 2 files changed, 59 insertions(+), 33 deletions(-) diff --git a/modules/openxAnalyticsAdapter.js b/modules/openxAnalyticsAdapter.js index 529d55b684a..c90a81db3e4 100644 --- a/modules/openxAnalyticsAdapter.js +++ b/modules/openxAnalyticsAdapter.js @@ -433,6 +433,7 @@ openxAdapter.enableAnalytics = function(adapterConfig = {options: {}}) { ['testPipeline', 'boolean', false], ['adIdKey', 'string', false], ['payloadWaitTime', 'number', false], + ['payloadWaitTimePadding', 'number', false], ]; let failedValidation = fieldValidations.find(([property, type, required]) => { @@ -887,13 +888,14 @@ function onBidRequested(bidRequest) { const adUnitCodeToBidderRequestMap = auction.adUnitCodeToBidderRequestMap; bidderRequests.forEach(bidderRequest => { - const { adUnitCode, bidder, bidId: requestId, mediaTypes, params, src } = bidderRequest; + const { adUnitCode, bidder, bidId: requestId, mediaTypes, params, src, userId } = bidderRequest; adUnitCodeToBidderRequestMap[adUnitCode][requestId] = { bidder, params, mediaTypes, source: src, + userId, startTime: start, timedOut: false, bids: {} @@ -954,10 +956,13 @@ function onBidResponse(bidResponse) { } function onBidTimeout(args) { - utils - ._map(args, value => value) - .forEach(({ auctionId, adUnitCode, bidId: requestId }) => { - auctionMap[auctionId].adUnitCodeToBidderRequestMap[adUnitCode][requestId].timedOut = true; + utils._each(args, ({auctionId, adUnitCode, bidId: requestId}) => { + try{ + auctionMap[auctionId].adUnitCodeToBidderRequestMap[adUnitCode][requestId].timedOut = true; + } catch (e) { + utils.logError(`ERROR: oxAnalyticsAdapter: unable to track timeout for + auction:${auctionId}, adUnitCode:${adUnitCode}, requestId:${requestId}`) + } }); } @@ -1079,11 +1084,18 @@ function buildAuctionPayload(auction) { function buildBidRequestsPayload(adUnitCodeToBidderRequestMap) { return utils._map(adUnitCodeToBidderRequestMap, (bidderRequestMap, adUnitCode) => { return utils._map(bidderRequestMap, (bidderRequest) => { - let {bidder, source, bids, mediaTypes, timedOut} = bidderRequest; + let {bidder, source, bids, mediaTypes, timedOut, userId} = bidderRequest; return { adUnitCode, bidder, source, + // return an array of objects containing the module name and id + userIds: utils._map(userId, (id, module) => { + return { + module: module, + id: getUserId(module, id)}; + }) + .filter(({id}) => id), hasBidderResponded: Object.keys(bids).length > 0, availableAdSizes: getMediaTypeSizes(mediaTypes), availableMediaTypes: getMediaTypes(mediaTypes), @@ -1135,6 +1147,23 @@ function buildAuctionPayload(auction) { }).flat(); } + function getUserId(module, idOrIdObject) { + let normalizedId; + + switch (module) { + case 'digitrustid': + normalizedId = utils.deepAccess(idOrIdObject, 'data.id'); + break; + case 'lipb': + normalizedId = idOrIdObject.lipbid; + break; + default: + normalizedId = idOrIdObject; + } + + return normalizedId; + } + function getMediaTypeSizes(mediaTypes) { return utils._map(mediaTypes, (mediaTypeConfig, mediaType) => { return utils.parseSizesInput(mediaTypeConfig.sizes) diff --git a/test/spec/modules/openxAnalyticsAdapter_spec.js b/test/spec/modules/openxAnalyticsAdapter_spec.js index 08659cc7f6a..a105b8df132 100644 --- a/test/spec/modules/openxAnalyticsAdapter_spec.js +++ b/test/spec/modules/openxAnalyticsAdapter_spec.js @@ -603,6 +603,9 @@ describe('openx analytics adapter', function() { bidId: 'test-openx-request-id', bidder: 'openx', params: { unit: 'test-openx-ad-unit-id' }, + userId: { + tdid: 'test-tradedesk-id' + } } ], start: 1586000000010 @@ -617,6 +620,9 @@ describe('openx analytics adapter', function() { bidId: 'test-closex-request-id', bidder: 'closex', params: { unit: 'test-closex-ad-unit-id' }, + userId: { + tdid: 'test-tradedesk-id' + } } ], start: 1586000000020 @@ -657,17 +663,20 @@ describe('openx analytics adapter', function() { ts: 'test-closex-ts' }; - const bidTimeoutOpenX = [{ + const bidTimeoutOpenX = { + 0: { adUnitCode: AD_UNIT_CODE, auctionId: 'test-auction-id', bidId: 'test-openx-request-id' - }]; + }}; - const bidTimeoutCloseX = [{ - adUnitCode: AD_UNIT_CODE, - auctionId: 'test-auction-id', - bidId: 'test-closex-request-id' - }]; + const bidTimeoutCloseX = { + 0: { + adUnitCode: AD_UNIT_CODE, + auctionId: 'test-auction-id', + bidId: 'test-closex-request-id' + } + }; const bidWonOpenX = { requestId: 'test-openx-request-id', @@ -691,7 +700,6 @@ describe('openx analytics adapter', function() { auctionId: 'test-auction-id' }; - function simulateAuction(events) { let highestBid; @@ -871,6 +879,14 @@ describe('openx analytics adapter', function() { expect(closexBidder.adUnitCode).to.equal(AD_UNIT_CODE); }); + it('should track the user ids', function () { + let openxBidder = auction.bidRequests.find(bidderRequest => bidderRequest.bidder === 'openx'); + let closexBidder = auction.bidRequests.find(bidderRequest => bidderRequest.bidder === 'closex'); + + expect(openxBidder.userIds).to.deep.include({module: 'tdid', id: bidRequestedOpenX.bids[0].userId.tdid}); + expect(closexBidder.userIds).to.deep.include({module: 'tdid', id: bidRequestedCloseX.bids[0].userId.tdid}); + }); + it('should not have responded', function () { let openxBidder = auction.bidRequests.find(bidderRequest => bidderRequest.bidder === 'openx'); let closexBidder = auction.bidRequests.find(bidderRequest => bidderRequest.bidder === 'closex'); @@ -1195,18 +1211,6 @@ describe('openx analytics adapter', function() { ts: 'test-closex-ts' }; - const bidTimeoutOpenX = [{ - adUnitCode: AD_UNIT_CODE, - auctionId: 'test-auction-id', - bidId: 'test-openx-request-id' - }]; - - const bidTimeoutCloseX = [{ - adUnitCode: AD_UNIT_CODE, - auctionId: 'test-auction-id', - bidId: 'test-closex-request-id' - }]; - const openxAdUnitInfo = [{'code': 'test-div-1', 'mediaTypes': {'banner': {'sizes': [[300, 250]]}}, 'bids': [{'bidder': 'openx', @@ -1239,13 +1243,6 @@ describe('openx analytics adapter', function() { auctionId: 'test-auction-id' }; - const bidWonCloseX = { - requestId: 'test-closex-request-id', - adId: 'test-closex-ad-id', - adUnitCode: AD_UNIT_CODE, - auctionId: 'test-auction-id' - }; - let highestBid; const onSlotLoadEvent = { eventType: SLOT_LOADED, From f35b46a3bb095169fd6cd2272edba22f64c48b73 Mon Sep 17 00:00:00 2001 From: Jimmy Tu Date: Wed, 6 May 2020 21:37:50 -0700 Subject: [PATCH 2/2] clean(openxBidderAdaptor): Switch try catch to checking for request prior to assigning value. --- modules/openxAnalyticsAdapter.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/openxAnalyticsAdapter.js b/modules/openxAnalyticsAdapter.js index c90a81db3e4..a7202295326 100644 --- a/modules/openxAnalyticsAdapter.js +++ b/modules/openxAnalyticsAdapter.js @@ -957,15 +957,15 @@ function onBidResponse(bidResponse) { function onBidTimeout(args) { utils._each(args, ({auctionId, adUnitCode, bidId: requestId}) => { - try{ - auctionMap[auctionId].adUnitCodeToBidderRequestMap[adUnitCode][requestId].timedOut = true; - } catch (e) { - utils.logError(`ERROR: oxAnalyticsAdapter: unable to track timeout for - auction:${auctionId}, adUnitCode:${adUnitCode}, requestId:${requestId}`) - } - }); + if (auctionMap[auctionId] + && auctionMap[auctionId].adUnitCodeToBidderRequestMap + && auctionMap[auctionId].adUnitCodeToBidderRequestMap[adUnitCode] + && auctionMap[auctionId].adUnitCodeToBidderRequestMap[adUnitCode][requestId] + ) { + auctionMap[auctionId].adUnitCodeToBidderRequestMap[adUnitCode][requestId].timedOut = true; + } + }); } - /** * * @param {PbAuction} endedAuction