44import com .iab .openrtb .request .Banner ;
55import com .iab .openrtb .request .BidRequest ;
66import com .iab .openrtb .request .Imp ;
7+ import com .iab .openrtb .request .Site ;
78import com .iab .openrtb .request .Video ;
89import com .iab .openrtb .response .Bid ;
910import com .iab .openrtb .response .BidResponse ;
2021import org .prebid .server .bidder .model .HttpRequest ;
2122import org .prebid .server .bidder .model .Result ;
2223import org .prebid .server .exception .PreBidException ;
24+ import org .prebid .server .json .DecodeException ;
2325import org .prebid .server .json .JacksonMapper ;
2426import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
2527import org .prebid .server .proto .openrtb .ext .request .alvads .AlvadsImpExt ;
3739import java .util .stream .Collectors ;
3840
3941public class AlvadsBidder implements Bidder <AlvadsRequestOrtb > {
40-
4142 private static final TypeReference <ExtPrebid <?, AlvadsImpExt >>
4243 ALVADS_EXT_TYPE_REFERENCE = new TypeReference <>() { };
4344
@@ -64,18 +65,21 @@ public final Result<List<HttpRequest<AlvadsRequestOrtb>>> makeHttpRequests(BidRe
6465 }
6566 }
6667
67- if (httpRequests .isEmpty ()) {
68- errors .add (BidderError .badInput ("found no valid impressions" ));
69- return Result .withErrors (errors );
70- }
68+ return httpRequests .isEmpty () ? Result .withErrors (errors ) : Result .of (httpRequests , errors );
69+ }
7170
72- return Result .of (httpRequests , errors );
71+ private AlvadsImpExt parseImpExt (Imp imp ) {
72+ try {
73+ return mapper .mapper ().convertValue (imp .getExt (), ALVADS_EXT_TYPE_REFERENCE ).getBidder ();
74+ } catch (IllegalArgumentException e ) {
75+ throw new PreBidException ("Missing or invalid bidder ext in impression with id: " + imp .getId ());
76+ }
7377 }
7478
7579 private HttpRequest <AlvadsRequestOrtb > makeHttpRequest (BidRequest request , Imp imp , AlvadsImpExt impExt ) {
7680 final String resolvedUrl = makeUrl (impExt );
7781 final AlvaAdsImp impObj = makeImp (imp );
78- final AlvaAdsSite siteObj = makeSite (request , impExt );
82+ final AlvaAdsSite siteObj = makeSite (request . getSite () , impExt . getPublisherUniqueId () );
7983 final AlvadsRequestOrtb alvadsRequest = AlvadsRequestOrtb .builder ()
8084 .id (request .getId ())
8185 .imp (List .of (impObj ))
@@ -95,13 +99,6 @@ private HttpRequest<AlvadsRequestOrtb> makeHttpRequest(BidRequest request, Imp i
9599 .build ();
96100 }
97101
98- private AlvadsImpExt parseImpExt (Imp imp ) {
99- try {
100- return mapper .mapper ().convertValue (imp .getExt (), ALVADS_EXT_TYPE_REFERENCE ).getBidder ();
101- } catch (IllegalArgumentException e ) {
102- throw new PreBidException ("Missing or invalid bidder ext in impression with id: " + imp .getId ());
103- }
104- }
105102
106103 private String makeUrl (AlvadsImpExt impExt ) {
107104 final String resolvedUrl = impExt .getEndpointUrl () != null ? impExt .getEndpointUrl () : endpointUrl ;
@@ -113,7 +110,7 @@ private String makeUrl(AlvadsImpExt impExt) {
113110 }
114111 }
115112
116- private AlvaAdsImp makeImp (Imp imp ) {
113+ private static AlvaAdsImp makeImp (Imp imp ) {
117114 final Banner banner = imp .getBanner ();
118115 Map <String , Object > bannerMap = null ;
119116 if (banner != null ) {
@@ -147,12 +144,12 @@ private AlvaAdsImp makeImp(Imp imp) {
147144 .build ();
148145 }
149146
150- private AlvaAdsSite makeSite (BidRequest request , AlvadsImpExt impExt ) {
151- final String page = request . getSite () != null ? request . getSite () .getPage () : null ;
147+ private static AlvaAdsSite makeSite (Site site , String publisherUniqueId ) {
148+ final String page = site != null ? site .getPage () : null ;
152149 return AlvaAdsSite .builder ()
153150 .page (page )
154151 .ref (page )
155- .publisher (Map .of ("id" , impExt . getPublisherUniqueId () ))
152+ .publisher (Map .of ("id" , publisherUniqueId ))
156153 .build ();
157154 }
158155
@@ -161,7 +158,7 @@ public final Result<List<BidderBid>> makeBids(BidderCall<AlvadsRequestOrtb> http
161158 try {
162159 final BidResponse bidResponse = mapper .decodeValue (httpCall .getResponse ().getBody (), BidResponse .class );
163160 return Result .withValues (extractBids (bidResponse , httpCall .getRequest ().getPayload ()));
164- } catch (org . prebid . server . json . DecodeException e ) {
161+ } catch (DecodeException e ) {
165162 return Result .withError (BidderError .badServerResponse ("Failed to decode BidResponse: " + e .getMessage ()));
166163 }
167164 }
@@ -175,23 +172,20 @@ private List<BidderBid> extractBids(BidResponse bidResponse, AlvadsRequestOrtb r
175172
176173 private List <BidderBid > bidsFromResponse (BidResponse bidResponse , AlvadsRequestOrtb request ) {
177174 return bidResponse .getSeatbid ().stream ()
178- .filter (Objects ::nonNull )
179- .map (SeatBid ::getBid )
180- .filter (Objects ::nonNull )
181- .flatMap (Collection ::stream )
182- .filter (Objects ::nonNull )
183- .map (bid -> {
184- final AlvaAdsImp imp = request .getImp ().stream ()
185- .filter (i -> i .getId ().equals (bid .getImpid ()))
186- .findFirst ()
187- .orElse (null );
188-
189- return BidderBid .of (bid , getBidType (bid , imp ), bidResponse .getCur ());
190- })
191- .filter (Objects ::nonNull )
175+ .flatMap (seatBid -> seatBid .getBid ().stream ())
176+ .map (bid -> makeBid (bid , request , bidResponse .getCur ()))
192177 .toList ();
193178 }
194179
180+ private BidderBid makeBid (Bid bid , AlvadsRequestOrtb request , String currency ) {
181+ final AlvaAdsImp imp = request .getImp ().stream ()
182+ .filter (i -> i .getId ().equals (bid .getImpid ()))
183+ .findFirst ()
184+ .orElse (null );
185+
186+ return BidderBid .of (bid , getBidType (bid , imp ), currency );
187+ }
188+
195189 private BidType getBidType (Bid bid , AlvaAdsImp imp ) {
196190 if (imp != null && imp .getVideo () != null ) {
197191 return BidType .video ;
0 commit comments