Skip to content

Commit 7c0c732

Browse files
anand-venkatramanIsaac A. Dettman
authored and
Isaac A. Dettman
committed
PulsePoint: CCPA and new UserId partner integration (#4565)
* ET-1691: Pulsepoint Analytics adapter for Prebid. (#1) * ET-1691: Adding pulsepoint analytics and tests for pulsepoint adapter * ET-1691: Adding pulsepoint analytics and tests for pulsepoint adapter * ET-1691: cleanup * ET-1691: minor * ET-1691: revert package.json change * Adding bidRequest to bidFactory.createBid method as per #509 * ET-1765: Adding support for additional params in PulsePoint adapter (#2) * ET-1850: Fixing #866 * Minor fix * Adding mandatory parameters to Bid * PulsePoint: CCPA and new user id partner integration * Review comment
1 parent 21dcd5a commit 7c0c732

File tree

2 files changed

+100
-15
lines changed

2 files changed

+100
-15
lines changed

modules/pulsepointBidAdapter.js

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -397,9 +397,31 @@ function user(bidRequest, bidderRequest) {
397397
if (bidRequest.userId) {
398398
ext.eids = [];
399399
addExternalUserId(ext.eids, bidRequest.userId.pubcid, 'pubcommon');
400-
addExternalUserId(ext.eids, bidRequest.userId.tdid, 'ttdid');
401-
addExternalUserId(ext.eids, utils.deepAccess(bidRequest.userId.digitrustid, 'data.id'), 'digitrust');
402-
addExternalUserId(ext.eids, bidRequest.userId.id5id, 'id5id');
400+
addExternalUserId(ext.eids, bidRequest.userId.britepoolid, 'britepool.com');
401+
addExternalUserId(ext.eids, bidRequest.userId.criteoId, 'criteo');
402+
addExternalUserId(ext.eids, bidRequest.userId.idl_env, 'identityLink');
403+
addExternalUserId(ext.eids, bidRequest.userId.id5id, 'id5-sync.com');
404+
addExternalUserId(ext.eids, bidRequest.userId.parrableid, 'parrable.com');
405+
// liveintent
406+
if (bidRequest.userId.lipb && bidRequest.userId.lipb.lipbid) {
407+
addExternalUserId(ext.eids, bidRequest.userId.lipb.lipbid, 'liveintent.com');
408+
}
409+
// TTD
410+
addExternalUserId(ext.eids, bidRequest.userId.tdid, 'adserver.org', {
411+
rtiPartner: 'TDID'
412+
});
413+
// digitrust
414+
const digitrustResponse = bidRequest.userId.digitrustid;
415+
if (digitrustResponse && digitrustResponse.data) {
416+
var digitrust = {};
417+
if (digitrustResponse.data.id) {
418+
digitrust.id = digitrustResponse.data.id;
419+
}
420+
if (digitrustResponse.data.keyv) {
421+
digitrust.keyv = digitrustResponse.data.keyv;
422+
}
423+
ext.digitrust = digitrust;
424+
}
403425
}
404426
}
405427
return { ext };
@@ -408,13 +430,15 @@ function user(bidRequest, bidderRequest) {
408430
/**
409431
* Produces external userid object in ortb 3.0 model.
410432
*/
411-
function addExternalUserId(eids, value, source) {
412-
if (value) {
433+
function addExternalUserId(eids, id, source, uidExt) {
434+
if (id) {
435+
var uid = { id };
436+
if (uidExt) {
437+
uid.ext = uidExt;
438+
}
413439
eids.push({
414440
source,
415-
uids: [{
416-
id: value
417-
}]
441+
uids: [ uid ]
418442
});
419443
}
420444
}
@@ -423,8 +447,17 @@ function addExternalUserId(eids, value, source) {
423447
* Produces the regulations ortb object
424448
*/
425449
function regs(bidderRequest) {
426-
if (bidderRequest && bidderRequest.gdprConsent) {
427-
return { ext: { gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 } };
450+
if (bidderRequest.gdprConsent || bidderRequest.uspConsent) {
451+
var ext = {};
452+
// GDPR applies attribute (actual consent value is in user object)
453+
if (bidderRequest.gdprConsent) {
454+
ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
455+
}
456+
// CCPA
457+
if (bidderRequest.uspConsent) {
458+
ext.us_privacy = bidderRequest.uspConsent;
459+
}
460+
return { ext };
428461
}
429462
return null;
430463
}

test/spec/modules/pulsepointBidAdapter_spec.js

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,20 @@ describe('PulsePoint Adapter Tests', function () {
431431
expect(ortbRequest.regs.ext.gdpr).to.equal(1);
432432
});
433433

434+
it('Verify CCPA', function () {
435+
const bidderRequestUSPrivacy = {
436+
uspConsent: '1YYY'
437+
};
438+
const request = spec.buildRequests(slotConfigs, Object.assign({}, bidderRequest, bidderRequestUSPrivacy));
439+
expect(request.url).to.equal('https://bid.contextweb.com/header/ortb?src=prebid');
440+
expect(request.method).to.equal('POST');
441+
const ortbRequest = request.data;
442+
// regs object
443+
expect(ortbRequest.regs).to.not.equal(null);
444+
expect(ortbRequest.regs.ext).to.not.equal(null);
445+
expect(ortbRequest.regs.ext.us_privacy).to.equal('1YYY');
446+
});
447+
434448
it('Verify Video request', function () {
435449
const request = spec.buildRequests(videoSlotConfig, bidderRequest);
436450
expect(request.url).to.equal('https://bid.contextweb.com/header/ortb?src=prebid');
@@ -592,15 +606,53 @@ describe('PulsePoint Adapter Tests', function () {
592606
expect(ortbRequest.user).to.not.be.undefined;
593607
expect(ortbRequest.user.ext).to.not.be.undefined;
594608
expect(ortbRequest.user.ext.eids).to.not.be.undefined;
595-
expect(ortbRequest.user.ext.eids).to.have.lengthOf(3);
609+
expect(ortbRequest.user.ext.eids).to.have.lengthOf(2);
596610
expect(ortbRequest.user.ext.eids[0].source).to.equal('pubcommon');
597611
expect(ortbRequest.user.ext.eids[0].uids).to.have.lengthOf(1);
598612
expect(ortbRequest.user.ext.eids[0].uids[0].id).to.equal('userid_pubcid');
599-
expect(ortbRequest.user.ext.eids[1].source).to.equal('ttdid');
613+
expect(ortbRequest.user.ext.eids[1].source).to.equal('adserver.org');
600614
expect(ortbRequest.user.ext.eids[1].uids).to.have.lengthOf(1);
601615
expect(ortbRequest.user.ext.eids[1].uids[0].id).to.equal('userid_ttd');
602-
expect(ortbRequest.user.ext.eids[2].source).to.equal('digitrust');
603-
expect(ortbRequest.user.ext.eids[2].uids).to.have.lengthOf(1);
604-
expect(ortbRequest.user.ext.eids[2].uids[0].id).to.equal('userid_digitrust');
616+
expect(ortbRequest.user.ext.eids[1].uids[0].ext).to.not.be.null;
617+
expect(ortbRequest.user.ext.eids[1].uids[0].ext.rtiPartner).to.equal('TDID');
618+
expect(ortbRequest.user.ext.digitrust).to.not.be.null;
619+
expect(ortbRequest.user.ext.digitrust.id).to.equal('userid_digitrust');
620+
expect(ortbRequest.user.ext.digitrust.keyv).to.equal(4);
621+
});
622+
it('Verify new external user id partners', function () {
623+
const bidRequests = deepClone(slotConfigs);
624+
bidRequests[0].userId = {
625+
britepoolid: 'britepool_id123',
626+
criteoId: 'criteo_id234',
627+
idl_env: 'idl_id123',
628+
id5id: 'id5id_234',
629+
parrableid: 'parrable_id234',
630+
lipb: {
631+
lipbid: 'liveintent_id123'
632+
}
633+
};
634+
const userVerify = function(obj, source, id) {
635+
expect(obj).to.deep.equal({
636+
source,
637+
uids: [{
638+
id
639+
}]
640+
});
641+
};
642+
const request = spec.buildRequests(bidRequests, bidderRequest);
643+
expect(request).to.be.not.null;
644+
const ortbRequest = request.data;
645+
expect(request.data).to.be.not.null;
646+
// user object
647+
expect(ortbRequest.user).to.not.be.undefined;
648+
expect(ortbRequest.user.ext).to.not.be.undefined;
649+
expect(ortbRequest.user.ext.eids).to.not.be.undefined;
650+
expect(ortbRequest.user.ext.eids).to.have.lengthOf(6);
651+
userVerify(ortbRequest.user.ext.eids[0], 'britepool.com', 'britepool_id123');
652+
userVerify(ortbRequest.user.ext.eids[1], 'criteo', 'criteo_id234');
653+
userVerify(ortbRequest.user.ext.eids[2], 'identityLink', 'idl_id123');
654+
userVerify(ortbRequest.user.ext.eids[3], 'id5-sync.com', 'id5id_234');
655+
userVerify(ortbRequest.user.ext.eids[4], 'parrable.com', 'parrable_id234');
656+
userVerify(ortbRequest.user.ext.eids[5], 'liveintent.com', 'liveintent_id123');
605657
});
606658
});

0 commit comments

Comments
 (0)