44import com .iab .openrtb .request .BidRequest ;
55import com .iab .openrtb .request .Device ;
66import com .iab .openrtb .request .Imp ;
7+ import com .iab .openrtb .response .Bid ;
78import com .iab .openrtb .response .BidResponse ;
89import com .iab .openrtb .response .SeatBid ;
910import io .vertx .core .MultiMap ;
@@ -104,20 +105,27 @@ private static MultiMap makeHeaders(Device device) {
104105 public Result <List <BidderBid >> makeBids (BidderCall <BidRequest > httpCall , BidRequest bidRequest ) {
105106 try {
106107 final BidResponse bidResponse = mapper .decodeValue (httpCall .getResponse ().getBody (), BidResponse .class );
107- return Result .of (extractBids (bidRequest , bidResponse ), Collections .emptyList ());
108- } catch (DecodeException | PreBidException e ) {
108+ final List <BidderError > errors = new ArrayList <>();
109+ return Result .of (extractBids (bidRequest , bidResponse , errors ), errors );
110+ } catch (DecodeException e ) {
109111 return Result .withError (BidderError .badServerResponse (e .getMessage ()));
110112 }
111113 }
112114
113- private static List <BidderBid > extractBids (BidRequest bidRequest , BidResponse bidResponse ) {
115+ private static List <BidderBid > extractBids (BidRequest bidRequest ,
116+ BidResponse bidResponse ,
117+ List <BidderError > errors ) {
118+
114119 if (bidResponse == null || CollectionUtils .isEmpty (bidResponse .getSeatbid ())) {
115120 return Collections .emptyList ();
116121 }
117- return bidsFromResponse (bidRequest , bidResponse );
122+ return bidsFromResponse (bidRequest , bidResponse , errors );
118123 }
119124
120- private static List <BidderBid > bidsFromResponse (BidRequest bidRequest , BidResponse bidResponse ) {
125+ private static List <BidderBid > bidsFromResponse (BidRequest bidRequest ,
126+ BidResponse bidResponse ,
127+ List <BidderError > errors ) {
128+
121129 final Map <String , Imp > imps = bidRequest .getImp ().stream ()
122130 .collect (Collectors .toMap (Imp ::getId , Function .identity ()));
123131
@@ -127,11 +135,17 @@ private static List<BidderBid> bidsFromResponse(BidRequest bidRequest, BidRespon
127135 .filter (Objects ::nonNull )
128136 .flatMap (Collection ::stream )
129137 .filter (Objects ::nonNull )
130- .map (bid -> BidderBid .of (bid , getBidType (bid .getImpid (), imps ), bidResponse .getCur ()))
138+ .map (bid -> makeBid (bid , imps , bidResponse .getCur (), errors ))
139+ .filter (Objects ::nonNull )
131140 .collect (Collectors .toList ());
132141 }
133142
134- private static BidType getBidType (String impId , Map <String , Imp > imps ) {
143+ private static BidderBid makeBid (Bid bid , Map <String , Imp > imps , String currency , List <BidderError > errors ) {
144+ final BidType bidType = getBidType (bid .getImpid (), imps , errors );
145+ return bidType == null ? null : BidderBid .of (bid , bidType , currency );
146+ }
147+
148+ private static BidType getBidType (String impId , Map <String , Imp > imps , List <BidderError > errors ) {
135149 final Imp imp = imps .get (impId );
136150 if (imp != null ) {
137151 if (imp .getBanner () != null ) {
@@ -143,6 +157,8 @@ private static BidType getBidType(String impId, Map<String, Imp> imps) {
143157 }
144158 }
145159
146- throw new PreBidException ("The impression with ID %s is not present into the request" .formatted (impId ));
160+ errors .add (BidderError .badServerResponse ("The impression with ID %s is not present into the request"
161+ .formatted (impId )));
162+ return null ;
147163 }
148164}
0 commit comments