1
1
import { getValue , logError , deepAccess , getBidIdParameter , isArray } from '../src/utils.js' ;
2
2
import { loadExternalScript } from '../src/adloader.js' ;
3
- import { registerBidder } from '../src/adapters/bidderFactory.js' ;
4
-
5
- const ENDPOINT_URL = 'https://layer.serve.admatic.com.tr/pb' ;
3
+ import { registerBidder } from '../src/adapters/bidderFactory.js' ;
4
+ import { BANNER , VIDEO } from '../src/mediaTypes.js' ;
6
5
const SYNC_URL = 'https://cdn.serve.admatic.com.tr/showad/sync.js' ;
7
- const BIDDER_CODE = 'admatic' ;
8
6
9
7
export const spec = {
10
8
code : 'admatic' ,
9
+ aliases : [
10
+ { code : 'pixad' }
11
+ ] ,
11
12
supportedMediaTypes : [ 'video' , 'banner' ] ,
12
13
/**
13
14
* Determines whether or not the given bid request is valid.
@@ -19,11 +20,12 @@ export const spec = {
19
20
let isValid = false ;
20
21
if ( typeof bid . params !== 'undefined' ) {
21
22
let isValidNetworkId = _validateId ( getValue ( bid . params , 'networkId' ) ) ;
22
- isValid = isValidNetworkId ; // && isValidTypeId;
23
+ let isValidHost = _validateString ( getValue ( bid . params , 'host' ) ) ;
24
+ isValid = isValidNetworkId && isValidHost ;
23
25
}
24
26
25
27
if ( ! isValid ) {
26
- logError ( 'AdMatic networkId parameters are required. Bid aborted.' ) ;
28
+ logError ( ` ${ bid . bidder } networkId and host parameters are required. Bid aborted.` ) ;
27
29
}
28
30
return isValid ;
29
31
} ,
@@ -35,11 +37,13 @@ export const spec = {
35
37
*/
36
38
buildRequests : function ( validBidRequests , bidderRequest ) {
37
39
const bids = validBidRequests . map ( buildRequestObject ) ;
40
+ const bidderName = validBidRequests [ 0 ] . bidder ;
38
41
const networkId = getValue ( validBidRequests [ 0 ] . params , 'networkId' ) ;
42
+ const host = getValue ( validBidRequests [ 0 ] . params , 'host' ) ;
39
43
const currency = getValue ( validBidRequests [ 0 ] . params , 'currency' ) || 'TRY' ;
40
44
41
45
setTimeout ( ( ) => {
42
- loadExternalScript ( SYNC_URL , BIDDER_CODE ) ;
46
+ loadExternalScript ( SYNC_URL , bidderName ) ;
43
47
} , bidderRequest . timeout ) ;
44
48
45
49
const payload = {
@@ -58,14 +62,14 @@ export const spec = {
58
62
imp : bids ,
59
63
ext : {
60
64
'cur' : currency ,
61
- 'type ' : 'admatic'
65
+ 'bidder ' : bidderName
62
66
}
63
67
} ;
64
68
65
69
const payloadString = JSON . stringify ( payload ) ;
66
70
return {
67
71
method : 'POST' ,
68
- url : ENDPOINT_URL ,
72
+ url : `https:// ${ host } /pb?bidder= ${ bidderName } ` ,
69
73
data : payloadString ,
70
74
options : {
71
75
contentType : 'application/json'
@@ -96,22 +100,72 @@ export const spec = {
96
100
advertiserDomains : bid && bid . adomain ? bid . adomain : [ ]
97
101
} ,
98
102
ttl : 360 ,
99
- bidder : 'admatic' ,
103
+ bidder : JSON . parse ( request . data ) . ext . bidder ,
100
104
timeToRespond : 1 ,
101
105
requestTimestamp : 1
102
106
} ;
107
+
103
108
bidResponses . push ( resbid ) ;
104
109
} ) ;
105
110
} ;
106
111
return bidResponses ;
107
112
}
108
113
} ;
109
114
115
+ registerBidder ( spec ) ;
116
+
117
+ function enrichSlotWithFloors ( slot , bidRequest ) {
118
+ try {
119
+ const slotFloors = { } ;
120
+
121
+ if ( bidRequest . getFloor ) {
122
+ if ( bidRequest . mediaTypes ?. banner ) {
123
+ slotFloors . banner = { } ;
124
+ const bannerSizes = parseSizes ( deepAccess ( bidRequest , 'mediaTypes.banner.sizes' ) )
125
+ bannerSizes . forEach ( bannerSize => slotFloors . banner [ parseSize ( bannerSize ) . toString ( ) ] = bidRequest . getFloor ( { size : bannerSize , mediaType : BANNER } ) ) ;
126
+ }
127
+
128
+ if ( bidRequest . mediaTypes ?. video ) {
129
+ slotFloors . video = { } ;
130
+ const videoSizes = parseSizes ( deepAccess ( bidRequest , 'mediaTypes.video.playerSize' ) )
131
+ videoSizes . forEach ( videoSize => slotFloors . video [ parseSize ( videoSize ) . toString ( ) ] = bidRequest . getFloor ( { size : videoSize , mediaType : VIDEO } ) ) ;
132
+ }
133
+
134
+ if ( Object . keys ( slotFloors ) . length > 0 ) {
135
+ if ( ! slot ) {
136
+ slot = { }
137
+ }
138
+ Object . assign ( slot , {
139
+ floors : slotFloors
140
+ } ) ;
141
+ }
142
+ }
143
+ } catch ( e ) {
144
+ logError ( 'Could not parse floors from Prebid: ' + e ) ;
145
+ }
146
+ }
147
+
148
+ function parseSizes ( sizes , parser = s => s ) {
149
+ if ( sizes == undefined ) {
150
+ return [ ] ;
151
+ }
152
+ if ( Array . isArray ( sizes [ 0 ] ) ) { // is there several sizes ? (ie. [[728,90],[200,300]])
153
+ return sizes . map ( size => parser ( size ) ) ;
154
+ }
155
+ return [ parser ( sizes ) ] ; // or a single one ? (ie. [728,90])
156
+ }
157
+
158
+ function parseSize ( size ) {
159
+ return size [ 0 ] + 'x' + size [ 1 ] ;
160
+ }
161
+
110
162
function buildRequestObject ( bid ) {
111
163
const reqObj = { } ;
112
164
reqObj . size = getSizes ( bid ) ;
113
165
reqObj . id = getBidIdParameter ( 'bidId' , bid ) ;
114
- reqObj . floor = getValue ( bid . params , 'floor' ) || 0.01 ;
166
+
167
+ enrichSlotWithFloors ( reqObj , bid ) ;
168
+
115
169
return reqObj ;
116
170
}
117
171
@@ -144,4 +198,8 @@ function _validateId(id) {
144
198
return ( parseInt ( id ) > 0 ) ;
145
199
}
146
200
201
+ function _validateString ( str ) {
202
+ return ( typeof str == 'string' ) ;
203
+ }
204
+
147
205
registerBidder ( spec ) ;
0 commit comments