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

Sharethrough: Add support for ID5, Shared ID, and Live Intent ID #6261

Merged
Merged
Show file tree
Hide file tree
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
48 changes: 33 additions & 15 deletions modules/sharethroughBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
import * as utils from '../src/utils.js';

const VERSION = '3.3.0';
const VERSION = '3.3.1';
const BIDDER_CODE = 'sharethrough';
const STR_ENDPOINT = 'https://btlr.sharethrough.com/WYu2BXv1/v1';
const DEFAULT_SIZE = [1, 1];
Expand Down Expand Up @@ -31,6 +31,8 @@ export const sharethroughAdapterSpec = {
strVersion: VERSION
};

Object.assign(query, handleUniversalIds(bidRequest));

const nonHttp = sharethroughInternal.getProtocol().indexOf('http') < 0;
query.secure = nonHttp || (sharethroughInternal.getProtocol().indexOf('https') > -1);

Expand All @@ -46,20 +48,6 @@ export const sharethroughAdapterSpec = {
query.us_privacy = bidderRequest.uspConsent
}

if (bidRequest.userId && bidRequest.userId.tdid) {
query.ttduid = bidRequest.userId.tdid;
}

if (bidRequest.userId && bidRequest.userId.pubcid) {
query.pubcid = bidRequest.userId.pubcid;
} else if (bidRequest.crumbs && bidRequest.crumbs.pubcid) {
query.pubcid = bidRequest.crumbs.pubcid;
}

if (bidRequest.userId && bidRequest.userId.idl_env) {
query.idluid = bidRequest.userId.idl_env;
}

if (bidRequest.schain) {
query.schain = JSON.stringify(bidRequest.schain);
}
Expand Down Expand Up @@ -147,6 +135,36 @@ export const sharethroughAdapterSpec = {
onSetTargeting: (bid) => {}
};

function handleUniversalIds(bidRequest) {
if (!bidRequest.userId) return {};

const universalIds = {};

const ttd = utils.deepAccess(bidRequest, 'userId.tdid');
if (ttd) universalIds.ttduid = ttd;

const pubc = utils.deepAccess(bidRequest, 'userId.pubcid') || utils.deepAccess(bidRequest, 'crumbs.pubcid');
if (pubc) universalIds.pubcid = pubc;

const idl = utils.deepAccess(bidRequest, 'userId.idl_env');
if (idl) universalIds.idluid = idl;

const id5 = utils.deepAccess(bidRequest, 'userId.id5id.uid');
if (id5) {
universalIds.id5uid = { id: id5 };
const id5link = utils.deepAccess(bidRequest, 'userId.id5id.ext.linkType');
if (id5link) universalIds.id5uid.linkType = id5link;
}

const lipb = utils.deepAccess(bidRequest, 'userId.lipb.lipbid');
if (lipb) universalIds.liuid = lipb;

const shd = utils.deepAccess(bidRequest, 'userId.sharedid');
if (shd) universalIds.shduid = shd; // object with keys: id & third

return universalIds;
}

function getLargestSize(sizes) {
function area(size) {
return size[0] * size[1];
Expand Down
42 changes: 41 additions & 1 deletion test/spec/modules/sharethroughBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { expect } from 'chai';
import { sharethroughAdapterSpec, sharethroughInternal } from 'modules/sharethroughBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
import * as utils from '../../../src/utils.js';

const spec = newBidder(sharethroughAdapterSpec).getSpec();
const bidRequests = [
Expand All @@ -15,7 +16,20 @@ const bidRequests = [
userId: {
tdid: 'fake-tdid',
pubcid: 'fake-pubcid',
idl_env: 'fake-identity-link'
idl_env: 'fake-identity-link',
id5id: {
uid: 'fake-id5id',
ext: {
linkType: 2
}
},
sharedid: {
id: 'fake-sharedid',
third: 'fake-sharedthird'
},
lipb: {
lipbid: 'fake-lipbid'
}
},
crumbs: {
pubcid: 'fake-pubcid-in-crumbs-obj'
Expand Down Expand Up @@ -329,6 +343,15 @@ describe('sharethrough adapter spec', function() {
expect(bidRequest.data.pubcid).to.eq('fake-pubcid');
});

it('should add the pubcid parameter if a bid request contains a value for the Publisher Common ID Module in the' +
' crumbs object of the bidrequest', function() {
const bidData = utils.deepClone(bidRequests);
delete bidData[0].userId.pubcid;

const bidRequest = spec.buildRequests(bidData)[0];
expect(bidRequest.data.pubcid).to.eq('fake-pubcid-in-crumbs-obj');
});

it('should add the pubcid parameter if a bid request contains a value for the Publisher Common ID Module in the' +
' crumbs object of the bidrequest', function() {
const bidRequest = spec.buildRequests(bidRequests)[0];
Expand All @@ -341,6 +364,23 @@ describe('sharethrough adapter spec', function() {
expect(bidRequest.data.idluid).to.eq('fake-identity-link');
});

it('should add the id5uid parameter if a bid request contains a value for ID5', function() {
const bidRequest = spec.buildRequests(bidRequests)[0];
expect(bidRequest.data.id5uid.id).to.eq('fake-id5id');
expect(bidRequest.data.id5uid.linkType).to.eq(2);
});

it('should add the shduid parameter if a bid request contains a value for Shared ID', function() {
const bidRequest = spec.buildRequests(bidRequests)[0];
expect(bidRequest.data.shduid.id).to.eq('fake-sharedid');
expect(bidRequest.data.shduid.third).to.eq('fake-sharedthird');
});

it('should add the liuid parameter if a bid request contains a value for LiveIntent ID', function() {
const bidRequest = spec.buildRequests(bidRequests)[0];
expect(bidRequest.data.liuid).to.eq('fake-lipbid');
});

it('should add Sharethrough specific parameters', function() {
const builtBidRequests = spec.buildRequests(bidRequests);
expect(builtBidRequests[0]).to.deep.include({
Expand Down