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

ucfunnel adapter support CCPA and remove utils.js in adapter #4541

Merged
merged 38 commits into from
Jan 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
d18db95
Add a new ucfunnel Adapter and test page
Jun 5, 2017
f82a4b7
Add a new ucfunnel Adapter and test page
Jun 5, 2017
4c91775
1. Use prebid lib in the repo to keep updated
RyanChouTw Jun 16, 2017
52eaecb
Merge branch 'master' into master
RyanChouTw Jun 16, 2017
96a70a4
utils.getTopWindowLocation is a function
RyanChouTw Jun 20, 2017
7202a62
Merge branch 'master' of https://github.com/prebid/Prebid.js
RyanChouTw Jun 28, 2017
858b833
Change to modules from adapters
RyanChouTw Jun 28, 2017
8b46932
Migrate to module design
RyanChouTw Jun 28, 2017
d7e043b
[Dev Fix] Remove width and height which can be got from ad unit id
RyanChouTw Jul 13, 2017
badfa53
Merge branch 'master' of https://github.com/prebid/Prebid.js
RyanChouTw Jul 13, 2017
8d81704
Merge pull request #1 from prebid/master
RyanChouTw Sep 25, 2017
8e7fe31
Merge branch 'master' of https://github.com/prebid/Prebid.js
RyanChouTw Dec 21, 2017
5dc00f3
Update ucfunnelBidAdapter to fit into new spec
RyanChouTw Dec 21, 2017
66c3a06
Correct the endpoint. Fix the error of query string
RyanChouTw Dec 21, 2017
0328e97
Add test case for ucfunnelBidAdapter
RyanChouTw Jan 11, 2018
c2c5eb0
Merge branch 'master' of https://github.com/prebid/Prebid.js
RyanChouTw Jan 11, 2018
86fdd23
Fix lint error
RyanChouTw Jan 12, 2018
c331f57
Update version number
RyanChouTw Jan 16, 2018
28acb40
Combine all checks on bid request
RyanChouTw Jan 18, 2018
93621b8
Merge branch 'master' of https://github.com/prebid/Prebid.js
RyanChouTw May 25, 2018
f7f2515
Add GDPR support for ucfunnel adapter
RyanChouTw May 25, 2018
d4f3467
Merge branch 'master' of https://github.com/prebid/Prebid.js
RyanChouTw Jun 14, 2018
1f79c44
Add in-stream video and native support for ucfunnel adapter
RyanChouTw Jun 14, 2018
7d8dc52
Remove demo page. Add more test cases.
RyanChouTw Jun 20, 2018
99fa86e
Change request method from POST to GET
RyanChouTw Jun 26, 2018
03e37e6
Remove unnecessary comment
RyanChouTw Jun 27, 2018
aabfdd4
Support vastXml and vastUrl for video request
RyanChouTw Jul 3, 2018
2177c15
Merge branch 'master' of https://github.com/prebid/Prebid.js
Dec 2, 2018
af05d07
update TTL to 30 mins
Dec 2, 2018
45614c9
Avoid using arrow function which is not discuraged in mocha
Dec 3, 2018
a5b402c
Merge branch 'master' of https://github.com/prebid/Prebid.js
Jul 9, 2019
c22723e
ucfunnel tdid support
Jul 9, 2019
644b900
Merge branch 'master' of https://github.com/prebid/Prebid.js into HEAD
Oct 21, 2019
0175c57
ucfunnel fix error message in debug mode
Oct 17, 2019
70e82bb
Merge branch 'master' of https://github.com/prebid/Prebid.js
jackhsiehucf Nov 25, 2019
30e79c5
Merge branch 'master' of https://github.com/prebid/Prebid.js into ccpa
jackhsiehucf Dec 5, 2019
fee3803
ucfunnel adapter support CCPA
jackhsiehucf Dec 5, 2019
0f9b6c8
ucfunnel adapter fix prebid 3.0 problem
jackhsiehucf Dec 12, 2019
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
238 changes: 238 additions & 0 deletions modules/ucfunnelBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
import {registerBidder} from '../src/adapters/bidderFactory';
import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes';

const VER = 'ADGENT_PREBID-2018011501';
const BIDDER_CODE = 'ucfunnel';

const VIDEO_CONTEXT = {
INSTREAM: 0,
OUSTREAM: 2
}

