Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apply some updates to Valueimpression bid adapter #5356

Merged
merged 1 commit into from Jun 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
113 changes: 90 additions & 23 deletions modules/valueimpressionBidAdapter.js
@@ -1,8 +1,10 @@
import * as utils from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
const BIDDER_CODE = 'valueimpression';
const ENDPOINT = 'https://adapter.valueimpression.com/bid';
const USER_SYNC_URL = 'https://adapter.valueimpression.com/usersync';
const ENDPOINT = 'https://useast.quantumdex.io/auction/adapter';
const USER_SYNC_URL = 'https://sync.quantumdex.io/usersync/adapter';
var bySlotTargetKey = {};
var bySlotSizesCount = {}

export const spec = {
code: BIDDER_CODE,
Expand Down Expand Up @@ -33,19 +35,41 @@ export const spec = {
},

buildRequests: function (validBidRequests, bidderRequest) {
var bids = JSON.parse(JSON.stringify(validBidRequests))
const payload = {};

bids.forEach(bidReq => {
var targetKey = 0;
if (bySlotTargetKey[bidReq.adUnitCode] != undefined) {
targetKey = bySlotTargetKey[bidReq.adUnitCode];
} else {
var biggestSize = _getBiggestSize(bidReq.sizes);
if (biggestSize) {
if (bySlotSizesCount[biggestSize] != undefined) {
bySlotSizesCount[biggestSize]++
targetKey = bySlotSizesCount[biggestSize];
} else {
bySlotSizesCount[biggestSize] = 0;
targetKey = 0
}
}
}
bySlotTargetKey[bidReq.adUnitCode] = targetKey;
bidReq.targetKey = targetKey;
});

payload.device = {};
payload.device.ua = navigator.userAgent;
payload.device.height = window.innerHeight;
payload.device.width = window.innerWidth;
payload.device.height = window.top.innerHeight;
payload.device.width = window.top.innerWidth;
payload.device.dnt = _getDoNotTrack();
payload.device.language = navigator.language;

payload.site = {};
payload.site.id = validBidRequests[0].params.siteId;
payload.site.page = window.location.href;
payload.site.referrer = document.referrer;
payload.site.hostname = window.location.hostname;
payload.site.id = bids[0].params.siteId;
payload.site.page = _extractTopWindowUrlFromBidderRequest(bidderRequest);
payload.site.referrer = _extractTopWindowReferrerFromBidderRequest(bidderRequest);
payload.site.hostname = window.top.location.hostname;

// Apply GDPR parameters to request.
payload.gdpr = {};
Expand All @@ -55,21 +79,23 @@ export const spec = {
payload.gdpr.consentString = bidderRequest.gdprConsent.consentString;
}
}
if (validBidRequests[0].schain) {
payload.schain = JSON.stringify(validBidRequests[0].schain)
// Apply schain.
if (bids[0].schain) {
payload.schain = JSON.stringify(bids[0].schain)
}
// Apply us_privacy.
if (bidderRequest && bidderRequest.uspConsent) {
payload.us_privacy = bidderRequest.uspConsent;
}

payload.bids = validBidRequests;
payload.bids = bids;

return {
method: 'POST',
url: ENDPOINT,
data: payload,
withCredentials: true,
bidderRequests: validBidRequests
bidderRequests: bids
};
},
interpretResponse: function (serverResponse, bidRequest) {
Expand Down Expand Up @@ -125,21 +151,26 @@ export const spec = {
}
} catch (e) { }
return syncs;
},

onTimeout: function (timeoutData) {
},

onBidWon: function (bid) {
},

onSetTargeting: function (bid) {
}
};

function _getBiggestSize(sizes) {
if (sizes.length <= 0) return false
var acreage = 0;
var index = 0;
for (var i = 0; i < sizes.length; i++) {
var currentAcreage = sizes[i][0] * sizes[i][1];
if (currentAcreage >= acreage) {
acreage = currentAcreage;
index = i;
}
}
return sizes[index][0] + 'x' + sizes[index][1];
}

