1
1
package org .prebid .server .bidder .ix ;
2
2
3
+ import com .fasterxml .jackson .core .JsonProcessingException ;
3
4
import com .fasterxml .jackson .core .type .TypeReference ;
5
+ import com .fasterxml .jackson .databind .node .ObjectNode ;
4
6
import com .iab .openrtb .request .Banner ;
5
7
import com .iab .openrtb .request .BidRequest ;
6
8
import com .iab .openrtb .request .Format ;
24
26
import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
25
27
import org .prebid .server .proto .openrtb .ext .request .ix .ExtImpIx ;
26
28
import org .prebid .server .proto .openrtb .ext .response .BidType ;
29
+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebid ;
30
+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebidVideo ;
27
31
import org .prebid .server .util .HttpUtil ;
28
32
29
33
import java .util .ArrayList ;
34
+ import java .util .Arrays ;
30
35
import java .util .Collection ;
31
36
import java .util .Collections ;
32
37
import java .util .List ;
@@ -46,6 +51,8 @@ public class IxBidder implements Bidder<BidRequest> {
46
51
// maximum number of bid requests
47
52
private static final int REQUEST_LIMIT = 20 ;
48
53
54
+ private static final String PREBID = "prebid" ;
55
+
49
56
private final String endpointUrl ;
50
57
private final JacksonMapper mapper ;
51
58
@@ -194,21 +201,48 @@ public Result<List<BidderBid>> makeBids(HttpCall<BidRequest> httpCall, BidReques
194
201
}
195
202
}
196
203
197
- private static List <BidderBid > extractBids (BidResponse bidResponse , BidRequest bidRequest ) {
204
+ private List <BidderBid > extractBids (BidResponse bidResponse , BidRequest bidRequest ) {
198
205
return bidResponse == null || CollectionUtils .isEmpty (bidResponse .getSeatbid ())
199
206
? Collections .emptyList ()
200
207
: bidsFromResponse (bidResponse , bidRequest );
201
208
}
202
209
203
- private static List <BidderBid > bidsFromResponse (BidResponse bidResponse , BidRequest bidRequest ) {
210
+ private List <BidderBid > bidsFromResponse (BidResponse bidResponse , BidRequest bidRequest ) {
204
211
return bidResponse .getSeatbid ().stream ()
205
212
.map (SeatBid ::getBid )
206
213
.flatMap (Collection ::stream )
207
- .map (bid -> prepareBid (bid , bidRequest ))
208
- .map (bid -> BidderBid .of (bid , getBidType (bid .getImpid (), bidRequest .getImp ()), bidResponse .getCur ()))
214
+ .map (bid -> toBidderBid (bid , bidRequest , bidResponse ))
209
215
.collect (Collectors .toList ());
210
216
}
211
217
218
+ private BidderBid toBidderBid (Bid bid , BidRequest bidRequest , BidResponse bidResponse ) {
219
+ final BidType bidType = getBidType (bid .getImpid (), bidRequest .getImp ());
220
+
221
+ final boolean bidHasNoSizes = bid .getH () == null || bid .getW () == null ;
222
+ final Banner banner = bidRequest .getImp ().get (0 ).getBanner ();
223
+ if (bidHasNoSizes && banner != null ) {
224
+ bid = bid .toBuilder ()
225
+ .w (banner .getW ())
226
+ .h (banner .getH ())
227
+ .build ();
228
+ }
229
+
230
+ final ExtBidPrebid bidExt = parseBidExt (bid .getExt ());
231
+ if (bidExt != null && bidExt .getVideo () != null ) {
232
+ final ExtBidPrebidVideo video = bidExt .getVideo ();
233
+ bid = bid .toBuilder ()
234
+ .ext (toBidderBidExt (video ))
235
+ .build ();
236
+ if (bid .getCat ().size () == 0 ) {
237
+ bid = bid .toBuilder ()
238
+ .cat (Arrays .asList (video .getPrimaryCategory ()))
239
+ .build ();
240
+ }
241
+ }
242
+
243
+ return BidderBid .of (bid , bidType , bidResponse .getCur ());
244
+ }
245
+
212
246
private static BidType getBidType (String impId , List <Imp > imps ) {
213
247
for (Imp imp : imps ) {
214
248
if (imp .getId ().equals (impId )) {
@@ -226,16 +260,18 @@ private static BidType getBidType(String impId, List<Imp> imps) {
226
260
throw new PreBidException (String .format ("Unmatched impression id %s" , impId ));
227
261
}
228
262
229
- private static Bid prepareBid (Bid bid , BidRequest bidRequest ) {
230
- // Current implementation ensure that we have at least one imp in request
231
- final boolean bidHasNoSizes = bid .getH () == null || bid .getW () == null ;
232
- final Banner banner = bidRequest .getImp ().get (0 ).getBanner ();
233
- if (bidHasNoSizes && banner != null ) {
234
- return bid .toBuilder ()
235
- .w (banner .getW ())
236
- .h (banner .getH ())
237
- .build ();
263
+ private ExtBidPrebid parseBidExt (ObjectNode bidExt ) {
264
+ try {
265
+ return bidExt == null
266
+ ? null
267
+ : mapper .mapper ().treeToValue (bidExt , ExtBidPrebid .class );
268
+ } catch (JsonProcessingException e ) {
269
+ throw new PreBidException (e .getMessage ());
238
270
}
239
- return bid ;
240
271
}
272
+
273
+ private ObjectNode toBidderBidExt (ExtBidPrebidVideo extBidVideo ) {
274
+ return mapper .mapper ().valueToTree (ExtBidPrebidVideo .of (extBidVideo .getDuration (), null ));
275
+ }
276
+
241
277
}
0 commit comments