Skip to content

Commit 279f72c

Browse files
Merge branch 'adapter' of github.com:greenbids/Prebid.js into adapter
2 parents 4905093 + 21a78f5 commit 279f72c

File tree

4 files changed

+115
-16
lines changed

4 files changed

+115
-16
lines changed

integrationExamples/gpt/hello_world.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
// Replace this object to test a new Adapter!
2828
bids: [{
29-
bidder: 'appnexus',
29+
bidder: 'green',
3030
params: {
3131
placementId: 13144370
3232
}

libraries/audUtils/bidderUtils.js

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ import {
55
logError
66
} from '../../src/utils.js';
77

8+
// Declare native assets
9+
const NATIVE_ASSETS = [
10+
{ id: 1, required: 1, title: { len: 100 } }, // Title
11+
{ id: 2, required: 1, img: { type: 3, w: 300, h: 250 } }, // Main image
12+
{ id: 3, required: 0, data: { type: 1, len: 140 } }, // Body
13+
{ id: 4, required: 1, data: { type: 2 } }, // Sponsored by
14+
{ id: 5, required: 1, icon: { w: 50, h: 50 } }, // Icon
15+
{ id: 6, required: 1, data: { type: 12, len: 15 } } // Call to action
16+
];
817
// Function to get Request
918
export const getBannerRequest = (bidRequests, bidderRequest, ENDPOINT) => {
1019
let request = [];
@@ -34,6 +43,7 @@ export const getBannerRequest = (bidRequests, bidderRequest, ENDPOINT) => {
3443
if (bidderRequest?.uspConsent) {
3544
deepSetValue(req, 'regs.ext.us_privacy', bidderRequest.uspConsent);
3645
}
46+
req.MediaType = getMediaType(bidReq);
3747
request.push(req);
3848
});
3949
// Return the array of request
@@ -48,6 +58,15 @@ export const getBannerRequest = (bidRequests, bidderRequest, ENDPOINT) => {
4858
}
4959
// Function to get Response
5060
export const getBannerResponse = (bidResponse, mediaType) => {
61+
return formatResponse(bidResponse, mediaType);
62+
}
63+
// Function to get NATIVE Response
64+
export const getNativeResponse = (bidResponse, bidRequest, mediaType) => {
65+
const assets = JSON.parse(JSON.parse(bidRequest.data)[0].imp[0].native.request).assets;
66+
return formatResponse(bidResponse, mediaType, assets);
67+
}
68+
// Function to format response
69+
const formatResponse = (bidResponse, mediaType, assets) => {
5170
let responseArray = [];
5271
if (bidResponse) {
5372
try {
@@ -61,14 +80,28 @@ export const getBannerResponse = (bidResponse, mediaType) => {
6180
response.height = bidReq.h;
6281
response.ad = bidReq.adm;
6382
response.meta = {
64-
advertiserDomains: bidReq.adomain
83+
advertiserDomains: bidReq.adomain,
84+
primaryCatId: bidReq.cat || [],
85+
attr: bidReq.attr || []
6586
};
6687
response.creativeId = bidReq.crid;
6788
response.netRevenue = false;
6889
response.currency = 'USD';
6990
response.ttl = 300;
7091
response.dealId = bidReq.dealId;
7192
response.mediaType = mediaType;
93+
if (mediaType == 'native') {
94+
let nativeResp = JSON.parse(bidReq.adm).native;
95+
let nativeData = {
96+
clickUrl: nativeResp.link.url,
97+
impressionTrackers: nativeResp.imptrackers
98+
};
99+
nativeResp.assets.forEach(asst => {
100+
let data = getNativeAssestData(asst, assets);
101+
nativeData[data.key] = data.value;
102+
});
103+
response.native = nativeData;
104+
}
72105
responseArray.push(response);
73106
});
74107
}
@@ -78,13 +111,18 @@ export const getBannerResponse = (bidResponse, mediaType) => {
78111
}
79112
return responseArray;
80113
}
81-
// Function to get imp
114+
// Function to get imp based on Media Type
82115
const getImpDetails = (bidReq) => {
83116
let imp = {};
84117
if (bidReq) {
85118
imp.id = bidReq.bidId;
86119
imp.bidfloor = getFloorPrice(bidReq);
87-
imp.banner = getBannerDetails(bidReq);
120+
if (bidReq.mediaTypes.native) {
121+
let assets = { assets: NATIVE_ASSETS };
122+
imp.native = { request: JSON.stringify(assets) };
123+
} else if (bidReq.mediaTypes.banner) {
124+
imp.banner = getBannerDetails(bidReq);
125+
}
88126
}
89127
return imp;
90128
}
@@ -137,3 +175,64 @@ const getUserDetails = (bidReq) => {
137175
}
138176
return user;
139177
}
178+
// Function to get asset data for response
179+
const getNativeAssestData = (params, assets) => {
180+
let response = {};
181+
if (params.title) {
182+
response.key = 'title';
183+
response.value = params.title.text;
184+
}
185+
if (params.data) {
186+
response.key = getAssetData(params.id, assets);
187+
response.value = params.data.value;
188+
}
189+
if (params.img) {
190+
response.key = getAssetImageDataType(params.id, assets);
191+
response.value = {
192+
url: params.img.url,
193+
height: params.img.h,
194+
width: params.img.w
195+
}
196+
}
197+
return response;
198+
}
199+
// Function to get asset data types based on id
200+
const getAssetData = (paramId, asset) => {
201+
let resp = '';
202+
for (let i = 0; i < asset.length; i++) {
203+
if (asset[i].id == paramId) {
204+
switch (asset[i].data.type) {
205+
case 1 : resp = 'sponsored';
206+
break;
207+
case 2 : resp = 'desc';
208+
break;
209+
case 12 : resp = 'cta';
210+
break;
211+
}
212+
}
213+
}
214+
return resp;
215+
}
216+
// Function to get image type based on the id
217+
const getAssetImageDataType = (paramId, asset) => {
218+
let resp = '';
219+
for (let i = 0; i < asset.length; i++) {
220+
if (asset[i].id == paramId) {
221+
switch (asset[i].img.type) {
222+
case 1 : resp = 'icon';
223+
break;
224+
case 3 : resp = 'image';
225+
break;
226+
}
227+
}
228+
}
229+
return resp;
230+
}
231+
// Function to get Media Type
232+
const getMediaType = (bidReq) => {
233+
if (bidReq.mediaTypes.native) {
234+
return 'native';
235+
} else if (bidReq.mediaTypes.banner) {
236+
return 'banner';
237+
}
238+
}

modules/greenbidsBidAdapter.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ export const spec = {
2424
* @return boolean True if this is a valid bid, and false otherwise.
2525
*/
2626
isBidRequestValid: function (bid) {
27-
if (typeof bid.params !== 'undefined' && parseInt(getValue(bid.params, 'gbPlacementId')) > 0) {
27+
if (typeof bid.params !== 'undefined' && parseInt(getValue(bid.params, 'placementId')) > 0) {
2828
return true;
2929
} else {
30-
logError('Greenbids bidder adapter requires gbPlacementId to be defined and a positive number');
30+
logError('Greenbids bidder adapter requires placementId to be defined and a positive number');
3131
return false;
3232
}
3333
},
@@ -117,7 +117,7 @@ export const spec = {
117117
ad: bid.ad,
118118
requestId: bid.bidId,
119119
creativeId: bid.creativeId,
120-
gbPlacementId: bid.gbPlacementId,
120+
placementId: bid.placementId,
121121
};
122122
if (bid.dealId) {
123123
bidResponse.dealId = bid.dealId
@@ -199,12 +199,12 @@ function getTimeToFirstByte(win) {
199199

200200
function cleanBidsInfo(bids) {
201201
const reqObj = {};
202-
let gbPlacementId = getValue(bids.params, 'gbPlacementId');
202+
let placementId = getValue(bids.params, 'placementId');
203203
const gpid = deepAccess(bids, 'ortb2Imp.ext.gpid');
204204
reqObj.sizes = getSizes(bids);
205205
reqObj.bidId = getBidIdParameter('bidId', bids);
206206
reqObj.bidderRequestId = getBidIdParameter('bidderRequestId', bids);
207-
reqObj.gbPlacementId = parseInt(gbPlacementId, 10);
207+
reqObj.placementId = parseInt(placementId, 10);
208208
reqObj.adUnitCode = getBidIdParameter('adUnitCode', bids);
209209
reqObj.transactionId = bids.ortb2Imp?.ext?.tid || '';
210210
if (gpid) { reqObj.gpid = gpid; }

test/spec/modules/greenbidsBidAdapter_specs.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('greenbidsBidAdapter', () => {
2626
let bid = {
2727
'bidder': 'greenbids',
2828
'params': {
29-
'gbPlacementId': 4242
29+
'placementId': 4242
3030
},
3131
'adUnitCode': 'adunit-code',
3232
'sizes': [[300, 250], [300, 600]],
@@ -51,7 +51,7 @@ describe('greenbidsBidAdapter', () => {
5151
let bidNonGBCompatible2 = {
5252
'bidder': 'greenbids',
5353
'params': {
54-
'gbPlacementId': 'toto'
54+
'placementId': 'toto'
5555
},
5656
};
5757

@@ -841,7 +841,7 @@ describe('greenbidsBidAdapter', () => {
841841
'ttl': 360,
842842
'width': 300,
843843
'creativeId': 'er2ee',
844-
'gbPlacementId': 4242
844+
'placementId': 4242
845845
}, {
846846
'ad': AD_SCRIPT,
847847
'cpm': 0.5,
@@ -851,7 +851,7 @@ describe('greenbidsBidAdapter', () => {
851851
'ttl': 360,
852852
'width': 350,
853853
'creativeId': 'fs3ff',
854-
'gbPlacementId': 4242,
854+
'placementId': 4242,
855855
'dealId': 'ABC_123',
856856
'ext': {
857857
'dsa': {
@@ -881,7 +881,7 @@ describe('greenbidsBidAdapter', () => {
881881
'ad': AD_SCRIPT,
882882
'requestId': '3ede2a3fa0db94',
883883
'creativeId': 'er2ee',
884-
'gbPlacementId': 4242
884+
'placementId': 4242
885885
}, {
886886
'cpm': 0.5,
887887
'width': 350,
@@ -904,7 +904,7 @@ describe('greenbidsBidAdapter', () => {
904904
'ad': AD_SCRIPT,
905905
'requestId': '4fef3b4gb1ec15',
906906
'creativeId': 'fs3ff',
907-
'gbPlacementId': 4242,
907+
'placementId': 4242,
908908
'dealId': 'ABC_123'
909909
}
910910
]
@@ -937,7 +937,7 @@ let bidRequests = [
937937
{
938938
'bidder': 'greenbids',
939939
'params': {
940-
'gbPlacementId': 4242
940+
'placementId': 4242
941941
},
942942
'adUnitCode': 'adunit-code',
943943
'sizes': [[300, 250], [300, 600]],

0 commit comments

Comments
 (0)