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

Visx bid adapter: import utilities and retrieve data from user on ortb2 #11860

12 changes: 12 additions & 0 deletions libraries/processResponse/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { logError } from '../../src/utils.js';

export function getBidFromResponse(respItem, LOG_ERROR_MESS) {
if (!respItem) {
logError(LOG_ERROR_MESS.emptySeatbid);
} else if (!respItem.bid) {
logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
} else if (!respItem.bid[0]) {
logError(LOG_ERROR_MESS.noBid);
}
return respItem && respItem.bid && respItem.bid[0];
}
11 changes: 3 additions & 8 deletions modules/carodaBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import {
deepSetValue,
logError,
mergeDeep,
parseSizesInput
sizeTupleToRtbSize,
sizesToSizeTuples
} from '../src/utils.js';
import { config } from '../src/config.js';

Expand Down Expand Up @@ -195,13 +196,7 @@ function getImps (validBidRequests, common) {
};
const bannerParams = deepAccess(bid, 'mediaTypes.banner');
if (bannerParams && bannerParams.sizes) {
const sizes = parseSizesInput(bannerParams.sizes);
const format = sizes.map(size => {
const [width, height] = size.split('x');
const w = parseInt(width, 10);
const h = parseInt(height, 10);
return { w, h };
});
const format = sizesToSizeTuples(bannerParams.sizes).map(sizeTupleToRtbSize);
imp.banner = {
format
};
Expand Down
14 changes: 2 additions & 12 deletions modules/gridBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { Renderer } from '../src/Renderer.js';
import { VIDEO, BANNER } from '../src/mediaTypes.js';
import { config } from '../src/config.js';
import { getStorageManager } from '../src/storageManager.js';
import { getBidFromResponse } from '../libraries/processResponse/index.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -441,7 +442,7 @@ export const spec = {

if (!errorMessage && serverResponse.seatbid) {
serverResponse.seatbid.forEach(respItem => {
_addBidResponse(_getBidFromResponse(respItem), bidRequest, bidResponses, RendererConst, bidderCode);
_addBidResponse(getBidFromResponse(respItem, LOG_ERROR_MESS), bidRequest, bidResponses, RendererConst, bidderCode);
});
}
if (errorMessage) logError(errorMessage);
Expand Down Expand Up @@ -512,17 +513,6 @@ function _getFloor (mediaTypes, bid) {
return floor;
}

function _getBidFromResponse(respItem) {
if (!respItem) {
logError(LOG_ERROR_MESS.emptySeatbid);
} else if (!respItem.bid) {
logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
} else if (!respItem.bid[0]) {
logError(LOG_ERROR_MESS.noBid);
}
return respItem && respItem.bid && respItem.bid[0];
}

function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bidderCode) {
if (!serverBid) return;
let errorMessage;
Expand Down
14 changes: 4 additions & 10 deletions modules/luponmediaBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import {
logError,
logMessage,
logWarn,
parseSizesInput
parseSizesInput,
sizeTupleToRtbSize,
sizesToSizeTuples
} from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {config} from '../src/config.js';
Expand Down Expand Up @@ -271,16 +273,8 @@ function newOrtbBidRequest(bidRequest, bidderRequest, currentImps) {
let bannerSizes = [];

if (bannerParams && bannerParams.sizes) {
const sizes = parseSizesInput(bannerParams.sizes);

// get banner sizes in form [{ w: <int>, h: <int> }, ...]
const format = sizes.map(size => {
const [ width, height ] = size.split('x');
const w = parseInt(width, 10);
const h = parseInt(height, 10);
return { w, h };
});

const format = sizesToSizeTuples(bannerParams.sizes).map(sizeTupleToRtbSize);
bannerSizes = format;
}

Expand Down
56 changes: 27 additions & 29 deletions modules/visxBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {deepAccess, logError, parseSizesInput, triggerPixel} from '../src/utils.js';
import {deepAccess, logError, mergeDeep, parseSizesInput, sizeTupleToRtbSize, sizesToSizeTuples, triggerPixel} from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {config} from '../src/config.js';
import {BANNER, VIDEO} from '../src/mediaTypes.js';
import {INSTREAM as VIDEO_INSTREAM} from '../src/video.js';
import {getStorageManager} from '../src/storageManager.js';
import {getGptSlotInfoForAdUnitCode} from '../libraries/gptUtils/gptUtils.js';
import { getBidFromResponse } from '../libraries/processResponse/index.js';

const BIDDER_CODE = 'visx';
const GVLID = 154;
Expand Down Expand Up @@ -69,6 +70,7 @@ export const spec = {
let payloadSite;
let payloadRegs;
let payloadContent;
let payloadUser;

if (currencyWhiteList.indexOf(currency) === -1) {
logError(LOG_ERROR_MESS.notAllowedCurrency + currency);
Expand Down Expand Up @@ -116,6 +118,24 @@ export const spec = {

const { ortb2 } = bidderRequest;
const { device, site, regs, content } = ortb2;
const userOrtb2 = ortb2.user;
let user;
let userReq;
const vads = _getUserId();
if (payloadUserEids || payload.gdpr_consent || vads) {
user = {
ext: {
...(payloadUserEids && { eids: payloadUserEids }),
...(payload.gdpr_consent && { consent: payload.gdpr_consent }),
...(vads && { vads })
}
};
}
if (user) {
userReq = mergeDeep(user, userOrtb2);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please cover this behavior in a test so you can be confident it will not break. Thanks!

} else {
userReq = userOrtb2;
}
if (device) {
payloadDevice = device;
}
Expand All @@ -128,6 +148,9 @@ export const spec = {
if (content) {
payloadContent = content;
}
if (userReq) {
payloadUser = userReq;
}
}

const tmax = timeout;
Expand All @@ -139,14 +162,6 @@ export const spec = {
}
};

const vads = _getUserId();
const user = {
ext: {
...(payloadUserEids && { eids: payloadUserEids }),
...(payload.gdpr_consent && { consent: payload.gdpr_consent }),
...(vads && { vads })
}
};
if (payloadRegs === undefined) {
payloadRegs = ('gdpr_applies' in payload) && {
ext: {
Expand All @@ -161,7 +176,7 @@ export const spec = {
tmax,
cur: [currency],
source,
...(Object.keys(user.ext).length && { user }),
...(payloadUser && { user: payloadUser }),
...(payloadRegs && {regs: payloadRegs}),
...(payloadDevice && { device: payloadDevice }),
...(payloadSite && { site: payloadSite }),
Expand Down Expand Up @@ -190,7 +205,7 @@ export const spec = {

if (!errorMessage && serverResponse.seatbid) {
serverResponse.seatbid.forEach(respItem => {
_addBidResponse(_getBidFromResponse(respItem), bidsMap, currency, bidResponses);
_addBidResponse(getBidFromResponse(respItem, LOG_ERROR_MESS), bidsMap, currency, bidResponses);
});
}
if (errorMessage) logError(errorMessage);
Expand Down Expand Up @@ -260,13 +275,7 @@ function makeBanner(bannerParams) {
if (bannerSizes) {
const sizes = parseSizesInput(bannerSizes);
if (sizes.length) {
const format = sizes.map(size => {
const [ width, height ] = size.split('x');
const w = parseInt(width, 10);
const h = parseInt(height, 10);
return { w, h };
});

const format = sizesToSizeTuples(bannerSizes).map(sizeTupleToRtbSize);
return { format };
}
}
Expand Down Expand Up @@ -306,17 +315,6 @@ function buildImpObject(bid) {
}
}

function _getBidFromResponse(respItem) {
if (!respItem) {
logError(LOG_ERROR_MESS.emptySeatbid);
} else if (!respItem.bid) {
logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
} else if (!respItem.bid[0]) {
logError(LOG_ERROR_MESS.noBid);
}
return respItem && respItem.bid && respItem.bid[0];
}

function _addBidResponse(serverBid, bidsMap, currency, bidResponses) {
if (!serverBid) return;
let errorMessage;
Expand Down
60 changes: 60 additions & 0 deletions test/spec/libraries/processResponse_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { getBidFromResponse } from '../../../libraries/processResponse/index.js';
import {expect} from 'chai/index.js';

describe('processResponse', function () {
const respItem = {
'bid': [
{
'price': 0.504,
'ext': {
'visx': {
'events': {
'runtime': '//t.visx.net/track/status/RFTFjZflStSUyuXuyT2IKOZMVPUIiPkzebpPWYwKvNkE_IybYfFxk2P5feBnt9LhiR7291KTG11JjrnyHyhVKfolH_VRCmGppbnHXHfHJ9AgNqjhFB_yTg3m18wGO9k4LOddGAg3mk8qc5zYEIzNsPFnZzos1EkHh5WNs0EjrBpwCgTERUqM3PJD_Zy60nMDA-LCuq-Z4JNBGC_GHx4LwvwXipQsjdGHS-HkqHHf9sES45OlRrW4wMf69dsmey1gvwqFAhJwii2lzo9wfOohLCMRa3Vxd-zvzx-uw71maWOyKnJXWiP6c5xkyrfV4gukNYaDUgrHc0mA0yhqyiHxe8KzEl32rxQXJRCg4FoJcJ1g9jmpZQBnIh2QrKm5iC159elwzwf31_v3Uw97Zpek8j0CCLa8FjxSjvXm1Mq8x4jcwlt0ngfWU6WwyyKwX_GMbKWuAL_nrfxSvs1hZCb4eunEFyXb2lN2olWo8ezMEzZ8YRxF_mx0hDB3NXyV0Tb4b6KXQq7tvxV-1rKPRt7DySRTbLPht0hO3mjTHxutfihnuL6ROEr372gSAiDodnbdCq_lPsCsUSEpG7DmN-4In10uSp2MemjfbqI6tllOCO-j6Pm9mhdl_rT4anHmRG2DG_dLsfD7pLaAsgf2zl2bpawhxxLVjTxikoWjNKAvr_GNh4adHGj5EHbqaBaHovB573Yk-koHkyBNrebeiy-1-Knc28MWOpFi9XKjNsXx756jAXLx2H098ptaXF3mFiuT2Iv6sTVjqOI/{STATUS_CODE}'
}
},
'prebid': {
'events': {
'pending': '//t.visx.net/track/pending/RFTFjZflStSUyuXuyT2IKOZMVPUIiPkzebpPWYwKvNkE_IybYfFxk2P5feBnt9LhiR7291KTG11JjrnyHyhVKfolH_VRCmGppbnHXHfHJ9AgNqjhFB_yTg3m18wGO9k4LOddGAg3mk8qc5zYEIzNsPFnZzos1EkHh5WNs0EjrBpwCgTERUqM3PJD_Zy60nMDA-LCuq-Z4JNBGC_GHx4LwvwXipQsjdGHS-HkqHHf9sES45OlRrW4wMf69dsmey1gvwqFAhJwii2lzo9wfOohLCMRa3Vxd-zvzx-uw71maWOyKnJXWiP6c5xkyrfV4gukNYaDUgrHc0mA0yhqyiHxe8KzEl32rxQXJRCg4FoJcJ1g9jmpZQBnIh2QrKm5iC159elwzwf31_v3Uw97Zpek8j0CCLa8FjxSjvXm1Mq8x4jcwlt0ngfWU6WwyyKwX_GMbKWuAL_nrfxSvs1hZCb4eunEFyXb2lN2olWo8ezMEzZ8YRxF_mx0hDB3NXyV0Tb4b6KXQq7tvxV-1rKPRt7DySRTbLPht0hO3mjTHxutfihnuL6ROEr372gSAiDodnbdCq_lPsCsUSEpG7DmN-4In10uSp2MemjfbqI6tllOCO-j6Pm9mhdl_rT4anHmRG2DG_dLsfD7pLaAsgf2zl2bpawhxxLVjTxikoWjNKAvr_GNh4adHGj5EHbqaBaHovB573Yk-koHkyBNrebeiy-1-Knc28MWOpFi9XKjNsXx756jAXLx2H098ptaXF3mFiuT2Iv6sTVjqOI/',
'win': '//t.visx.net/track/win/RFTFjZflStSUyuXuyT2IKOZMVPUIiPkzebpPWYwKvNkE_IybYfFxk2P5feBnt9LhiR7291KTG11JjrnyHyhVKfolH_VRCmGppbnHXHfHJ9AgNqjhFB_yTg3m18wGO9k4LOddGAg3mk8qc5zYEIzNsPFnZzos1EkHh5WNs0EjrBpwCgTERUqM3PJD_Zy60nMDA-LCuq-Z4JNBGC_GHx4LwvwXipQsjdGHS-HkqHHf9sES45OlRrW4wMf69dsmey1gvwqFAhJwii2lzo9wfOohLCMRa3Vxd-zvzx-uw71maWOyKnJXWiP6c5xkyrfV4gukNYaDUgrHc0mA0yhqyiHxe8KzEl32rxQXJRCg4FoJcJ1g9jmpZQBnIh2QrKm5iC159elwzwf31_v3Uw97Zpek8j0CCLa8FjxSjvXm1Mq8x4jcwlt0ngfWU6WwyyKwX_GMbKWuAL_nrfxSvs1hZCb4eunEFyXb2lN2olWo8ezMEzZ8YRxF_mx0hDB3NXyV0Tb4b6KXQq7tvxV-1rKPRt7DySRTbLPht0hO3mjTHxutfihnuL6ROEr372gSAiDodnbdCq_lPsCsUSEpG7DmN-4In10uSp2MemjfbqI6tllOCO-j6Pm9mhdl_rT4anHmRG2DG_dLsfD7pLaAsgf2zl2bpawhxxLVjTxikoWjNKAvr_GNh4adHGj5EHbqaBaHovB573Yk-koHkyBNrebeiy-1-Knc28MWOpFi9XKjNsXx756jAXLx2H098ptaXF3mFiuT2Iv6sTVjqOI/',
'bid_timeout': '//t.visx.net/track/bid_timeout/RFTFjZflStSUyuXuyT2IKOZMVPUIiPkzebpPWYwKvNkE_IybYfFxk2P5feBnt9LhiR7291KTG11JjrnyHyhVKfolH_VRCmGppbnHXHfHJ9AgNqjhFB_yTg3m18wGO9k4LOddGAg3mk8qc5zYEIzNsPFnZzos1EkHh5WNs0EjrBpwCgTERUqM3PJD_Zy60nMDA-LCuq-Z4JNBGC_GHx4LwvwXipQsjdGHS-HkqHHf9sES45OlRrW4wMf69dsmey1gvwqFAhJwii2lzo9wfOohLCMRa3Vxd-zvzx-uw71maWOyKnJXWiP6c5xkyrfV4gukNYaDUgrHc0mA0yhqyiHxe8KzEl32rxQXJRCg4FoJcJ1g9jmpZQBnIh2QrKm5iC159elwzwf31_v3Uw97Zpek8j0CCLa8FjxSjvXm1Mq8x4jcwlt0ngfWU6WwyyKwX_GMbKWuAL_nrfxSvs1hZCb4eunEFyXb2lN2olWo8ezMEzZ8YRxF_mx0hDB3NXyV0Tb4b6KXQq7tvxV-1rKPRt7DySRTbLPht0hO3mjTHxutfihnuL6ROEr372gSAiDodnbdCq_lPsCsUSEpG7DmN-4In10uSp2MemjfbqI6tllOCO-j6Pm9mhdl_rT4anHmRG2DG_dLsfD7pLaAsgf2zl2bpawhxxLVjTxikoWjNKAvr_GNh4adHGj5EHbqaBaHovB573Yk-koHkyBNrebeiy-1-Knc28MWOpFi9XKjNsXx756jAXLx2H098ptaXF3mFiuT2Iv6sTVjqOI/',
'runtime': '//t.visx.net/track/status/RFTFjZflStSUyuXuyT2IKOZMVPUIiPkzebpPWYwKvNkE_IybYfFxk2P5feBnt9LhiR7291KTG11JjrnyHyhVKfolH_VRCmGppbnHXHfHJ9AgNqjhFB_yTg3m18wGO9k4LOddGAg3mk8qc5zYEIzNsPFnZzos1EkHh5WNs0EjrBpwCgTERUqM3PJD_Zy60nMDA-LCuq-Z4JNBGC_GHx4LwvwXipQsjdGHS-HkqHHf9sES45OlRrW4wMf69dsmey1gvwqFAhJwii2lzo9wfOohLCMRa3Vxd-zvzx-uw71maWOyKnJXWiP6c5xkyrfV4gukNYaDUgrHc0mA0yhqyiHxe8KzEl32rxQXJRCg4FoJcJ1g9jmpZQBnIh2QrKm5iC159elwzwf31_v3Uw97Zpek8j0CCLa8FjxSjvXm1Mq8x4jcwlt0ngfWU6WwyyKwX_GMbKWuAL_nrfxSvs1hZCb4eunEFyXb2lN2olWo8ezMEzZ8YRxF_mx0hDB3NXyV0Tb4b6KXQq7tvxV-1rKPRt7DySRTbLPht0hO3mjTHxutfihnuL6ROEr372gSAiDodnbdCq_lPsCsUSEpG7DmN-4In10uSp2MemjfbqI6tllOCO-j6Pm9mhdl_rT4anHmRG2DG_dLsfD7pLaAsgf2zl2bpawhxxLVjTxikoWjNKAvr_GNh4adHGj5EHbqaBaHovB573Yk-koHkyBNrebeiy-1-Knc28MWOpFi9XKjNsXx756jAXLx2H098ptaXF3mFiuT2Iv6sTVjqOI/{STATUS_CODE}'
},
'meta': {
'mediaType': 'banner'
}
}
},
'impid': '2b642c27bdcf8f',
'auid': 929004,
'h': 250,
'cur': 'EUR',
'adomain': [
''
],
'w': 300,
'id': '9b6c7e04-0a09-4add-8ba9-0c8b98304de3'
}
],
'seat': '1429601'
};
const LOG_ERROR_MESS = {
'noAuid': 'Bid from response has no auid parameter - ',
'noAdm': 'Bid from response has no adm parameter - ',
'noBid': 'Array of bid objects is empty',
'noImpId': 'Bid from response has no impid parameter - ',
'noPlacementCode': 'Can\'t find in requested bids the bid with auid - ',
'emptyUids': 'Uids should not be empty',
'emptySeatbid': 'Seatbid array from response has an empty item',
'emptyResponse': 'Response is empty',
'hasEmptySeatbidArray': 'Response has empty seatbid array',
'hasNoArrayOfBids': 'Seatbid from response has no array of bid objects - ',
'notAllowedCurrency': 'Currency is not supported - ',
'currencyMismatch': 'Currency from the request is not match currency from the response - ',
'onlyVideoInstream': 'Only video instream supported',
'videoMissing': 'Bid request videoType property is missing - '
};
it('returns bid when respItem and LOG_ERROR_MESS is passed', function () {
let response = getBidFromResponse(respItem, LOG_ERROR_MESS);
expect(response).not.include.any.keys('emptyResponse', 'hasNoArrayOfBids', 'emptySeatbid');
});
});
Loading
Loading