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,51 @@ 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 ()
205
209
.map (SeatBid ::getBid )
206
210
.flatMap (Collection ::stream )
207
- .map (bid -> prepareBid (bid , bidRequest ))
208
- .map (bid -> BidderBid .of (bid , getBidType (bid .getImpid (), bidRequest .getImp ()), bidResponse .getCur ()))
211
+ .map (bid -> toBidderBid (bid , bidRequest , bidResponse ))
209
212
.collect (Collectors .toList ());
210
213
}
211
214
215
+ private BidderBid toBidderBid (Bid bid , BidRequest bidRequest , BidResponse bidResponse ) {
216
+ final BidType bidType = getBidType (bid .getImpid (), bidRequest .getImp ());
217
+
218
+ final ExtBidPrebid bidExt = parseBidExt (bid .getExt ());
219
+ final boolean bidHasNoSizes = bid .getH () == null || bid .getW () == null ;
220
+ final Banner banner = bidRequest .getImp ().get (0 ).getBanner ();
221
+ if ((bidHasNoSizes && banner != null ) || (bidExt != null && bidExt .getVideo () != null )) {
222
+ final Bid .BidBuilder bidBuilder = bid .toBuilder ();
223
+
224
+ if (bidHasNoSizes && banner != null ) {
225
+ bidBuilder
226
+ .w (banner .getW ())
227
+ .h (banner .getH ())
228
+ .build ();
229
+ }
230
+
231
+ if (bidType == BidType .video ) {
232
+ if (bidExt != null && bidExt .getVideo () != null ) {
233
+ final ExtBidPrebidVideo video = bidExt .getVideo ();
234
+ bidBuilder .ext (toBidExt (video ));
235
+ if (CollectionUtils .isEmpty (bid .getCat ())) {
236
+ bidBuilder .cat (Collections .singletonList (video .getPrimaryCategory ())).build ();
237
+ }
238
+ }
239
+ }
240
+ bid = bidBuilder .build ();
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,16 @@ 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 ? null : mapper .mapper ().treeToValue (bidExt , ExtBidPrebid .class );
266
+ } catch (JsonProcessingException e ) {
267
+ throw new PreBidException (e .getMessage ());
238
268
}
239
- return bid ;
240
269
}
270
+
271
+ private ObjectNode toBidExt (ExtBidPrebidVideo extBidVideo ) {
272
+ return mapper .mapper ().valueToTree (ExtBidPrebidVideo .of (extBidVideo .getDuration (), null ));
273
+ }
274
+
241
275
}
0 commit comments