export const spec = {
code: BIDDER_CODE,
ENDPOINT: 'https://hb.aralego.com/header',
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
/**
* Check if the bid is a valid zone ID in either number or string form
* @param {object} bid the ucfunnel bid to validate
* @return boolean for whether or not a bid is valid
*/
isBidRequestValid: function(bid) {
const isVideoMediaType = (bid.mediaTypes && bid.mediaTypes.video != null);
const videoContext = (bid.mediaTypes && bid.mediaTypes.video != null) ? bid.mediaTypes.video.videoContext : '';

if (typeof bid.params !== 'object' || typeof bid.params.adid != 'string') {
return false;
}

if (isVideoMediaType && videoContext === 'outstream') {
return false;
}

return true;
},

/**
* @param {BidRequest[]} bidRequests
* @param {*} bidderRequest
* @return {ServerRequest}
*/
buildRequests: function(bids, bidderRequest) {
return bids.map(bid => {
return {
method: 'GET',
url: spec.ENDPOINT,
data: getRequestData(bid, bidderRequest),
bidRequest: bid
}
});
},

/**
* Format ucfunnel responses as Prebid bid responses
* @param {ucfunnelResponseObj} ucfunnelResponse A successful response from ucfunnel.
* @return {Bid[]} An array of formatted bids.
*/
interpretResponse: function (ucfunnelResponseObj, request) {
const bidRequest = request.bidRequest;
const ad = ucfunnelResponseObj ? ucfunnelResponseObj.body : {};
const videoPlayerSize = parseSizes(bidRequest);

let bid = {
requestId: bidRequest.bidId,
cpm: ad.cpm || 0,
creativeId: ad.ad_id || bidRequest.params.adid,
dealId: ad.deal || null,
currency: 'USD',
netRevenue: true,
ttl: 1800
};

if (bidRequest.params && bidRequest.params.bidfloor && ad.cpm && ad.cpm < bidRequest.params.bidfloor) {
bid.cpm = 0;
}
if (ad.creative_type) {
bid.mediaType = ad.creative_type;
}

switch (ad.creative_type) {
case NATIVE:
let nativeAd = ad.native;
Object.assign(bid, {
width: 1,
height: 1,
native: {
title: nativeAd.title,
body: nativeAd.desc,
cta: nativeAd.ctatext,
sponsoredBy: nativeAd.sponsored,
image: nativeAd.image || nativeAd.image.url,
icon: nativeAd.icon || nativeAd.icon.url,
clickUrl: nativeAd.clickUrl,
impressionTrackers: nativeAd.impressionTrackers,
}
});
break;
case VIDEO:
Object.assign(bid, {
vastUrl: ad.vastUrl,
vastXml: ad.vastXml
});

if (videoPlayerSize && videoPlayerSize.length === 2) {
Object.assign(bid, {
width: videoPlayerSize[0],
height: videoPlayerSize[1]
});
}
break;
case BANNER:
default:
var size = parseSizes(bidRequest);
Object.assign(bid, {
width: ad.width || size[0],
height: ad.height || size[1],
ad: ad.adm || ''
});
}

return [bid];
},

getUserSyncs: function(syncOptions) {
if (syncOptions.iframeEnabled) {
return [{
type: 'iframe',
url: '//cdn.aralego.com/ucfad/cookie/sync.html'
}];
} else if (syncOptions.pixelEnabled) {
return [{
type: 'image',
url: '//sync.aralego.com/idSync'
}];
}
}
};
registerBidder(spec);

function transformSizes(requestSizes) {
if (typeof requestSizes === 'object' && requestSizes.length) {
return requestSizes[0];
}
}

function parseSizes(bid) {
let params = bid.params;
if (bid.mediaType === VIDEO) {
let size = [];
if (params.video && params.video.playerWidth && params.video.playerHeight) {
size = [
params.video.playerWidth,
params.video.playerHeight
];
return size;
}
}

return transformSizes(bid.sizes);
}

function getSupplyChain(schain) {
var supplyChain = '';
if (schain != null && schain.nodes) {
supplyChain = schain.ver + ',' + schain.complete;
for (let i = 0; i < schain.nodes.length; i++) {
supplyChain += '!';
supplyChain += (schain.nodes[i].asi) ? encodeURIComponent(schain.nodes[i].asi) : '';
supplyChain += ',';
supplyChain += (schain.nodes[i].sid) ? encodeURIComponent(schain.nodes[i].sid) : '';
supplyChain += ',';
supplyChain += (schain.nodes[i].hp) ? encodeURIComponent(schain.nodes[i].hp) : '';
supplyChain += ',';
supplyChain += (schain.nodes[i].rid) ? encodeURIComponent(schain.nodes[i].rid) : '';
supplyChain += ',';
supplyChain += (schain.nodes[i].name) ? encodeURIComponent(schain.nodes[i].name) : '';
supplyChain += ',';
supplyChain += (schain.nodes[i].domain) ? encodeURIComponent(schain.nodes[i].domain) : '';
}
}
return supplyChain;
}

function getRequestData(bid, bidderRequest) {
const size = parseSizes(bid);
const loc = window.location;
const host = loc.host;
const page = loc.href;
const language = navigator.language;
const dnt = (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0;
const userIdTdid = (bid.userId && bid.userId.tdid) ? bid.userId.tdid : '';
const supplyChain = getSupplyChain(bid.schain);
// general bid data
let bidData = {
ver: VER,
ifr: 0,
bl: language,
je: 1,
dnt: dnt,
host: host,
u: page,
adid: bid.params.adid,
tdid: userIdTdid,
schain: supplyChain,
fp: bid.params.bidfloor
};

if (size != undefined && size.length == 2) {
bidData.w = size[0];
bidData.h = size[1];
}

if (bidderRequest && bidderRequest.uspConsent) {
Object.assign(bidData, {
usprivacy: bidderRequest.uspConsent
});
}
if (bid.mediaTypes && bid.mediaTypes.video != null) {
const videoContext = bid.mediaTypes.video.context;
switch (videoContext) {
case 'outstream':
bidData.atype = VIDEO_CONTEXT.OUSTREAM;
break;
case 'instream':
default:
bidData.atype = VIDEO_CONTEXT.INSTREAM;
break;
}
}

if (bidderRequest && bidderRequest.gdprConsent) {
Object.assign(bidData, {
gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0,
euconsent: bidderRequest.gdprConsent.consentString
});
}

return bidData;
}
Loading