Skip to content

Commit

Permalink
Doceree AdManager Bid Adapter: initial release (#10684)
Browse files Browse the repository at this point in the history
* added DocereeAdManager bid Adapter

* adapter prod api added

* new configs added

* md file changes

* double quotes to singlequotes

* removed unwanted code

* empty commit

* bidder name lower cased and few configs added

* md file changes

* spec file changes

* empty commit

* empty commit

* issues resolved

* empty commit

* issue fixes

* minor change

* empty commit

* minor change

* empty commit

* conditional changes

* removed unwanted code

---------

Co-authored-by: sagar4596 <132884303+sagar4596@users.noreply.github.com>
  • Loading branch information
Doceree-techStack and sagar4596 authored Nov 15, 2023
1 parent be9338a commit 24ff9a6
Show file tree
Hide file tree
Showing 3 changed files with 321 additions and 0 deletions.
128 changes: 128 additions & 0 deletions modules/docereeAdManagerBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { config } from '../src/config.js';
import { BANNER } from '../src/mediaTypes.js';
const BIDDER_CODE = 'docereeadmanager';
const END_POINT = 'https://dai.doceree.com/drs/quest';

export const spec = {
code: BIDDER_CODE,
url: '',
supportedMediaTypes: [BANNER],

isBidRequestValid: (bid) => {
const { placementId } = bid.params;
return !!placementId;
},
isGdprConsentPresent: (bid) => {
const { gdpr, gdprconsent } = bid.params;
if (gdpr == '1') {
return !!gdprconsent;
}
return true;
},
buildRequests: (validBidRequests) => {
const serverRequests = [];
const { data } = config.getConfig('docereeadmanager.user') || {};

validBidRequests.forEach(function (validBidRequest) {
const payload = getPayload(validBidRequest, data);

if (!payload) {
return;
}

serverRequests.push({
method: 'POST',
url: END_POINT,
data: JSON.stringify(payload.data),
options: {
contentType: 'application/json',
withCredentials: true,
},
});
});

return serverRequests;
},
interpretResponse: (serverResponse) => {
const responseJson = serverResponse ? serverResponse.body : {};
const bidResponse = {
ad: responseJson.ad,
width: Number(responseJson.width),
height: Number(responseJson.height),
requestId: responseJson.requestId,
netRevenue: true,
ttl: 30,
cpm: responseJson.cpm,
currency: responseJson.currency,
mediaType: BANNER,
creativeId: responseJson.creativeId,
meta: {
advertiserDomains:
Array.isArray(responseJson.meta.advertiserDomains) &&
responseJson.meta.advertiserDomains.length > 0
? responseJson.meta.advertiserDomains
: [],
},
};

return [bidResponse];
},
};

function getPayload(bid, userData) {
if (!userData || !bid) {
return false;
}

const { bidId, params } = bid;
const { placementId } = params;
const {
userid,
email,
firstname,
lastname,
specialization,
hcpid,
gender,
city,
state,
zipcode,
hashedNPI,
hashedhcpid,
hashedemail,
hashedmobile,
country,
organization,
dob,
} = userData;

const data = {
userid: userid || '',
email: email || '',
firstname: firstname || '',
lastname: lastname || '',
specialization: specialization || '',
hcpid: hcpid || '',
gender: gender || '',
city: city || '',
state: state || '',
zipcode: zipcode || '',
hashedNPI: hashedNPI || '',
pb: 1,
adunit: placementId || '',
requestId: bidId || '',
hashedhcpid: hashedhcpid || '',
hashedemail: hashedemail || '',
hashedmobile: hashedmobile || '',
country: country || '',
organization: organization || '',
dob: dob || '',
userconsent: 1,
};
return {
data,
};
}

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

```
Module Name: Doceree AdManager Bidder Adapter
Module Type: Bidder Adapter
Maintainer: tech.stack@doceree.com
```

<!-- # Description -->

Connects to Doceree demand source to fetch bids.
Please use `docereeadmanager` as the bidder code.

# Test Parameters

```
var adUnits = [
{
code: 'DOC-397-1',
sizes: [
[300, 250]
],
bids: [
{
bidder: 'docereeadmanager',
params: {
placementId: 'DOC-19-1', //required
publisherUrl: document.URL || window.location.href, //optional
gdpr: '1', //optional
gdprconsent:'CPQfU1jPQfU1jG0AAAENAwCAAAAAAAAAAAAAAAAAAAAA.IGLtV_T9fb2vj-_Z99_tkeYwf95y3p-wzhheMs-8NyZeH_B4Wv2MyvBX4JiQKGRgksjLBAQdtHGlcTQgBwIlViTLMYk2MjzNKJrJEilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g', //optional
}
}
]
}
];
```

```javascript
pbjs.setBidderConfig({
bidders: ['docereeadmanager'],
config: {
docereeadmanager: {
user: {
data: {
email: 'XXX.XXX@GMAIL.COM',
firstname: 'DR. XXX',
lastname: 'XXX',
mobile: '981234XXXX',
specialization: 'Internal Medicine',
organization: 'Max Lifecare',
hcpid: '199291XXXX',
dob: '1987-08-27',
gender: 'Female',
city: 'Oildale',
state: 'California',
country: 'California',
hashedhcpid: '',
hashedemail: '',
hashedmobile: '',
userid: '7d26d8ca-233a-46c2-9d36-7c5d261e151d',
zipcode: '',
userconsent: '1',
},
},
},
},
});
```
125 changes: 125 additions & 0 deletions test/spec/modules/docereeAdManagerBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import { expect } from 'chai';
import { spec } from '../../../modules/docereeAdManagerBidAdapter.js';
import { config } from '../../../src/config.js';

describe('docereeadmanager', function () {
config.setConfig({
docereeadmanager: {
user: {
data: {
email: '',
firstname: '',
lastname: '',
mobile: '',
specialization: '',
organization: '',
hcpid: '',
dob: '',
gender: '',
city: '',
state: '',
country: '',
hashedhcpid: '',
hashedemail: '',
hashedmobile: '',
userid: '',
zipcode: '',
userconsent: '',
},
},
},
});
let bid = {
bidId: 'testing',
bidder: 'docereeadmanager',
params: {
placementId: 'DOC-19-1',
gdpr: '1',
gdprconsent:
'CPQfU1jPQfU1jG0AAAENAwCAAAAAAAAAAAAAAAAAAAAA.IGLtV_T9fb2vj-_Z99_tkeYwf95y3p-wzhheMs-8NyZeH_B4Wv2MyvBX4JiQKGRgksjLBAQdtHGlcTQgBwIlViTLMYk2MjzNKJrJEilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g',
},
};

describe('isBidRequestValid', function () {
it('Should return true if placementId is present', function () {
expect(spec.isBidRequestValid(bid)).to.be.true;
});
it('Should return false if placementId is not present', function () {
delete bid.params.placementId;
expect(spec.isBidRequestValid(bid)).to.be.false;
});
});

describe('isGdprConsentPresent', function () {
it('Should return true if gdpr consent is present', function () {
expect(spec.isGdprConsentPresent(bid)).to.be.true;
});
});

describe('buildRequests', function () {
let serverRequest = spec.buildRequests([bid]);
serverRequest = serverRequest[0];
it('Creates a ServerRequest object with method, URL and data', function () {
expect(serverRequest).to.exist;
expect(serverRequest.method).to.exist;
expect(serverRequest.url).to.exist;
expect(serverRequest.data).to.exist;
});
it('Returns POST method', function () {
expect(serverRequest.method).to.equal('POST');
});
it('Returns valid URL', function () {
expect(serverRequest.url).to.equal('https://dai.doceree.com/drs/quest');
});
});
describe('interpretResponse', function () {
it('Should interpret banner response', function () {
const banner = {
body: {
cpm: 3.576,
currency: 'USD',
width: 250,
height: 300,
ad: '<html><h3>I am an ad</h3></html>',
ttl: 30,
creativeId: 'div-1',
netRevenue: false,
bidderCode: '123',
dealId: 232,
requestId: '123',
meta: {
brandId: null,
advertiserDomains: ['https://dai.doceree.com/drs/quest'],
},
},
};
let bannerResponses = spec.interpretResponse(banner);
expect(bannerResponses).to.be.an('array').that.is.not.empty;
let dataItem = bannerResponses[0];
expect(dataItem).to.have.all.keys(
'requestId',
'cpm',
'width',
'height',
'ad',
'ttl',
'netRevenue',
'currency',
'mediaType',
'creativeId',
'meta'
);
expect(dataItem.requestId).to.equal('123');
expect(dataItem.cpm).to.equal(3.576);
expect(dataItem.width).to.equal(250);
expect(dataItem.height).to.equal(300);
expect(dataItem.ad).to.equal('<html><h3>I am an ad</h3></html>');
expect(dataItem.ttl).to.equal(30);
expect(dataItem.netRevenue).to.be.true;
expect(dataItem.currency).to.equal('USD');
expect(dataItem.creativeId).to.equal('div-1');
expect(dataItem.meta.advertiserDomains).to.be.an('array').that.is.not
.empty;
});
});
});

0 comments on commit 24ff9a6

Please sign in to comment.