Skip to content

Commit c5ffc77

Browse files
PulsePoint Bid Adapter: First party data (prebid#9114)
* 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 prebid#509 * ET-1765: Adding support for additional params in PulsePoint adapter (#2) * ET-1850: Fixing prebid#866 * Minor fix * Adding mandatory parameters to Bid * PulsePoint: Firstparty data support
1 parent fcd1e3c commit c5ffc77

File tree

2 files changed

+134
-6
lines changed

2 files changed

+134
-6
lines changed

modules/pulsepointBidAdapter.js

+11-6
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,16 @@ function bidResponseAvailable(request, response) {
153153
* Produces an OpenRTBImpression from a slot config.
154154
*/
155155
function impression(slot) {
156+
var firstPartyData = slot.ortb2Imp?.ext || {};
157+
var ext = Object.assign({}, firstPartyData, slotUnknownParams(slot));
156158
return {
157159
id: slot.bidId,
158160
banner: banner(slot),
159161
'native': nativeImpression(slot),
160162
tagid: slot.params.ct.toString(),
161163
video: video(slot),
162164
bidfloor: bidFloor(slot),
163-
ext: ext(slot),
165+
ext: Object.keys(ext).length > 0 ? ext : null,
164166
};
165167
}
166168

@@ -209,7 +211,7 @@ function video(slot) {
209211
/**
210212
* Unknown params are captured and sent on ext
211213
*/
212-
function ext(slot) {
214+
function slotUnknownParams(slot) {
213215
const ext = {};
214216
const knownParamsMap = {};
215217
KNOWN_PARAMS.forEach(value => knownParamsMap[value] = 1);
@@ -330,14 +332,16 @@ function site(bidRequests, bidderRequest) {
330332
const pubId = bidRequests && bidRequests.length > 0 ? bidRequests[0].params.cp : '0';
331333
const appParams = bidRequests[0].params.app;
332334
if (!appParams) {
333-
return {
335+
// use the first party data if available, and override only publisher/ref/page properties
336+
var firstPartyData = bidderRequest?.ortb2?.site || {};
337+
return Object.assign({}, firstPartyData, {
334338
publisher: {
335339
id: pubId.toString(),
336340
},
337341
// TODO: does the fallback make sense here?
338342
ref: bidderRequest?.refererInfo?.ref || window.document.referrer,
339343
page: bidderRequest?.refererInfo?.page || ''
340-
}
344+
});
341345
}
342346
return null;
343347
}
@@ -406,7 +410,8 @@ function adSize(slot, sizes) {
406410
* an openrtb User object.
407411
*/
408412
function user(bidRequest, bidderRequest) {
409-
var ext = {};
413+
var user = bidderRequest?.ortb2?.user || { ext: {} };
414+
var ext = user.ext;
410415
if (bidderRequest) {
411416
if (bidderRequest.gdprConsent) {
412417
ext.consent = bidderRequest.gdprConsent.consentString;
@@ -418,7 +423,7 @@ function user(bidRequest, bidderRequest) {
418423
ext.eids = eids;
419424
}
420425
}
421-
return { ext };
426+
return user;
422427
}
423428

424429
/**

test/spec/modules/pulsepointBidAdapter_spec.js

+123
Original file line numberDiff line numberDiff line change
@@ -795,4 +795,127 @@ describe('PulsePoint Adapter Tests', function () {
795795
expect(ortbRequest.imp[0].video.minbitrate).to.equal(200);
796796
expect(ortbRequest.imp[0].video.protocols).to.eql([1, 2, 4]);
797797
});
798+
it('Verify user level first party data', function () {
799+
const bidderRequest = {
800+
refererInfo: {
801+
page: 'https://publisher.com/home',
802+
ref: 'https://referrer'
803+
},
804+
gdprConsent: {
805+
gdprApplies: true,
806+
consentString: 'serialized_gpdr_data'
807+
},
808+
ortb2: {
809+
user: {
810+
yob: 1985,
811+
gender: 'm',
812+
ext: {
813+
data: {
814+
registered: true,
815+
interests: ['cars']
816+
}
817+
}
818+
}
819+
}
820+
};
821+
let request = spec.buildRequests(slotConfigs, bidderRequest);
822+
let ortbRequest = request.data;
823+
expect(ortbRequest).to.not.equal(null);
824+
expect(ortbRequest.user).to.not.equal(null);
825+
expect(ortbRequest.user).to.deep.equal({
826+
yob: 1985,
827+
gender: 'm',
828+
ext: {
829+
data: {
830+
registered: true,
831+
interests: ['cars']
832+
},
833+
consent: 'serialized_gpdr_data'
834+
}
835+
});
836+
});
837+
it('Verify site level first party data', function () {
838+
const bidderRequest = {
839+
refererInfo: {
840+
page: 'https://publisher.com/home',
841+
ref: 'https://referrer'
842+
},
843+
ortb2: {
844+
site: {
845+
content: {
846+
data: [{
847+
name: 'www.iris.com',
848+
ext: {
849+
segtax: 500,
850+
cids: ['iris_c73g5jq96mwso4d8']
851+
}
852+
}]
853+
},
854+
page: 'http://pub.com/news',
855+
ref: 'http://google.com'
856+
}
857+
}
858+
};
859+
let request = spec.buildRequests(slotConfigs, bidderRequest);
860+
let ortbRequest = request.data;
861+
expect(ortbRequest).to.not.equal(null);
862+
expect(ortbRequest.site).to.not.equal(null);
863+
expect(ortbRequest.site).to.deep.equal({
864+
content: {
865+
data: [{
866+
name: 'www.iris.com',
867+
ext: {
868+
segtax: 500,
869+
cids: ['iris_c73g5jq96mwso4d8']
870+
}
871+
}]
872+
},
873+
page: 'https://publisher.com/home',
874+
ref: 'https://referrer',
875+
publisher: {
876+
id: 'p10000'
877+
}
878+
});
879+
});
880+
it('Verify impression/slot level first party data', function () {
881+
const bidderRequests = [{
882+
placementCode: '/DfpAccount1/slot1',
883+
mediaTypes: {
884+
banner: {
885+
sizes: [[1, 1]]
886+
}
887+
},
888+
bidId: 'bid12345',
889+
params: {
890+
cp: 'p10000',
891+
ct: 't10000',
892+
extra_key1: 'extra_val1',
893+
extra_key2: 12345
894+
},
895+
ortb2Imp: {
896+
ext: {
897+
data: {
898+
pbadslot: 'homepage-top-rect',
899+
adUnitSpecificAttribute: '123'
900+
}
901+
}
902+
}
903+
}];
904+
let request = spec.buildRequests(bidderRequests, bidderRequest);
905+
let ortbRequest = request.data;
906+
expect(ortbRequest).to.not.equal(null);
907+
expect(ortbRequest.imp).to.not.equal(null);
908+
expect(ortbRequest.imp).to.have.lengthOf(1);
909+
expect(ortbRequest.imp[0].ext).to.not.equal(null);
910+
expect(ortbRequest.imp[0].ext).to.deep.equal({
911+
prebid: {
912+
extra_key1: 'extra_val1',
913+
extra_key2: 12345
914+
},
915+
data: {
916+
pbadslot: 'homepage-top-rect',
917+
adUnitSpecificAttribute: '123'
918+
}
919+
});
920+
});
798921
});

0 commit comments

Comments
 (0)