From 7686ce7574750e69e93c5a275ff028b542f0470c Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 9 May 2024 13:39:01 +0530 Subject: [PATCH 1/8] support bidfloor from params --- modules/insticatorBidAdapter.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 617ce49f171..9d66c4d6ecf 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -170,6 +170,13 @@ function buildImpression(bidRequest) { }, } + let bidFloor = parseFloat(deepAccess(bidRequest, 'params.floor')); + + if (!isNaN(bidFloor)) { + imp.bidfloor = deepAccess(bidRequest, 'params.floor'); + imp.bidfloorcur = 'USD'; + } + if (deepAccess(bidRequest, 'mediaTypes.banner')) { imp.banner = buildBanner(bidRequest); } From d7d68a0852fb906f5287bb3fea58d6c901ae11d3 Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 9 May 2024 13:59:36 +0530 Subject: [PATCH 2/8] update test case for bidder bidfloor --- test/spec/modules/insticatorBidAdapter_spec.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/spec/modules/insticatorBidAdapter_spec.js b/test/spec/modules/insticatorBidAdapter_spec.js index 5e41cd6d7aa..071e2dfbfa5 100644 --- a/test/spec/modules/insticatorBidAdapter_spec.js +++ b/test/spec/modules/insticatorBidAdapter_spec.js @@ -569,6 +569,20 @@ describe('InsticatorBidAdapter', function () { expect(data.imp[0].video.h).to.equal(480); }); + it('should have bidder bidfloor from the request', function () { + const tempBiddRequest = { + ...bidRequest, + params: { + ...bidRequest.params, + floor: 0.5, + }, + } + const requests = spec.buildRequests([tempBiddRequest], bidderRequest); + const data = JSON.parse(requests[0].data); + expect(data.imp[0].bidfloor).to.equal(0.5); + expect(data.imp[0].bidfloorcur).to.equal('USD'); + }); + it('should have sites first party data if present in bidderRequest ortb2', function () { bidderRequest = { ...bidderRequest, From 43fe0da58754e45444d72ebb963c2ce114081401 Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 9 May 2024 16:30:27 +0530 Subject: [PATCH 3/8] prioritize module floor --- modules/insticatorBidAdapter.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 9d66c4d6ecf..b7d32bc21d7 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -1,7 +1,7 @@ import {config} from '../src/config.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {deepAccess, generateUUID, logError, isArray, isInteger, isArrayOfNums, deepSetValue} from '../src/utils.js'; +import {deepAccess, generateUUID, logError, isArray, isInteger, isArrayOfNums, deepSetValue, isFn, logWarn} from '../src/utils.js'; import {getStorageManager} from '../src/storageManager.js'; import {find} from '../src/polyfill.js'; @@ -185,6 +185,33 @@ function buildImpression(bidRequest) { imp.video = buildVideo(bidRequest); } + if (isFn(bidRequest.getFloor)) { + let moduleBidFloor; + + const mediaType = deepAccess(bidRequest, 'mediaTypes.banner') ? 'banner' : 'video'; + let _mediaType = mediaType === 'banner' ? 'banner' : 'video'; + let _size = mediaType === 'banner' ? deepAccess(bidRequest, 'mediaTypes.banner.sizes') : [deepAccess(bidRequest, 'mediaTypes.video.w'), deepAccess(bidRequest, 'mediaTypes.video.h')]; + if (mediaType && ['banner', 'video'].includes(mediaType)) { + const { w: width, h: height } = imp[mediaType]; + _mediaType = mediaType; + _size = [width, height]; + } + try { + moduleBidFloor = bidRequest.getFloor({ + mediaType: _mediaType, + size: _size + }); + } catch (err) { + // continue with no module floors + logWarn('priceFloors module call getFloor failed, error : ', err); + } + + if (moduleBidFloor && moduleBidFloor.currency === 'USD') { + imp.bidfloor = moduleBidFloor.floor; + imp.bidfloorcur = moduleBidFloor.currency; + } + } + return imp; } From b88258a97e364173a597591641dfc65ba762578a Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 9 May 2024 16:52:04 +0530 Subject: [PATCH 4/8] fix --- modules/insticatorBidAdapter.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index b7d32bc21d7..7dc1c77c282 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -188,10 +188,25 @@ function buildImpression(bidRequest) { if (isFn(bidRequest.getFloor)) { let moduleBidFloor; - const mediaType = deepAccess(bidRequest, 'mediaTypes.banner') ? 'banner' : 'video'; - let _mediaType = mediaType === 'banner' ? 'banner' : 'video'; - let _size = mediaType === 'banner' ? deepAccess(bidRequest, 'mediaTypes.banner.sizes') : [deepAccess(bidRequest, 'mediaTypes.video.w'), deepAccess(bidRequest, 'mediaTypes.video.h')]; + const mediaType = deepAccess(bidRequest, 'mediaTypes.banner') ? 'banner' : deepAccess(bidRequest, 'mediaTypes.video') ? 'video' : undefined; + + let _mediaType = mediaType; + let _size = '*'; + if (mediaType && ['banner', 'video'].includes(mediaType)) { + if (mediaType === 'banner') { + const { w: width, h: height } = imp[mediaType]; + if (width && height) { + _size = [width, height]; + } + } else { + const sizes = deepAccess(bidRequest, 'mediaTypes.banner.format'); + if (sizes && sizes.length > 0) { + const [width, height] = sizes[0]; + _size = [width, height]; + } + } + } else if (mediaType === 'video') { const { w: width, h: height } = imp[mediaType]; _mediaType = mediaType; _size = [width, height]; From c874e2cfdeeff1dcce21fd0745efa2d95df5ace8 Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 9 May 2024 20:03:38 +0530 Subject: [PATCH 5/8] update bidfloorcur --- modules/insticatorBidAdapter.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 7dc1c77c282..bd07e275504 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -175,6 +175,11 @@ function buildImpression(bidRequest) { if (!isNaN(bidFloor)) { imp.bidfloor = deepAccess(bidRequest, 'params.floor'); imp.bidfloorcur = 'USD'; + const bidfloorcur = deepAccess(bidRequest, 'params.bidfloorcur') + if (bidfloorcur && bidfloorcur !== 'USD') { + delete imp.bidfloor; + delete imp.bidfloorcur; + } } if (deepAccess(bidRequest, 'mediaTypes.banner')) { From 845de918f9ab03774eb800039427d6f7887dd29f Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Fri, 10 May 2024 16:15:01 +0530 Subject: [PATCH 6/8] add USD currency for module floor --- modules/insticatorBidAdapter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index bd07e275504..e644e062595 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -218,6 +218,7 @@ function buildImpression(bidRequest) { } try { moduleBidFloor = bidRequest.getFloor({ + currency: 'USD', mediaType: _mediaType, size: _size }); @@ -226,7 +227,7 @@ function buildImpression(bidRequest) { logWarn('priceFloors module call getFloor failed, error : ', err); } - if (moduleBidFloor && moduleBidFloor.currency === 'USD') { + if (moduleBidFloor) { imp.bidfloor = moduleBidFloor.floor; imp.bidfloorcur = moduleBidFloor.currency; } From b0822bdf2822dc75540a035b4a54b9accf453eae Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 23 May 2024 15:42:30 +0530 Subject: [PATCH 7/8] add test cases for bidfloors and fix module floor scopes --- modules/insticatorBidAdapter.js | 20 ++--- .../spec/modules/insticatorBidAdapter_spec.js | 80 +++++++++++++++++++ 2 files changed, 90 insertions(+), 10 deletions(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index e644e062595..e2c8be01d95 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -203,18 +203,18 @@ function buildImpression(bidRequest) { const { w: width, h: height } = imp[mediaType]; if (width && height) { _size = [width, height]; + } else { + const sizes = deepAccess(bidRequest, 'mediaTypes.banner.format'); + if (sizes && sizes.length > 0) { + const {w: width, h: height} = sizes[0]; + _size = [width, height]; + } } - } else { - const sizes = deepAccess(bidRequest, 'mediaTypes.banner.format'); - if (sizes && sizes.length > 0) { - const [width, height] = sizes[0]; - _size = [width, height]; - } + } else if (mediaType === 'video') { + const { w: width, h: height } = imp[mediaType]; + _mediaType = mediaType; + _size = [width, height]; } - } else if (mediaType === 'video') { - const { w: width, h: height } = imp[mediaType]; - _mediaType = mediaType; - _size = [width, height]; } try { moduleBidFloor = bidRequest.getFloor({ diff --git a/test/spec/modules/insticatorBidAdapter_spec.js b/test/spec/modules/insticatorBidAdapter_spec.js index 071e2dfbfa5..489e213b0fa 100644 --- a/test/spec/modules/insticatorBidAdapter_spec.js +++ b/test/spec/modules/insticatorBidAdapter_spec.js @@ -583,6 +583,86 @@ describe('InsticatorBidAdapter', function () { expect(data.imp[0].bidfloorcur).to.equal('USD'); }); + it('should have bidder bidfloorcur from the request', function () { + const expectedFloor = 1.5; + const currency = 'USD'; + const tempBiddRequest = { + ...bidRequest, + params: { + ...bidRequest.params, + floor: 0.5, + currency: 'USD', + }, + } + tempBiddRequest.getFloor = () => ({ floor: expectedFloor, currency }) + + const requests = spec.buildRequests([tempBiddRequest], bidderRequest); + const data = JSON.parse(requests[0].data); + expect(data.imp[0].bidfloor).to.equal(1.5); + expect(data.imp[0].bidfloorcur).to.equal('USD'); + }); + + it('should have 1 floor for banner 300x250 and 1.5 for 300x600', function () { + const tempBiddRequest = { + ...bidRequest, + params: { + ...bidRequest.params, + }, + mediaTypes: { + banner: { + sizes: [[300, 250]], + format: [{ w: 300, h: 250 }] + }, + }, + } + tempBiddRequest.getFloor = (params) => { + return { floor: params.size[1] === 250 ? 1 : 1.5, currency: 'USD' } + } + + const requests = spec.buildRequests([tempBiddRequest], bidderRequest); + const data = JSON.parse(requests[0].data); + expect(data.imp[0].bidfloor).to.equal(1); + + tempBiddRequest.mediaTypes.banner.format = [ { w: 300, h: 600 }, + ]; + const request2 = spec.buildRequests([tempBiddRequest], bidderRequest); + const data2 = JSON.parse(request2[0].data); + expect(data2.imp[0].bidfloor).to.equal(1.5); + }); + + it('should have 4 floor for video 300x250 and 4.5 for 300x600', function () { + const tempBiddRequest = { + ...bidRequest, + params: { + ...bidRequest.params, + }, + mediaTypes: { + video: { + mimes: [ + 'video/mp4', + 'video/mpeg', + ], + w: 300, + h: 250, + placement: 2, + }, + }, + } + tempBiddRequest.getFloor = (params) => { + return { floor: params.size[1] === 250 ? 4 : 4.5, currency: 'USD' } + } + + const requests = spec.buildRequests([tempBiddRequest], bidderRequest); + const data = JSON.parse(requests[0].data); + expect(data.imp[0].bidfloor).to.equal(4); + + tempBiddRequest.mediaTypes.video.w = 300; + tempBiddRequest.mediaTypes.video.h = 600; + const request2 = spec.buildRequests([tempBiddRequest], bidderRequest); + const data2 = JSON.parse(request2[0].data); + expect(data2.imp[0].bidfloor).to.equal(4.5); + }); + it('should have sites first party data if present in bidderRequest ortb2', function () { bidderRequest = { ...bidderRequest, From 6f24776a4486ed200b906e2060a4d2fda292dadb Mon Sep 17 00:00:00 2001 From: shubhamc-ins Date: Thu, 23 May 2024 18:52:17 +0530 Subject: [PATCH 8/8] add logwarn for non usd floors --- modules/insticatorBidAdapter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index e2c8be01d95..bff74f0755b 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -179,6 +179,7 @@ function buildImpression(bidRequest) { if (bidfloorcur && bidfloorcur !== 'USD') { delete imp.bidfloor; delete imp.bidfloorcur; + logWarn('insticator: bidfloorcur supported by insticator is USD only. ignoring bidfloor and bidfloorcur params'); } }