function _getDoNotTrack() {
if (window.doNotTrack || navigator.doNotTrack || navigator.msDoNotTrack) {
if (window.doNotTrack == '1' || navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') {
if (window.top.doNotTrack || navigator.doNotTrack || navigator.msDoNotTrack) {
if (window.top.doNotTrack == '1' || navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') {
return 1;
} else {
return 0;
Expand All @@ -149,4 +180,40 @@ function _getDoNotTrack() {
}
}

/**
* Extracts the page url from given bid request or use the (top) window location as fallback
*
* @param {*} bidderRequest
* @returns {string}
*/
function _extractTopWindowUrlFromBidderRequest(bidderRequest) {
if (bidderRequest && utils.deepAccess(bidderRequest, 'refererInfo.canonicalUrl')) {
return bidderRequest.refererInfo.canonicalUrl;
}

try {
return window.top.location.href;
} catch (e) {
return window.location.href;
}
}

/**
* Extracts the referrer from given bid request or use the (top) document referrer as fallback
*
* @param {*} bidderRequest
* @returns {string}
*/
function _extractTopWindowReferrerFromBidderRequest(bidderRequest) {
if (bidderRequest && utils.deepAccess(bidderRequest, 'refererInfo.referer')) {
return bidderRequest.refererInfo.referer;
}

try {
return window.top.document.referrer;
} catch (e) {
return window.document.referrer;
}
}

registerBidder(spec);
2 changes: 1 addition & 1 deletion modules/valueimpressionBidAdapter.md
Expand Up @@ -3,7 +3,7 @@
```
Module Name: Valueimpression Bidder Adapter
Module Type: Bidder Adapter
Maintainer: thuyhq@83.com.vn
Maintainer: k.vision@valueimpression.com
```

# Description
Expand Down
18 changes: 10 additions & 8 deletions test/spec/modules/valueimpressionBidAdapter_spec.js
Expand Up @@ -202,6 +202,7 @@ describe('ValueimpressionBidAdapter', function () {
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'targetKey': 0,
'bidId': '30b31c1838de1f',
},
{
Expand All @@ -213,6 +214,7 @@ describe('ValueimpressionBidAdapter', function () {
},
'adUnitCode': 'adunit-code-2',
'sizes': [[120, 600], [300, 600], [160, 600]],
'targetKey': 1,
'bidId': '30b31c1838de1e',
}];

Expand All @@ -233,14 +235,14 @@ describe('ValueimpressionBidAdapter', function () {

it('should return a properly formatted request', function () {
const bidRequests = spec.buildRequests(bidRequest, bidderRequests)
expect(bidRequests.url).to.equal('https://adapter.valueimpression.com/bid')
expect(bidRequests.url).to.equal('https://useast.quantumdex.io/auction/adapter')
expect(bidRequests.method).to.equal('POST')
expect(bidRequests.bidderRequests).to.eql(bidRequest);
})

it('should return a properly formatted request with GDPR applies set to true', function () {
const bidRequests = spec.buildRequests(bidRequest, bidderRequests)
expect(bidRequests.url).to.equal('https://adapter.valueimpression.com/bid')
expect(bidRequests.url).to.equal('https://useast.quantumdex.io/auction/adapter')
expect(bidRequests.method).to.equal('POST')
expect(bidRequests.data.gdpr.gdprApplies).to.equal('true')
expect(bidRequests.data.gdpr.consentString).to.equal('BOJ/P2HOJ/P2HABABMAAAAAZ+A==')
Expand All @@ -249,7 +251,7 @@ describe('ValueimpressionBidAdapter', function () {
it('should return a properly formatted request with GDPR applies set to false', function () {
bidderRequests.gdprConsent.gdprApplies = false;
const bidRequests = spec.buildRequests(bidRequest, bidderRequests)
expect(bidRequests.url).to.equal('https://adapter.valueimpression.com/bid')
expect(bidRequests.url).to.equal('https://useast.quantumdex.io/auction/adapter')
expect(bidRequests.method).to.equal('POST')
expect(bidRequests.data.gdpr.gdprApplies).to.equal('false')
expect(bidRequests.data.gdpr.consentString).to.equal('BOJ/P2HOJ/P2HABABMAAAAAZ+A==')
Expand All @@ -269,7 +271,7 @@ describe('ValueimpressionBidAdapter', function () {
}
};
const bidRequests = spec.buildRequests(bidRequest, bidderRequests)
expect(bidRequests.url).to.equal('https://adapter.valueimpression.com/bid')
expect(bidRequests.url).to.equal('https://useast.quantumdex.io/auction/adapter')
expect(bidRequests.method).to.equal('POST')
expect(bidRequests.data.gdpr.gdprApplies).to.equal('false')
expect(bidRequests.data.gdpr).to.not.include.keys('consentString')
Expand All @@ -289,7 +291,7 @@ describe('ValueimpressionBidAdapter', function () {
}
};
const bidRequests = spec.buildRequests(bidRequest, bidderRequests)
expect(bidRequests.url).to.equal('https://adapter.valueimpression.com/bid')
expect(bidRequests.url).to.equal('https://useast.quantumdex.io/auction/adapter')
expect(bidRequests.method).to.equal('POST')
expect(bidRequests.data.gdpr.gdprApplies).to.equal('true')
expect(bidRequests.data.gdpr).to.not.include.keys('consentString')
Expand All @@ -307,7 +309,7 @@ describe('ValueimpressionBidAdapter', function () {
describe('.interpretResponse', function () {
const bidRequests = {
'method': 'POST',
'url': 'https://adapter.valueimpression.com/bid',
'url': 'https://useast.quantumdex.io/auction/adapter',
'withCredentials': true,
'data': {
'device': {
Expand All @@ -319,9 +321,9 @@ describe('ValueimpressionBidAdapter', function () {
},
'site': {
'id': '343',
'page': 'https://www.includehelp.com/?pbjs_debug=true',
'page': 'https://www.example.com/tutorial',
'referrer': '',
'hostname': 'www.includehelp.com'
'hostname': 'www.example.com'
}
},
'bidderRequests': [
Expand Down