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

Sirdata RTD Module : fix empty bidders param array bug & various optimizations #11367

Merged
merged 2 commits into from
Apr 22, 2024
Merged
Changes from all 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
76 changes: 33 additions & 43 deletions modules/sirdataRtdProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@
* @module modules/sirdataRtdProvider
* @requires module:modules/realTimeData
*/
import {deepAccess, deepSetValue, isEmpty, logError, mergeDeep} from '../src/utils.js';
import {deepAccess, deepSetValue, isEmpty, logError, logInfo, mergeDeep} from '../src/utils.js';
import {submodule} from '../src/hook.js';
import {ajax} from '../src/ajax.js';
import {findIndex} from '../src/polyfill.js';
import {getRefererInfo} from '../src/refererDetection.js';
import {config} from '../src/config.js';
import {getGlobal} from '../src/prebidGlobal.js';

/** @type {string} */
const MODULE_NAME = 'realTimeData';
const SUBMODULE_NAME = 'SirdataRTDModule';
const ORTB2_NAME = 'sirdata.com';
const LOG_PREFIX = 'Sirdata RTD: ';

const partnerIds = {
'criteo': 27443,
Expand Down Expand Up @@ -63,28 +65,28 @@ const partnerIds = {
'zeta_global_ssp': 33385,
};

let CONTEXT_ONLY = true;

export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig, userConsent) {
logInfo(LOG_PREFIX, 'init');
moduleConfig.params = moduleConfig.params || {};

var tcString = (userConsent && userConsent.gdpr && userConsent.gdpr.consentString ? userConsent.gdpr.consentString : '');
var gdprApplies = (userConsent && userConsent.gdpr && userConsent.gdpr.gdprApplies ? userConsent.gdpr.gdprApplies : '');
let tcString = (userConsent && userConsent.gdpr && userConsent.gdpr.consentString ? userConsent.gdpr.consentString : '');
let gdprApplies = (userConsent && userConsent.gdpr && userConsent.gdpr.gdprApplies ? userConsent.gdpr.gdprApplies : '');

moduleConfig.params.partnerId = moduleConfig.params.partnerId ? moduleConfig.params.partnerId : 1;
moduleConfig.params.key = moduleConfig.params.key ? moduleConfig.params.key : 1;
moduleConfig.params.actualUrl = moduleConfig.params.actualUrl || null;

var sirdataDomain;
var sendWithCredentials;
let sirdataDomain;
let sendWithCredentials;

if (userConsent.coppa || (userConsent.usp && (userConsent.usp[0] == '1' && (userConsent.usp[1] == 'N' || userConsent.usp[2] == 'Y')))) {
if (userConsent.coppa || (userConsent.usp && (userConsent.usp[0] === '1' && (userConsent.usp[1] === 'N' || userConsent.usp[2] === 'Y')))) {
// if children or "Do not Sell" management in California, no segments, page categories only whatever TCF signal
sirdataDomain = 'cookieless-data.com';
sendWithCredentials = false;
gdprApplies = null;
tcString = '';
} else if (config.getConfig('consentManagement.gdpr')) {
// Default endpoint is cookieless if gdpr management is set. Needed because the cookie-based endpoint will fail and return error if user is located in Europe and no consent has been given
// Default endpoint for Contextual results only is cookieless if gdpr management is set. Needed because the cookie-based endpoint will fail and return error if user is located in Europe and no consent has been given
sirdataDomain = 'cookieless-data.com';
sendWithCredentials = false;
}
Expand All @@ -94,10 +96,9 @@ export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig,
if (!sirdataDomain || !gdprApplies || (deepAccess(userConsent, 'gdpr.vendorData.vendor.consents') && userConsent.gdpr.vendorData.vendor.consents[53] && userConsent.gdpr.vendorData.purpose.consents[1] && userConsent.gdpr.vendorData.purpose.consents[4])) {
sirdataDomain = 'sddan.com';
sendWithCredentials = true;
CONTEXT_ONLY = false;
}

var actualUrl = moduleConfig.params.actualUrl || getRefererInfo().stack.pop() || getRefererInfo().page;
let actualUrl = moduleConfig.params.actualUrl || getRefererInfo().stack.pop() || getRefererInfo().page;

const url = 'https://kvt.' + sirdataDomain + '/api/v1/public/p/' + moduleConfig.params.partnerId + '/d/' + moduleConfig.params.key + '/s?callback=&gdpr=' + gdprApplies + '&gdpr_consent=' + tcString + (actualUrl ? '&url=' + encodeURIComponent(actualUrl) : '');

Expand Down Expand Up @@ -169,7 +170,7 @@ export function setOrtb2Sda(ortb2Fragments, bidder, type, segments, segtaxValue)
if (segtaxValue) {
ortb2Data[0].ext = { segtax: segtaxValue };
}
let ortb2Conf = (type == 'site' ? {site: {content: {data: ortb2Data}}} : {user: {data: ortb2Data}});
let ortb2Conf = (type === 'site' ? {site: {content: {data: ortb2Data}}} : {user: {data: ortb2Data}});
if (bidder) {
ortb2Conf = {[bidder]: ortb2Conf};
}
Expand Down Expand Up @@ -218,7 +219,7 @@ export function getSegAndCatsArray(data, minScore, pid) {
if (data.contextual_categories.hasOwnProperty(catId) && data.contextual_categories[catId]) {
let value = data.contextual_categories[catId];
if (value >= minScore && sirdataData.categories.indexOf(catId) === -1) {
if (pid && cattaxid) {
if (pid && pid === '27440' && cattaxid) { // Equativ only
sirdataData.categories.push(pid.toString() + 'cc' + catId.toString());
} else {
sirdataData.categories.push(catId.toString());
Expand All @@ -236,15 +237,10 @@ export function getSegAndCatsArray(data, minScore, pid) {
for (let segId in data.segments) {
if (data.segments.hasOwnProperty(segId) && data.segments[segId]) {
let id = data.segments[segId].toString();
if (pid && CONTEXT_ONLY) {
if (segtaxid) {
sirdataData.categories.push(pid.toString() + 'uc' + id);
} else {
sirdataData.categories.push(id);
sirdataData.categories_score[id] = 100;
}
if (pid && pid === '27440' && segtaxid) { // Equativ only
sirdataData.segments.push(pid.toString() + 'us' + id);
} else {
sirdataData.segments.push((pid && segtaxid) ? pid.toString() + 'us' + id : id);
sirdataData.segments.push(id);
}
}
}
Expand All @@ -259,7 +255,7 @@ export function applySdaGetSpecificData(data, sirdataData, biddersParamsExist, m
// only share SDA data if whitelisted
if (!biddersParamsExist || indexFound) {
// SDA Publisher
let sirdataDataForSDA = getSegAndCatsArray(data, minScore, moduleConfig.params.partnerId);
let sirdataDataForSDA = getSegAndCatsArray(data, minScore, moduleConfig.params.partnerId.toString());
pushToOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, sirdataDataForSDA, data.segtaxid, data.cattaxid);
}

Expand All @@ -269,7 +265,7 @@ export function applySdaGetSpecificData(data, sirdataData, biddersParamsExist, m
// seller defined audience & bidder specific data
if (data.shared_taxonomy && data.shared_taxonomy[curationId]) {
// Get Bidder Specific Data
let curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore, curationId);
let curationData = getSegAndCatsArray(data.shared_taxonomy[curationId], minScore, curationId.toString());
pushToOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, curationData, data.shared_taxonomy[curationId].segtaxid, data.shared_taxonomy[curationId].cattaxid);
}
}
Expand All @@ -284,26 +280,19 @@ export function applySdaGetSpecificData(data, sirdataData, biddersParamsExist, m
}
}

export function applySdaAndDefaultSpecificData(data, sirdataData, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit) {
sirdataData = applySdaGetSpecificData(data, sirdataData, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
/*
if (sirdataData.segments && sirdataData.segments.length > 0) {
setOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, 'user.ext.data', {sd_rtd: sirdataData.segments});
}
if (sirdataData.categories && sirdataData.categories.length > 0) {
setOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, 'site.ext.data', {sd_rtd: sirdataData.categories});
export function addSegmentData(reqBids, data, moduleConfig, onDone) {
const adUnits = (reqBids && reqBids.adUnits) || getGlobal().adUnits;
if (!adUnits) {
onDone();
return;
}
*/
}

export function addSegmentData(reqBids, data, moduleConfig, onDone) {
const adUnits = reqBids.adUnits;
moduleConfig = moduleConfig || {};
moduleConfig.params = moduleConfig.params || {};
const globalMinScore = moduleConfig.params.hasOwnProperty('contextualMinRelevancyScore') ? moduleConfig.params.contextualMinRelevancyScore : 30;
var sirdataData = getSegAndCatsArray(data, globalMinScore, null);
let sirdataData = getSegAndCatsArray(data, globalMinScore, null);

const biddersParamsExist = (!!(moduleConfig.params && moduleConfig.params.bidders));
const biddersParamsExist = (!!(moduleConfig.params && moduleConfig.params.bidders && moduleConfig.params.bidders.length > 0));

// Global ortb2 SDA
if (data.global_taxonomy && !isEmpty(data.global_taxonomy)) {
Expand All @@ -320,10 +309,12 @@ export function addSegmentData(reqBids, data, moduleConfig, onDone) {
if (typeof window.googletag !== 'undefined' && (moduleConfig.params.setGptKeyValues || !moduleConfig.params.hasOwnProperty('setGptKeyValues'))) {
try {
let gptCurationId = (moduleConfig.params.gptCurationId ? moduleConfig.params.gptCurationId : (partnerIds['sdRtdForGpt'] ? partnerIds['sdRtdForGpt'] : null));
let sirdataMergedList = sirdataData.segments.concat(sirdataData.categories);
let sirdataMergedList = [];
if (gptCurationId && data.shared_taxonomy && data.shared_taxonomy[gptCurationId]) {
let gamCurationData = getSegAndCatsArray(data.shared_taxonomy[gptCurationId], globalMinScore, null);
sirdataMergedList = sirdataMergedList.concat(gamCurationData.segments).concat(gamCurationData.categories);
} else {
sirdataMergedList = sirdataData.segments.concat(sirdataData.categories);
}
window.googletag.cmd.push(function() {
window.googletag.pubads().getSlots().forEach(function (n) {
Expand All @@ -338,8 +329,8 @@ export function addSegmentData(reqBids, data, moduleConfig, onDone) {
}

// Bid targeting level for FPD non-generic biders
var bidderIndex = '';
var indexFound = false;
let bidderIndex = '';
let indexFound = false;

adUnits.forEach(adUnit => {
adUnit.hasOwnProperty('bids') && adUnit.bids.forEach(bid => {
Expand All @@ -349,7 +340,6 @@ export function addSegmentData(reqBids, data, moduleConfig, onDone) {
indexFound = (!!(typeof bidderIndex == 'number' && bidderIndex >= 0));
try {
let minScore = (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('contextualMinRelevancyScore') ? moduleConfig.params.bidders[bidderIndex].contextualMinRelevancyScore : globalMinScore);

switch (bid.bidder) {
case 'appnexus':
case 'appnexusAst':
Expand Down Expand Up @@ -379,20 +369,20 @@ export function addSegmentData(reqBids, data, moduleConfig, onDone) {

default:
if (!biddersParamsExist || (indexFound && (!moduleConfig.params.bidders[bidderIndex].hasOwnProperty('adUnitCodes') || moduleConfig.params.bidders[bidderIndex].adUnitCodes.indexOf(adUnit.code) !== -1))) {
applySdaAndDefaultSpecificData(data, sirdataData, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
applySdaGetSpecificData(data, sirdataData, biddersParamsExist, minScore, reqBids, bid, moduleConfig, indexFound, bidderIndex, adUnit);
}
}
} catch (e) {
logError(e);
}
})
});

onDone();
return adUnits;
}

export function init(config) {
logInfo(LOG_PREFIX, config);
return true;
}

Expand Down