From 1159f222ebbdb1bbc2a713ea2f40fdd3dbc53774 Mon Sep 17 00:00:00 2001 From: "shahin.rahbariasl" Date: Wed, 12 Apr 2023 11:17:22 -0400 Subject: [PATCH 1/2] feat: add adunit specific fpd support [PB-1387] --- modules/ixBidAdapter.js | 23 +++++++++++ test/spec/modules/ixBidAdapter_spec.js | 57 ++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js index e791d933352..a9819cef702 100644 --- a/modules/ixBidAdapter.js +++ b/modules/ixBidAdapter.js @@ -195,6 +195,12 @@ function bidToVideoImp(bid) { // populate imp level transactionId imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid'); + // AdUnit-Specific First Party Data + const adUnitFPD = deepAccess(bid, 'ortb2Imp.ext.data'); + if (adUnitFPD) { + deepSetValue(imp, 'ext.data', adUnitFPD) + } + // copy all video properties to imp object for (const adUnitProperty in videoAdUnitRef) { if (VIDEO_PARAMS_ALLOW_LIST.indexOf(adUnitProperty) !== -1 && !imp.video.hasOwnProperty(adUnitProperty)) { @@ -268,6 +274,12 @@ function bidToNativeImp(bid) { // populate imp level transactionId imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid'); + // AdUnit-Specific First Party Data + const adUnitFPD = deepAccess(bid, 'ortb2Imp.ext.data'); + if (adUnitFPD) { + deepSetValue(imp, 'ext.data', adUnitFPD) + } + _applyFloor(bid, imp, NATIVE); return imp; @@ -956,6 +968,11 @@ function addImpressions(impressions, transactionIds, r, adUnitIndex) { _bannerImpression.bidfloorcur = impressionObjects[0].bidfloorcur; } + const adUnitFPD = impressions[transactionIds[adUnitIndex]].adUnitFPD + if (adUnitFPD) { + _bannerImpression.ext.data = adUnitFPD; + } + r.imp.push(_bannerImpression); } else { // set imp.ext.gpid to resolved gpid for each imp @@ -1196,6 +1213,12 @@ function createBannerImps(validBidRequest, missingBannerSizes, bannerImps) { bannerImps[validBidRequest.transactionId].tagId = deepAccess(validBidRequest, 'params.tagId'); bannerImps[validBidRequest.transactionId].pos = deepAccess(validBidRequest, 'mediaTypes.banner.pos'); + // AdUnit-Specific First Party Data + const adUnitFPD = deepAccess(validBidRequest, 'ortb2Imp.ext.data'); + if (adUnitFPD) { + bannerImps[validBidRequest.transactionId].adUnitFPD = adUnitFPD; + } + const sid = deepAccess(validBidRequest, 'params.id'); if (sid && (typeof sid === 'string' || typeof sid === 'number')) { bannerImps[validBidRequest.transactionId].sid = String(sid); diff --git a/test/spec/modules/ixBidAdapter_spec.js b/test/spec/modules/ixBidAdapter_spec.js index 8ea3b9dc522..149c4c44c21 100644 --- a/test/spec/modules/ixBidAdapter_spec.js +++ b/test/spec/modules/ixBidAdapter_spec.js @@ -1703,6 +1703,63 @@ describe('IndexexchangeAdapter', function () { expect(r.regs.gpp_sid).to.be.an('array'); expect(r.regs.gpp_sid).to.include(1); }); + + it('should add adunit specific data to imp ext for banner', function () { + const AD_UNIT_CODE = '/19968336/some-adunit-path'; + const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID); + validBids[0].ortb2Imp = { + ext: { + data: { + adserver: { + name: 'gam banner', + adslot: AD_UNIT_CODE + } + } + } + }; + const requests = spec.buildRequests(validBids, DEFAULT_OPTION); + const imp = extractPayload(requests[0]).imp[0]; + expect(deepAccess(imp, 'ext.data.adserver.name')).to.equal('gam banner'); + expect(deepAccess(imp, 'ext.data.adserver.adslot')).to.equal(AD_UNIT_CODE); + }); + + it('should add adunit specific data to imp ext for native', function () { + const AD_UNIT_CODE = '/19968336/some-adunit-path'; + const validBids = utils.deepClone(DEFAULT_NATIVE_VALID_BID); + validBids[0].ortb2Imp = { + ext: { + data: { + adserver: { + name: 'gam native', + adslot: AD_UNIT_CODE + } + } + } + }; + const requests = spec.buildRequests(validBids, DEFAULT_OPTION); + const imp = extractPayload(requests[0]).imp[0]; + expect(deepAccess(imp, 'ext.data.adserver.name')).to.equal('gam native'); + expect(deepAccess(imp, 'ext.data.adserver.adslot')).to.equal(AD_UNIT_CODE); + }); + + it('should add adunit specific data to imp ext for video', function () { + const AD_UNIT_CODE = '/19968336/some-adunit-path'; + const validBids = utils.deepClone(DEFAULT_VIDEO_VALID_BID); + validBids[0].ortb2Imp = { + ext: { + data: { + adserver: { + name: 'gam video', + adslot: AD_UNIT_CODE + } + } + } + }; + const requests = spec.buildRequests(validBids, DEFAULT_OPTION); + const imp = extractPayload(requests[0]).imp[0]; + expect(deepAccess(imp, 'ext.data.adserver.name')).to.equal('gam video'); + expect(deepAccess(imp, 'ext.data.adserver.adslot')).to.equal(AD_UNIT_CODE); + }); }); describe('buildRequests', function () { From c1917493d07e1cb9ee09d73ca360caae60d4d5ee Mon Sep 17 00:00:00 2001 From: "shahin.rahbariasl" Date: Wed, 12 Apr 2023 13:27:21 -0400 Subject: [PATCH 2/2] feat: move duplicate code to its function [PB-1387] --- modules/ixBidAdapter.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js index a9819cef702..06f96edca30 100644 --- a/modules/ixBidAdapter.js +++ b/modules/ixBidAdapter.js @@ -196,10 +196,7 @@ function bidToVideoImp(bid) { imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid'); // AdUnit-Specific First Party Data - const adUnitFPD = deepAccess(bid, 'ortb2Imp.ext.data'); - if (adUnitFPD) { - deepSetValue(imp, 'ext.data', adUnitFPD) - } + addAdUnitFPD(imp, bid) // copy all video properties to imp object for (const adUnitProperty in videoAdUnitRef) { @@ -275,10 +272,7 @@ function bidToNativeImp(bid) { imp.ext.tid = deepAccess(bid, 'ortb2Imp.ext.tid'); // AdUnit-Specific First Party Data - const adUnitFPD = deepAccess(bid, 'ortb2Imp.ext.data'); - if (adUnitFPD) { - deepSetValue(imp, 'ext.data', adUnitFPD) - } + addAdUnitFPD(imp, bid) _applyFloor(bid, imp, NATIVE); @@ -1028,6 +1022,19 @@ function addFPD(bidderRequest, r, fpd, site, user) { return r; } +/** + * Adds First-Party Data (FPD) from the bid object to the imp object. + * + * @param {Object} imp - The imp object, representing an impression in the OpenRTB format. + * @param {Object} bid - The bid object, containing information about the bid request. + */ +function addAdUnitFPD(imp, bid) { + const adUnitFPD = deepAccess(bid, 'ortb2Imp.ext.data'); + if (adUnitFPD) { + deepSetValue(imp, 'ext.data', adUnitFPD) + } +} + /** * addIdentifiersInfo adds indentifier info to ixDaig. *