11package org .prebid .server .bidder .oms ;
22
3+ import com .fasterxml .jackson .core .type .TypeReference ;
34import com .iab .openrtb .request .BidRequest ;
5+ import com .iab .openrtb .request .Imp ;
6+ import com .iab .openrtb .response .Bid ;
47import com .iab .openrtb .response .BidResponse ;
58import com .iab .openrtb .response .SeatBid ;
69import org .apache .commons .collections4 .CollectionUtils ;
10+ import org .apache .commons .lang3 .ObjectUtils ;
11+ import org .apache .commons .lang3 .StringUtils ;
712import org .prebid .server .bidder .Bidder ;
813import org .prebid .server .bidder .model .BidderBid ;
914import org .prebid .server .bidder .model .BidderCall ;
1015import org .prebid .server .bidder .model .BidderError ;
1116import org .prebid .server .bidder .model .HttpRequest ;
1217import org .prebid .server .bidder .model .Result ;
18+ import org .prebid .server .exception .PreBidException ;
1319import org .prebid .server .json .DecodeException ;
1420import org .prebid .server .json .JacksonMapper ;
21+ import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
22+ import org .prebid .server .proto .openrtb .ext .request .omx .ExtImpOms ;
1523import org .prebid .server .proto .openrtb .ext .response .BidType ;
24+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebidVideo ;
1625import org .prebid .server .util .BidderUtil ;
1726import org .prebid .server .util .HttpUtil ;
1827
2332
2433public class OmsBidder implements Bidder <BidRequest > {
2534
35+ private static final TypeReference <ExtPrebid <?, ExtImpOms >> EXT_TYPE_REFERENCE = new TypeReference <>() {
36+ };
2637 private final String endpointUrl ;
2738 private final JacksonMapper mapper ;
2839
@@ -32,8 +43,31 @@ public OmsBidder(String endpointUrl, JacksonMapper mapper) {
3243 }
3344
3445 @ Override
35- public final Result <List <HttpRequest <BidRequest >>> makeHttpRequests (BidRequest bidRequest ) {
36- return Result .withValue (BidderUtil .defaultRequest (bidRequest , endpointUrl , mapper ));
46+ public Result <List <HttpRequest <BidRequest >>> makeHttpRequests (BidRequest request ) {
47+ try {
48+ final ExtImpOms impExt = parseImpExt (request .getImp ().getFirst ());
49+ final String publisherId = resolverPublisherId (impExt .getPid (), impExt .getPublisherId ());
50+ final String encodedPublisherId = HttpUtil .encodeUrl (publisherId );
51+ final String url = "%s?publisherId=%s" .formatted (endpointUrl , encodedPublisherId );
52+ return Result .withValue (BidderUtil .defaultRequest (request , url , mapper ));
53+ } catch (PreBidException e ) {
54+ return Result .withError (BidderError .badInput (e .getMessage ()));
55+ }
56+ }
57+
58+ private ExtImpOms parseImpExt (Imp imp ) throws PreBidException {
59+ try {
60+ return mapper .mapper ().convertValue (imp .getExt (), EXT_TYPE_REFERENCE ).getBidder ();
61+ } catch (IllegalArgumentException e ) {
62+ throw new PreBidException ("Invalid ext. Imp.Id: " + imp .getId ());
63+ }
64+ }
65+
66+ private String resolverPublisherId (String pid , Integer publisherId ) {
67+ if (StringUtils .isEmpty (pid ) && publisherId != null && publisherId > 0 ) {
68+ return String .valueOf (publisherId );
69+ }
70+ return pid ;
3771 }
3872
3973 @ Override
@@ -59,7 +93,33 @@ private static List<BidderBid> bidsFromResponse(BidResponse bidResponse) {
5993 .map (SeatBid ::getBid )
6094 .filter (Objects ::nonNull )
6195 .flatMap (Collection ::stream )
62- .map (bid -> BidderBid . of (bid , BidType . banner , bidResponse .getCur ()))
96+ .map (bid -> createBidderBid (bid , bidResponse .getCur ()))
6397 .toList ();
6498 }
99+
100+ private static BidderBid createBidderBid (Bid bid , String currency ) {
101+ final BidType bidType = getBidType (bid );
102+ return BidderBid .builder ()
103+ .bid (bid )
104+ .type (bidType )
105+ .bidCurrency (currency )
106+ .videoInfo (videoInfo (bidType , bid ))
107+ .build ();
108+ }
109+
110+ private static BidType getBidType (Bid bid ) {
111+ return Objects .equals (bid .getMtype (), 2 ) ? BidType .video : BidType .banner ;
112+ }
113+
114+ private static ExtBidPrebidVideo videoInfo (BidType bidType , Bid bid ) {
115+ if (bidType != BidType .video ) {
116+ return null ;
117+ }
118+ final List <String > cat = bid .getCat ();
119+ final Integer duration = bid .getDur ();
120+
121+ return ExtBidPrebidVideo .of (
122+ ObjectUtils .defaultIfNull (duration , 0 ),
123+ CollectionUtils .isNotEmpty (cat ) ? cat .getFirst () : StringUtils .EMPTY );
124+ }
65125}
0 commit comments