Skip to content

Commit

Permalink
Aardvark v1.0 (prebid#2507)
Browse files Browse the repository at this point in the history
* Aardvark v1.0 + Add GDPR support

* required modifications

* cover case where gdprConsent data is not present

* demo auction update

* ignore empty bids

* accept empty bids
  • Loading branch information
dejanstrbac authored and dluxemburg committed Jul 17, 2018
1 parent 208c740 commit 79727fd
Show file tree
Hide file tree
Showing 3 changed files with 453 additions and 0 deletions.
159 changes: 159 additions & 0 deletions modules/aardvarkBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
import * as utils from 'src/utils';
import {registerBidder} from 'src/adapters/bidderFactory';

const BIDDER_CODE = 'aardvark';
const DEFAULT_ENDPOINT = 'bidder.rtk.io';
const SYNC_ENDPOINT = 'sync.rtk.io';
const AARDVARK_TTL = 300;
const AARDVARK_CURRENCY = 'USD';

let hasSynced = false;

export function resetUserSync() {
hasSynced = false;
}

export const spec = {
code: BIDDER_CODE,

isBidRequestValid: function(bid) {
return ((typeof bid.params.ai === 'string') && !!bid.params.ai.length &&
(typeof bid.params.sc === 'string') && !!bid.params.sc.length);
},

buildRequests: function(validBidRequests, bidderRequest) {
var auctionCodes = [];
var requests = [];
var requestsMap = {};
var referer = utils.getTopWindowUrl();
var pageCategories = [];

if (window.top.rtkcategories && Array.isArray(window.top.rtkcategories)) {
pageCategories = window.top.rtkcategories;
}

utils._each(validBidRequests, function(b) {
var rMap = requestsMap[b.params.ai];
if (!rMap) {
rMap = {
shortCodes: [],
payload: {
version: 1,
jsonp: false,
rtkreferer: referer
},
endpoint: DEFAULT_ENDPOINT
};

if (pageCategories && pageCategories.length) {
rMap.payload.categories = pageCategories.slice(0);
}

if (b.params.categories && b.params.categories.length) {
rMap.payload.categories = rMap.payload.categories || []
utils._each(b.params.categories, function(cat) {
rMap.payload.categories.push(cat);
});
}

if (bidderRequest && bidderRequest.gdprConsent) {
rMap.payload.gdpr = false;
if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
rMap.payload.gdpr = bidderRequest.gdprConsent.gdprApplies;
}
if (rMap.payload.gdpr) {
rMap.payload.consent = bidderRequest.gdprConsent.consentString;
}
}

requestsMap[b.params.ai] = rMap;
auctionCodes.push(b.params.ai);
}

rMap.shortCodes.push(b.params.sc);
rMap.payload[b.params.sc] = b.bidId;

if ((typeof b.params.host === 'string') && b.params.host.length &&
(b.params.host !== rMap.endpoint)) {
rMap.endpoint = b.params.host;
}
});

utils._each(auctionCodes, function(auctionId) {
var req = requestsMap[auctionId];
requests.push({
method: 'GET',
url: `//${req.endpoint}/${auctionId}/${req.shortCodes.join('_')}/aardvark`,
data: req.payload,
bidderRequest
});
});

return requests;
},

interpretResponse: function(serverResponse, bidRequest) {
var bidResponses = [];

if (!Array.isArray(serverResponse.body)) {
serverResponse.body = [serverResponse.body];
}

utils._each(serverResponse.body, function(rawBid) {
var bidResponse = {
requestId: rawBid.cid,
cpm: rawBid.cpm || 0,
width: rawBid.width || 0,
height: rawBid.height || 0,
currency: rawBid.currency ? rawBid.currency : AARDVARK_CURRENCY,
netRevenue: rawBid.netRevenue ? rawBid.netRevenue : true,
ttl: rawBid.ttl ? rawBid.ttl : AARDVARK_TTL,
creativeId: rawBid.creativeId || 0
};

if (rawBid.hasOwnProperty('dealId')) {
bidResponse.dealId = rawBid.dealId
}

switch (rawBid.media) {
case 'banner':
bidResponse.ad = rawBid.adm + utils.createTrackPixelHtml(decodeURIComponent(rawBid.nurl));
break;

default:
return utils.logError('bad Aardvark response (media)', rawBid);
}

bidResponses.push(bidResponse);
});

return bidResponses;
},

getUserSyncs: function(syncOptions, serverResponses, gdprConsent) {
const syncs = [];
var url = '//' + SYNC_ENDPOINT + '/cs';
var gdprApplies = false;
if (gdprConsent && (typeof gdprConsent.gdprApplies === 'boolean')) {
gdprApplies = gdprConsent.gdprApplies;
}

if (syncOptions.iframeEnabled) {
if (!hasSynced) {
hasSynced = true;
if (gdprApplies) {
url = url + '?g=1&c=' + encodeURIComponent(gdprConsent.consentString);
}
syncs.push({
type: 'iframe',
url: url
});
}
} else {
utils.logWarn('Aardvark: Please enable iframe based user sync.');
}
return syncs;
}
};

registerBidder(spec);
30 changes: 30 additions & 0 deletions modules/aardvarkBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Overview

**Module Name**: Aardvark Bidder Adapter
**Module Type**: Bidder Adapter
**Maintainer**: chris@rtk.io

# Description

Module that connects to a RTK.io Ad Units to fetch bids.

# Test Parameters
```
var adUnits = [{
mediaTypes: {
banner: {
sizes: [[300, 250]],
}
},
code: 'div-gpt-ad-1460505748561-0',
bids: [{
bidder: 'aardvark',
params: {
ai: '0000',
sc: '1234'
}
}]
}];
```
Loading

0 comments on commit 79727fd

Please sign in to comment.