Skip to content

Commit

Permalink
Create GXOne Bid Adapter and tests for it (#2540)
Browse files Browse the repository at this point in the history
  • Loading branch information
GeronimoGXOne authored and jsnellbaker committed May 15, 2018
1 parent 6bfed30 commit 3436a13
Show file tree
Hide file tree
Showing 3 changed files with 474 additions and 0 deletions.
141 changes: 141 additions & 0 deletions modules/gxoneBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import * as utils from 'src/utils';
import {registerBidder} from 'src/adapters/bidderFactory';
const BIDDER_CODE = 'gxone';
const ENDPOINT_URL = '//ads.gx1as.com/hb';
const TIME_TO_LIVE = 360;
const ADAPTER_SYNC_URL = '//ads.gx1as.com/push_sync';
const LOG_ERROR_MESS = {
noAuid: 'Bid from response has no auid parameter - ',
noAdm: 'Bid from response has no adm parameter - ',
noBid: 'Array of bid objects is empty',
noPlacementCode: 'Can\'t find in requested bids the bid with auid - ',
emptyUids: 'Uids should be not empty',
emptySeatbid: 'Seatbid array from response has empty item',
emptyResponse: 'Response is empty',
hasEmptySeatbidArray: 'Response has empty seatbid array',
hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - '
};

/**
* GXOne Bid Adapter.
* Contact: olivier@geronimo.co
*
*/
export const spec = {
code: BIDDER_CODE,

isBidRequestValid: function(bid) {
return !!bid.params.uid;
},

buildRequests: function(validBidRequests) {
const auids = [];
const bidsMap = {};
const bids = validBidRequests || [];
let priceType = 'net';
let reqId;

bids.forEach(bid => {
if (bid.params.priceType === 'gross') {
priceType = 'gross';
}
if (!bidsMap[bid.params.uid]) {
bidsMap[bid.params.uid] = [bid];
auids.push(bid.params.uid);
} else {
bidsMap[bid.params.uid].push(bid);
}
reqId = bid.bidderRequestId;
});

const payload = {
u: utils.getTopWindowUrl(),
pt: priceType,
auids: auids.join(','),
r: reqId,
};

return {
method: 'GET',
url: ENDPOINT_URL,
data: utils.parseQueryStringParameters(payload).replace(/\&$/, ''),
bidsMap: bidsMap,
};
},

interpretResponse: function(serverResponse, bidRequest) {
serverResponse = serverResponse && serverResponse.body
const bidResponses = [];
const bidsMap = bidRequest.bidsMap;
const priceType = bidRequest.data.pt;

let errorMessage;

if (!serverResponse) errorMessage = LOG_ERROR_MESS.emptyResponse;
else if (serverResponse.seatbid && !serverResponse.seatbid.length) {
errorMessage = LOG_ERROR_MESS.hasEmptySeatbidArray;
}

if (!errorMessage && serverResponse.seatbid) {
serverResponse.seatbid.forEach(respItem => {
_addBidResponse(_getBidFromResponse(respItem), bidsMap, priceType, bidResponses);
});
}
if (errorMessage) utils.logError(errorMessage);
return bidResponses;
},

getUserSyncs: function(syncOptions) {
if (syncOptions.pixelEnabled) {
return [{
type: 'image',
url: ADAPTER_SYNC_URL
}];
}
}
}

function _getBidFromResponse(respItem) {
if (!respItem) {
utils.logError(LOG_ERROR_MESS.emptySeatbid);
} else if (!respItem.bid) {
utils.logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
} else if (!respItem.bid[0]) {
utils.logError(LOG_ERROR_MESS.noBid);
}
return respItem && respItem.bid && respItem.bid[0];
}

function _addBidResponse(serverBid, bidsMap, priceType, bidResponses) {
if (!serverBid) return;
let errorMessage;
if (!serverBid.auid) errorMessage = LOG_ERROR_MESS.noAuid + JSON.stringify(serverBid);
if (!serverBid.adm) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);
else {
const awaitingBids = bidsMap[serverBid.auid];
if (awaitingBids) {
awaitingBids.forEach(bid => {
const bidResponse = {
requestId: bid.bidId, // bid.bidderRequestId,
cpm: serverBid.price,
width: serverBid.w,
height: serverBid.h,
creativeId: serverBid.auid, // bid.bidId,
currency: 'USD',
netRevenue: priceType !== 'gross',
ttl: TIME_TO_LIVE,
ad: serverBid.adm,
dealId: serverBid.dealid
};
bidResponses.push(bidResponse);
});
} else {
errorMessage = LOG_ERROR_MESS.noPlacementCode + serverBid.auid;
}
}
if (errorMessage) {
utils.logError(errorMessage);
}
}

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

Module Name: GXOne Bidder Adapter
Module Type: Bidder Adapter
Maintainer: olivier@geronimo.co

# Description

Module that connects to GXOne demand source to fetch bids.

# Test Parameters
```
var adUnits = [
{
code: 'test-div',
sizes: [[300, 250]],
bids: [
{
bidder: "gxone",
params: {
uid: '2',
priceType: 'gross' // by default is 'net'
}
}
]
},{
code: 'test-div',
sizes: [[728, 90]],
bids: [
{
bidder: "gxone",
params: {
uid: 9,
priceType: 'gross'
}
}
]
}
];
```
Loading

0 comments on commit 3436a13

Please sign in to comment.