Skip to content

Commit

Permalink
Merge branch 'prebid-8' into fix-appnexus-segments
Browse files Browse the repository at this point in the history
  • Loading branch information
dgirardi committed Jun 13, 2023
2 parents 3f38e24 + b053d55 commit ac86685
Showing 6 changed files with 150 additions and 827 deletions.
40 changes: 37 additions & 3 deletions libraries/appnexusKeywords/anKeywords.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
import {_each, getValueString, isArray, isStr, mergeDeep, isNumber} from '../../src/utils.js';
import {_each, deepAccess, getValueString, isArray, isStr, mergeDeep, isNumber} from '../../src/utils.js';
import {getAllOrtbKeywords} from '../keywords/keywords.js';
import {CLIENT_SECTIONS} from '../../src/fpd/oneClient.js';

const ORTB_SEGTAX_KEY_MAP = {
526: '1plusx',
527: '1plusx',
541: 'captify_segments',
540: 'perid'
};
const ORTB_SEG_PATHS = ['user.data'].concat(
CLIENT_SECTIONS.map((prefix) => `${prefix}.content.data`)
);

/**
* Converts an object of arrays (either strings or numbers) into an array of objects containing key and value properties
@@ -71,7 +82,7 @@ function convertKeywordsToANMap(kwarray) {
* @param ortb2
* @return {{}} appnexus-style keyword map using all keywords contained in ortb2
*/
export function getANMapFromOrtb(ortb2) {
export function getANMapFromOrtbKeywords(ortb2) {
return convertKeywordsToANMap(getAllOrtbKeywords(ortb2));
}

@@ -86,7 +97,30 @@ export function getANKewyordParamFromMaps(...anKeywordMaps) {

export function getANKeywordParam(ortb2, ...anKeywordsMaps) {
return getANKewyordParamFromMaps(
getANMapFromOrtb(ortb2),
getANMapFromOrtbKeywords(ortb2),
getANMapFromOrtbSegments(ortb2),
...anKeywordsMaps
)
}

export function getANMapFromOrtbSegments(ortb2) {
let ortbSegData = {};
ORTB_SEG_PATHS.forEach(path => {
let ortbSegsArrObj = deepAccess(ortb2, path) || [];
ortbSegsArrObj.forEach(segObj => {
// only read segment data from known sources
const segtax = ORTB_SEGTAX_KEY_MAP[deepAccess(segObj, 'ext.segtax')];
if (segtax) {
segObj.segment.forEach(seg => {
// if source was in multiple locations of ortb or had multiple segments in same area, stack them together into an array
if (ortbSegData[segtax]) {
ortbSegData[segtax].push(seg.id);
} else {
ortbSegData[segtax] = [seg.id]
}
});
}
});
});
return ortbSegData;
}
77 changes: 24 additions & 53 deletions modules/airgridRtdProvider.js
Original file line number Diff line number Diff line change
@@ -5,16 +5,11 @@
* @module modules/airgridRtdProvider
* @requires module:modules/realTimeData
*/
import { config } from '../src/config.js';
import { submodule } from '../src/hook.js';
import {
deepSetValue,
deepAccess,
} from '../src/utils.js';
import { getGlobal } from '../src/prebidGlobal.js';
import { getStorageManager } from '../src/storageManager.js';
import { loadExternalScript } from '../src/adloader.js';
import { MODULE_TYPE_RTD } from '../src/activities/modules.js';
import {submodule} from '../src/hook.js';
import {deepAccess, deepSetValue, mergeDeep} from '../src/utils.js';
import {getStorageManager} from '../src/storageManager.js';
import {loadExternalScript} from '../src/adloader.js';
import {MODULE_TYPE_RTD} from '../src/activities/modules.js';

const MODULE_NAME = 'realTimeData';
const SUBMODULE_NAME = 'airgrid';
@@ -62,54 +57,35 @@ export function getMatchedAudiencesFromStorage() {
}
}

/**
* Mutates the adUnits object
* @param {Object} adUnits
* @param {Array} audiences
* @return {void}
*/
function setAudiencesToAppNexusAdUnits(adUnits, audiences) {
adUnits.forEach((adUnit) => {
adUnit.bids.forEach((bid) => {
if (bid.bidder && bid.bidder === 'appnexus') {
deepSetValue(bid, 'params.keywords.perid', audiences || []);
}
});
});
}

/**
* Pass audience data to configured bidders, using ORTB2
* @param {Object} bidConfig
* @param {Object} rtdConfig
* @param {Array} audiences
* @return {{}} a map from bidder code to ORTB2 config
* @return {void}
*/
export function setAudiencesAsBidderOrtb2(rtdConfig, audiences) {
export function setAudiencesAsBidderOrtb2(bidConfig, rtdConfig, audiences) {
const bidders = deepAccess(rtdConfig, 'params.bidders');
if (!bidders || bidders.length === 0 || !audiences || audiences.length === 0) return;

const keywords = audiences.map(
(audienceId) => `perid=${audienceId}`
).join(',');
const agOrtb2 = {};

config.mergeBidderConfig({
bidders: bidders,
config: {
ortb2: {
site: {
keywords,
}
}
const agUserData = [
{
id: String(AG_TCF_ID),
ext: {
segtax: 540,
},
name: 'airgrid',
segment: audiences.map((id) => ({id}))
}
})
}
]
deepSetValue(agOrtb2, 'user.data', agUserData);

export function setAudiencesUsingAppNexusAuctionKeywords(audiences) {
config.setConfig({
appnexusAuctionKeywords: {
perid: audiences,
},
});
const bidderConfig = Object.fromEntries(
bidders.map((bidder) => [bidder, agOrtb2])
)
mergeDeep(bidConfig?.ortb2Fragments?.bidder, bidderConfig)
}

/**
@@ -137,14 +113,9 @@ export function passAudiencesToBidders(
rtdConfig,
userConsent
) {
const adUnits = bidConfig.adUnits || getGlobal().adUnits;
const audiences = getMatchedAudiencesFromStorage();
if (audiences.length > 0) {
setAudiencesUsingAppNexusAuctionKeywords(audiences);
setAudiencesAsBidderOrtb2(rtdConfig, audiences)
if (adUnits) {
setAudiencesToAppNexusAdUnits(adUnits, audiences);
}
setAudiencesAsBidderOrtb2(bidConfig, rtdConfig, audiences)
}
onDone();
}
Loading
Oops, something went wrong.

0 comments on commit ac86685

Please sign in to comment.