Skip to content

Commit

Permalink
New Bidder: dexerto (#12182)
Browse files Browse the repository at this point in the history
* New Bidder: dexerto

* added page property in site object.

* made requested changes

* handled response when no bid.
  • Loading branch information
pranavsheth committed Sep 30, 2024
1 parent 4991e6e commit 447a3c4
Show file tree
Hide file tree
Showing 4 changed files with 407 additions and 0 deletions.
139 changes: 139 additions & 0 deletions libraries/audUtils/bidderUtils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
import {
deepAccess,
deepSetValue,
generateUUID,
logError
} from '../../src/utils.js';

// Function to get Request
export const getBannerRequest = (bidRequests, bidderRequest, ENDPOINT) => {
let request = [];
// Loop for each bid request
bidRequests.forEach(bidReq => {
let guid = generateUUID();
const req = {
id: guid,
imp: [getImpDetails(bidReq)],
placementId: bidReq.params.placement_id,
site: getSiteDetails(bidderRequest),
user: getUserDetails(bidReq)
};
// Fetch GPP Consent from bidderRequest
if (bidderRequest && bidderRequest.gppConsent && bidderRequest.gppConsent.gppString) {
deepSetValue(req, 'regs.gpp', bidderRequest.gppConsent.gppString);
deepSetValue(req, 'regs.gpp_sid', bidderRequest.gppConsent.applicableSections);
} else if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.regs && bidderRequest.ortb2.regs.gpp) {
deepSetValue(req, 'regs.gpp', bidderRequest.ortb2.regs.gpp);
deepSetValue(req, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid);
}
// Fetch coppa compliance from bidderRequest
if (bidderRequest && bidderRequest.ortb2 && bidderRequest.ortb2.regs && bidderRequest.ortb2.regs.coppa) {
deepSetValue(req, 'regs.coppa', 1);
}
// Fetch uspConsent from bidderRequest
if (bidderRequest?.uspConsent) {
deepSetValue(req, 'regs.ext.us_privacy', bidderRequest.uspConsent);
}
request.push(req);
});
// Return the array of request
return {
method: 'POST',
url: ENDPOINT,
data: JSON.stringify(request),
options: {
contentType: 'application/json',
}
};
}
// Function to get Response
export const getBannerResponse = (bidResponse, mediaType) => {
let responseArray = [];
if (bidResponse) {
try {
let bidResp = deepAccess(bidResponse, 'body.seatbid', []);
if (bidResp && bidResp[0] && bidResp[0].bid) {
bidResp[0].bid.forEach(bidReq => {
let response = {};
response.requestId = bidReq.impid;
response.cpm = bidReq.price;
response.width = bidReq.w;
response.height = bidReq.h;
response.ad = bidReq.adm;
response.meta = {
advertiserDomains: bidReq.adomain
};
response.creativeId = bidReq.crid;
response.netRevenue = false;
response.currency = 'USD';
response.ttl = 300;
response.dealId = bidReq.dealId;
response.mediaType = mediaType;
responseArray.push(response);
});
}
} catch (e) {
logError(e);
}
}
return responseArray;
}
// Function to get imp
const getImpDetails = (bidReq) => {
let imp = {};
if (bidReq) {
imp.id = bidReq.bidId;
imp.bidfloor = getFloorPrice(bidReq);
imp.banner = getBannerDetails(bidReq);
}
return imp;
}
// Function to get banner object
const getBannerDetails = (bidReq) => {
let response = {};
if (bidReq.mediaTypes.banner) {
// Fetch width and height from MediaTypes object, if not provided in bidReq params
if (bidReq.mediaTypes.banner.sizes && !bidReq.params.height && !bidReq.params.width) {
let sizes = bidReq.mediaTypes.banner.sizes;
if (sizes.length > 0) {
response.h = sizes[0][1];
response.w = sizes[0][0];
}
} else {
response.h = bidReq.params.height;
response.w = bidReq.params.width;
}
}
return response;
}
// Function to get floor price
const getFloorPrice = (bidReq) => {
let bidfloor = deepAccess(bidReq, 'params.bid_floor', 0);
return bidfloor;
}
// Function to get site object
const getSiteDetails = (bidderRequest) => {
let page = '';
let name = '';
if (bidderRequest && bidderRequest.refererInfo) {
page = bidderRequest.refererInfo.page;
name = bidderRequest.refererInfo.domain;
}
return {page: page, name: name};
}
// Function to build the user object
const getUserDetails = (bidReq) => {
let user = {};
if (bidReq && bidReq.ortb2 && bidReq.ortb2.user) {
user.id = bidReq.ortb2.user.id ? bidReq.ortb2.user.id : '';
user.buyeruid = bidReq.ortb2.user.buyeruid ? bidReq.ortb2.user.buyeruid : '';
user.keywords = bidReq.ortb2.user.keywords ? bidReq.ortb2.user.keywords : '';
user.customdata = bidReq.ortb2.user.customdata ? bidReq.ortb2.user.customdata : '';
} else {
user.id = '';
user.buyeruid = '';
user.keywords = '';
user.customdata = '';
}
return user;
}
31 changes: 31 additions & 0 deletions modules/dexertoBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import {
BANNER
} from '../src/mediaTypes.js';
import {
registerBidder
} from '../src/adapters/bidderFactory.js';
import {
getBannerRequest,
getBannerResponse,
} from '../libraries/audUtils/bidderUtils.js';

const ENDPOINT_URL = 'https://rtb.dexerto.media/hb/dexerto';
// Export const spec
export const spec = {
code: 'dexerto',
supportedMediaTypes: BANNER,
// Determines whether or not the given bid request is valid
isBidRequestValid: (bid) => {
return !!(bid.params.placement_id);
},
// Make a server request from the list of BidRequests
buildRequests: (bidRequests, bidderRequest) => {
return getBannerRequest(bidRequests, bidderRequest, ENDPOINT_URL);
},
// Unpack the response from the server into a list of bids.
interpretResponse: (bidResponse, bidRequest) => {
return getBannerResponse(bidResponse, BANNER);
}
}

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

```
Module Name: Dexerto Bidder Adapter
Module Type: Bidder Adapter
Maintainer: [email protected]
```

# Description

Dexerto currently supports the BANNER type ads through prebid js

Module that connects to dexerto's demand sources.

# Banner Test Request
```
var adUnits = [
{
code: 'display-ad',
mediaTypes: {
banner: {
sizes: [[300, 250]],
}
}
bids: [
{
bidder: 'dexerto',
params: {
placement_id: 110003, // Required parameter
width: 300, // Optional parameter
height: 250, // Optional parameter
bid_floor: 0.1 // Optional parameter
}
}
]
}
];
```
Loading

0 comments on commit 447a3c4

Please sign in to comment.