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

Various bid adapters: Currency config cleanup #12102

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions libraries/ortb2Utils/currency.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const additionalData = new WeakMap();

export function getCurrencyFromBidderRequest(bidderRequest) {
return (bidderRequest?.ortb2?.ext?.cur || [])[0];
}

export function setAdditionalData(obj, key, value) {
Copy link
Collaborator

@dgirardi dgirardi Aug 8, 2024

Choose a reason for hiding this comment

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

if these are only used for adserverCurrency, they'd be better as set/getAdServerCurrency (they are in a currency library after all, unlikely/unsuitable to be used for anything else).

But if they are only used for one adapter, I don't think they're needed at all - the adapter itself can maintain the map.

const prevValue = additionalData.get(obj) || {};
additionalData.set(obj, { ...prevValue, [key]: value });
}

export function getAdditionalData(obj, key) {
const data = additionalData.get(obj) || {};
return data[key];
}
3 changes: 2 additions & 1 deletion modules/adfBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
import {deepAccess, deepClone, deepSetValue, mergeDeep, parseSizesInput, setOnAny} from '../src/utils.js';
import {config} from '../src/config.js';
import {Renderer} from '../src/Renderer.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';

const { getConfig } = config;

Expand Down Expand Up @@ -60,7 +61,7 @@ export const spec = {
const pt = setOnAny(validBidRequests, 'params.pt') || setOnAny(validBidRequests, 'params.priceType') || 'net';
const tid = bidderRequest.ortb2?.source?.tid;
const test = setOnAny(validBidRequests, 'params.test');
const currency = getConfig('currency.adServerCurrency');
const currency = getCurrencyFromBidderRequest(bidderRequest);
const cur = currency && [ currency ];
const eids = setOnAny(validBidRequests, 'userIdAsEids');
const schain = setOnAny(validBidRequests, 'schain');
Expand Down
27 changes: 14 additions & 13 deletions modules/adgenerationBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {deepAccess, getBidIdParameter} from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER, NATIVE} from '../src/mediaTypes.js';
import {config} from '../src/config.js';
import {convertOrtbRequestToProprietaryNative} from '../src/native.js';
import {tryAppendQueryString} from '../libraries/urlUtils/urlUtils.js';
import {escapeUnsafeChars} from '../libraries/htmlEscape/htmlEscape.js';
import { escapeUnsafeChars } from '../libraries/htmlEscape/htmlEscape.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { tryAppendQueryString } from '../libraries/urlUtils/urlUtils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER, NATIVE } from '../src/mediaTypes.js';
import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
import { deepAccess, getBidIdParameter } from '../src/utils.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -61,7 +61,7 @@ export const spec = {
data = tryAppendQueryString(data, 't', 'json3');
data = tryAppendQueryString(data, 'transactionid', validReq.ortb2Imp?.ext?.tid);
data = tryAppendQueryString(data, 'sizes', getSizes(validReq));
data = tryAppendQueryString(data, 'currency', getCurrencyType());
data = tryAppendQueryString(data, 'currency', getCurrencyType(bidderRequest));
data = tryAppendQueryString(data, 'pbver', '$prebid.version$');
data = tryAppendQueryString(data, 'sdkname', 'prebidjs');
data = tryAppendQueryString(data, 'adapterver', ADGENE_PREBID_VERSION);
Expand Down Expand Up @@ -94,7 +94,8 @@ export const spec = {
method: 'GET',
url: url,
data: data,
bidRequest: validBidRequests[i]
bidRequest: validBidRequests[i],
bidderRequest
});
}
return serverRequests;
Expand All @@ -119,7 +120,7 @@ export const spec = {
height: body.h ? body.h : 1,
creativeId: body.creativeid || '',
dealId: body.dealid || '',
currency: getCurrencyType(),
currency: getCurrencyFromBidderRequest(bidRequests.bidderRequest),
netRevenue: true,
ttl: body.ttl || 10,
};
Expand Down Expand Up @@ -304,9 +305,9 @@ function getSizes(validReq) {
/**
* @return {?string} USD or JPY
*/
function getCurrencyType() {
if (config.getConfig('currency.adServerCurrency') && config.getConfig('currency.adServerCurrency').toUpperCase() === 'USD') return 'USD';
return 'JPY';
function getCurrencyType(bidderRequest) {
const adServerCurrency = getCurrencyFromBidderRequest(bidderRequest) || ''
return adServerCurrency.toUpperCase() === 'USD' ? 'USD' : 'JPY'
}

/**
Expand Down
10 changes: 5 additions & 5 deletions modules/admaticBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {getValue, formatQS, logError, deepAccess, isArray, getBidIdParameter} from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER, VIDEO, NATIVE } from '../src/mediaTypes.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { Renderer } from '../src/Renderer.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
import { deepAccess, formatQS, getBidIdParameter, getValue, isArray, logError } from '../src/utils.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -73,7 +73,7 @@ export const spec = {
const ortb = bidderRequest.ortb2;
const networkId = getValue(validBidRequests[0].params, 'networkId');
const host = getValue(validBidRequests[0].params, 'host');
const currency = config.getConfig('currency.adServerCurrency') || 'TRY';
const currency = getCurrencyFromBidderRequest(bidderRequest) || 'TRY';
const bidderName = validBidRequests[0].bidder;

const payload = {
Expand Down
17 changes: 9 additions & 8 deletions modules/adotBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import {Renderer} from '../src/Renderer.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
import {isArray, isBoolean, isFn, isPlainObject, isStr, logError, replaceAuctionPrice} from '../src/utils.js';
import {find} from '../src/polyfill.js';
import {config} from '../src/config.js';
import {OUTSTREAM} from '../src/video.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { Renderer } from '../src/Renderer.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
import { find } from '../src/polyfill.js';
import { isArray, isBoolean, isFn, isPlainObject, isStr, logError, replaceAuctionPrice } from '../src/utils.js';
import { OUTSTREAM } from '../src/video.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -287,7 +288,7 @@ function buildImpFromAdUnit(adUnit, bidderRequest) {
if (!mediaType) return null;

const media = IMP_BUILDER[mediaType](mediaTypes[mediaType], bidderRequest, adUnit)
const currency = config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY;
const currency = getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CURRENCY;
const bidfloor = getMainFloor(adUnit, media.format, mediaType, currency);

return {
Expand Down
9 changes: 5 additions & 4 deletions modules/audiencerunBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER } from '../src/mediaTypes.js';
import {
_each,
deepAccess,
Expand All @@ -8,9 +12,6 @@ import {
logError,
triggerPixel,
} from '../src/utils.js';
import {config} from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER} from '../src/mediaTypes.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -136,7 +137,7 @@ export const spec = {
referer: deepAccess(bidderRequest, 'refererInfo.topmostLocation'),
// TODO: please do not send internal data structures over the network
refererInfo: deepAccess(bidderRequest, 'refererInfo.legacy'),
currencyCode: config.getConfig('currency.adServerCurrency'),
currencyCode: getCurrencyFromBidderRequest(bidderRequest),
timeout: config.getConfig('bidderTimeout'),
bids,
};
Expand Down
14 changes: 7 additions & 7 deletions modules/beopBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { getAllOrtbKeywords } from '../libraries/keywords/keywords.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { getRefererInfo } from '../src/refererDetection.js';
import {
buildUrl,
deepAccess, getBidIdParameter,
Expand All @@ -7,10 +11,6 @@ import {
logWarn,
triggerPixel
} from '../src/utils.js';
import {getRefererInfo} from '../src/refererDetection.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {config} from '../src/config.js';
import {getAllOrtbKeywords} from '../libraries/keywords/keywords.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid
Expand Down Expand Up @@ -52,7 +52,7 @@ export const spec = {
* @return ServerRequest Info describing the request to the BeOp's server
*/
buildRequests: function(validBidRequests, bidderRequest) {
const slots = validBidRequests.map(beOpRequestSlotsMaker);
const slots = validBidRequests.map((bid) => beOpRequestSlotsMaker(bid, bidderRequest));
const firstPartyData = bidderRequest.ortb2 || {};
const psegs = firstPartyData.user?.ext?.permutive || firstPartyData.user?.ext?.data?.permutive || [];
const userBpSegs = firstPartyData.user?.ext?.bpsegs || firstPartyData.user?.ext?.data?.bpsegs || [];
Expand Down Expand Up @@ -142,9 +142,9 @@ function buildTrackingParams(data, info, value) {
};
}

function beOpRequestSlotsMaker(bid) {
function beOpRequestSlotsMaker(bid, bidderRequest) {
const bannerSizes = deepAccess(bid, 'mediaTypes.banner.sizes');
const publisherCurrency = config.getConfig('currency.adServerCurrency') || getValue(bid.params, 'currency') || 'EUR';
const publisherCurrency = getCurrencyFromBidderRequest(bidderRequest) || getValue(bid.params, 'currency') || 'EUR';
let floor;
if (typeof bid.getFloor === 'function') {
const floorInfo = bid.getFloor({currency: publisherCurrency, mediaType: 'banner', size: [1, 1]});
Expand Down
5 changes: 3 additions & 2 deletions modules/carodaBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
// jshint esversion: 6, es3: false, node: true
'use strict'

import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';
import {
deepAccess,
Expand All @@ -11,7 +13,6 @@ import {
sizeTupleToRtbSize,
sizesToSizeTuples
} from '../src/utils.js';
import { config } from '../src/config.js';

const { getConfig } = config;

Expand Down Expand Up @@ -45,7 +46,7 @@ export const spec = {
getFirstWithKey(validBidRequests, 'params.priceType') ||
'net';
const test = getFirstWithKey(validBidRequests, 'params.test');
const currency = getConfig('currency.adServerCurrency');
const currency = getCurrencyFromBidderRequest(bidderRequest);
const eids = getFirstWithKey(validBidRequests, 'userIdAsEids');
const schain = getFirstWithKey(validBidRequests, 'schain');
const request = {
Expand Down
3 changes: 2 additions & 1 deletion modules/cointrafficBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { parseSizesInput, logError, isEmpty } from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js'
import { config } from '../src/config.js'
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -45,7 +46,7 @@ export const spec = {
const sizes = parseSizesInput(bidRequest.params.size || bidRequest.sizes);
const currency =
config.getConfig(`currency.bidderCurrencyDefault.${BIDDER_CODE}`) ||
config.getConfig('currency.adServerCurrency') ||
getCurrencyFromBidderRequest(bidderRequest) ||
DEFAULT_CURRENCY;

if (ALLOWED_CURRENCIES.indexOf(currency) === -1) {
Expand Down
16 changes: 13 additions & 3 deletions modules/currency.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {logError, logInfo, logMessage, logWarn} from '../src/utils.js';
import {deepSetValue, logError, logInfo, logMessage, logWarn} from '../src/utils.js';
import {getGlobal} from '../src/prebidGlobal.js';
import { EVENTS, REJECTION_REASON } from '../src/constants.js';
import {ajax} from '../src/ajax.js';
Expand All @@ -8,6 +8,7 @@ import {defer} from '../src/utils/promise.js';
import {registerOrtbProcessor, REQUEST} from '../src/pbjsORTB.js';
import {timedBidResponseHook} from '../src/utils/perfMetrics.js';
import {on as onEvent, off as offEvent} from '../src/events.js';
import { enrichFPD } from '../src/fpd/enrichment.js';

const DEFAULT_CURRENCY_RATE_URL = 'https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json?date=$$TODAY$$';
const CURRENCY_RATE_PRECISION = 4;
Expand Down Expand Up @@ -162,16 +163,18 @@ function initCurrency() {
getGlobal().convertCurrency = (cpm, fromCurrency, toCurrency) => parseFloat(cpm) * getCurrencyConversion(fromCurrency, toCurrency);
getHook('addBidResponse').before(addBidResponseHook, 100);
getHook('responsesReady').before(responsesReadyHook);
enrichFPD.before(enrichFPDHook);
onEvent(EVENTS.AUCTION_TIMEOUT, rejectOnAuctionTimeout);
onEvent(EVENTS.AUCTION_INIT, loadRates);
loadRates();
}
}

function resetCurrency() {
export function resetCurrency() {
if (currencySupportEnabled) {
getHook('addBidResponse').getHooks({hook: addBidResponseHook}).remove();
getHook('responsesReady').getHooks({hook: responsesReadyHook}).remove();
enrichFPD.getHooks({hook: enrichFPDHook}).remove();
offEvent(EVENTS.AUCTION_TIMEOUT, rejectOnAuctionTimeout);
offEvent(EVENTS.AUCTION_INIT, loadRates);
delete getGlobal().convertCurrency;
Expand Down Expand Up @@ -334,4 +337,11 @@ export function setOrtbCurrency(ortbRequest, bidderRequest, context) {
}
}

registerOrtbProcessor({type: REQUEST, name: 'currency', fn: setOrtbCurrency});
registerOrtbProcessor({type: REQUEST, name: 'currency', fn: setOrtbCurrency, priority: 100});

function enrichFPDHook(next, fpd) {
return next(fpd.then(ortb2 => {
deepSetValue(ortb2, 'ext.cur', [adServerCurrency]);
return ortb2;
Copy link
Collaborator

Choose a reason for hiding this comment

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

ext.prebid.adserverCurrency is a better name I think - and it doesn't need to be an array

(ext.cur looks like just a misplaced cur. adserverCurrency makes it clearer what it is, and prebid makes it less likely to clash)

}))
}
12 changes: 6 additions & 6 deletions modules/deltaprojectsBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER} from '../src/mediaTypes.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
import {
_each,
_map,
Expand All @@ -11,7 +12,6 @@ import {
logWarn,
setOnAny
} from '../src/utils.js';
import {config} from '../src/config.js';

export const BIDDER_CODE = 'deltaprojects';
export const BIDDER_ENDPOINT_URL = 'https://d5p.de17a.com/dogfight/prebid';
Expand Down Expand Up @@ -74,7 +74,7 @@ function buildRequests(validBidRequests, bidderRequest) {

// build bid specific
return validBidRequests.map(validBidRequest => {
const openRTBRequest = buildOpenRTBRequest(validBidRequest, id, site, device, user, tmax, regs);
const openRTBRequest = buildOpenRTBRequest(validBidRequest, bidderRequest, id, site, device, user, tmax, regs);
return {
method: 'POST',
url: BIDDER_ENDPOINT_URL,
Expand All @@ -85,9 +85,9 @@ function buildRequests(validBidRequests, bidderRequest) {
});
}

function buildOpenRTBRequest(validBidRequest, id, site, device, user, tmax, regs) {
function buildOpenRTBRequest(validBidRequest, bidderRequest, id, site, device, user, tmax, regs) {
// build cur
const currency = config.getConfig('currency.adServerCurrency') || deepAccess(validBidRequest, 'params.currency');
const currency = getCurrencyFromBidderRequest(bidderRequest) || deepAccess(validBidRequest, 'params.currency');
const cur = currency && [currency];

// build impression
Expand Down
3 changes: 2 additions & 1 deletion modules/dianomiBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
import { config } from '../src/config.js';
import { Renderer } from '../src/Renderer.js';
import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';

const { getConfig } = config;

Expand Down Expand Up @@ -114,7 +115,7 @@ export const spec = {
setOnAny(validBidRequests, 'params.priceType') ||
'net';
const tid = bidderRequest.ortb2?.source?.tid;
const currency = getConfig('currency.adServerCurrency');
const currency = getCurrencyFromBidderRequest(bidderRequest);
const cur = currency && [currency];
const eids = setOnAny(validBidRequests, 'userIdAsEids');
const schain = setOnAny(validBidRequests, 'schain');
Expand Down
3 changes: 2 additions & 1 deletion modules/dsp_genieeBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { BANNER } from '../src/mediaTypes.js';
import { ortbConverter } from '../libraries/ortbConverter/converter.js';
import { deepAccess, deepSetValue } from '../src/utils.js';
import { config } from '../src/config.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';

/**
* @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest
Expand Down Expand Up @@ -71,7 +72,7 @@ export const spec = {
if (deepAccess(bidderRequest, 'gdprConsent.gdprApplies') || // gdpr
USPConsent(bidderRequest.uspConsent) || // usp
config.getConfig('coppa') || // coppa
invalidCurrency(config.getConfig('currency.adServerCurrency')) // currency validation
invalidCurrency(getCurrencyFromBidderRequest(bidderRequest)) // currency validation
) {
return {
method: 'GET',
Expand Down
4 changes: 2 additions & 2 deletions modules/finativeBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {NATIVE} from '../src/mediaTypes.js';
import {_map, deepSetValue, isEmpty, setOnAny} from '../src/utils.js';
import {config} from '../src/config.js';
import {convertOrtbRequestToProprietaryNative} from '../src/native.js';
import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js';

const BIDDER_CODE = 'finative';
const DEFAULT_CUR = 'EUR';
Expand Down Expand Up @@ -64,7 +64,7 @@ export const spec = {
validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
const pt = setOnAny(validBidRequests, 'params.pt') || setOnAny(validBidRequests, 'params.priceType') || 'net';
const tid = bidderRequest.ortb2?.source?.tid;
const cur = [config.getConfig('currency.adServerCurrency') || DEFAULT_CUR];
const cur = [getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CUR];
let url = bidderRequest.refererInfo.referer;

const imp = validBidRequests.map((bid, id) => {
Expand Down
Loading
Loading