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 ;
@@ -194,21 +198,52 @@ public Result<List<BidderBid>> makeBids(HttpCall<BidRequest> httpCall, BidReques
194
198
}
195
199
}
196
200
197
- private static List <BidderBid > extractBids (BidResponse bidResponse , BidRequest bidRequest ) {
201
+ private List <BidderBid > extractBids (BidResponse bidResponse , BidRequest bidRequest ) {
198
202
return bidResponse == null || CollectionUtils .isEmpty (bidResponse .getSeatbid ())
199
203
? Collections .emptyList ()
200
204
: bidsFromResponse (bidResponse , bidRequest );
201
205
}
202
206
203
- private static List <BidderBid > bidsFromResponse (BidResponse bidResponse , BidRequest bidRequest ) {
207
+ private List <BidderBid > bidsFromResponse (BidResponse bidResponse , BidRequest bidRequest ) {
204
208
return bidResponse .getSeatbid ().stream ()
209
+ .filter (Objects ::nonNull )
205
210
.map (SeatBid ::getBid )
211
+ .filter (Objects ::nonNull )
206
212
.flatMap (Collection ::stream )
207
- .map (bid -> prepareBid (bid , bidRequest ))
208
- .map (bid -> BidderBid .of (bid , getBidType (bid .getImpid (), bidRequest .getImp ()), bidResponse .getCur ()))
213
+ .map (bid -> toBidderBid (bid , bidRequest , bidResponse ))
209
214
.collect (Collectors .toList ());
210
215
}
211
216
217
+ private BidderBid toBidderBid (Bid bid , BidRequest bidRequest , BidResponse bidResponse ) {
218
+ final BidType bidType = getBidType (bid .getImpid (), bidRequest .getImp ());
219
+ final ObjectNode bidExt = bid .getExt ();
220
+ final ExtBidPrebid extPrebid = bidExt != null ? parseBidExt (bidExt ) : null ;
221
+ final ExtBidPrebidVideo extVideo = extPrebid != null ? extPrebid .getVideo () : null ;
222
+ final boolean bidHasNoSizes = bid .getH () == null || bid .getW () == null ;
223
+ final Banner banner = bidRequest .getImp ().get (0 ).getBanner ();
224
+
225
+ if ((bidHasNoSizes && banner != null ) || (extVideo != null )) {
226
+ final Bid .BidBuilder bidBuilder = bid .toBuilder ();
227
+
228
+ if (bidType == BidType .banner && bidHasNoSizes && banner != null ) {
229
+ bidBuilder
230
+ .w (banner .getW ())
231
+ .h (banner .getH ())
232
+ .build ();
233
+ }
234
+
235
+ if (bidType == BidType .video && extVideo != null ) {
236
+ bidBuilder .ext (resolveBidExt (extVideo .getDuration ()));
237
+ if (CollectionUtils .isEmpty (bid .getCat ())) {
238
+ bidBuilder .cat (Collections .singletonList (extVideo .getPrimaryCategory ())).build ();
239
+ }
240
+ }
241
+ bid = bidBuilder .build ();
242
+ }
243
+
244
+ return BidderBid .of (bid , bidType , bidResponse .getCur ());
245
+ }
246
+
212
247
private static BidType getBidType (String impId , List <Imp > imps ) {
213
248
for (Imp imp : imps ) {
214
249
if (imp .getId ().equals (impId )) {
@@ -226,16 +261,17 @@ private static BidType getBidType(String impId, List<Imp> imps) {
226
261
throw new PreBidException (String .format ("Unmatched impression id %s" , impId ));
227
262
}
228
263
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 ();
264
+ private ExtBidPrebid parseBidExt (ObjectNode bidExt ) {
265
+ try {
266
+ return mapper .mapper ().treeToValue (bidExt , ExtBidPrebid .class );
267
+ } catch (JsonProcessingException e ) {
268
+ throw new PreBidException (e .getMessage ());
238
269
}
239
- return bid ;
270
+ }
271
+
272
+ private ObjectNode resolveBidExt (Integer duration ) {
273
+ return mapper .mapper ().valueToTree (ExtBidPrebid .builder ()
274
+ .video (ExtBidPrebidVideo .of (duration , null ))
275
+ .build ());
240
276
}
241
277
}
0 commit comments