1414import org .prebid .server .bidder .model .BidderCall ;
1515import org .prebid .server .bidder .model .BidderError ;
1616import org .prebid .server .bidder .model .HttpRequest ;
17+ import org .prebid .server .bidder .model .Price ;
1718import org .prebid .server .bidder .model .Result ;
19+ import org .prebid .server .currency .CurrencyConversionService ;
1820import org .prebid .server .exception .PreBidException ;
1921import org .prebid .server .json .DecodeException ;
2022import org .prebid .server .json .JacksonMapper ;
2123import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
2224import org .prebid .server .proto .openrtb .ext .request .pgamssp .PgamSspImpExt ;
2325import org .prebid .server .proto .openrtb .ext .response .BidType ;
26+ import org .prebid .server .util .BidderUtil ;
2427import org .prebid .server .util .HttpUtil ;
2528
29+ import java .math .BigDecimal ;
2630import java .util .ArrayList ;
2731import java .util .Collections ;
2832import java .util .List ;
@@ -35,12 +39,18 @@ public class PgamSspBidder implements Bidder<BidRequest> {
3539 };
3640 private static final String PUBLISHER_IMP_EXT_TYPE = "publisher" ;
3741 private static final String NETWORK_IMP_EXT_TYPE = "network" ;
42+ private static final String DEFAULT_BID_CURRENCY = "USD" ;
3843
3944 private final String endpointUrl ;
45+ private final CurrencyConversionService currencyConversionService ;
4046 private final JacksonMapper mapper ;
4147
42- public PgamSspBidder (String endpointUrl , JacksonMapper mapper ) {
48+ public PgamSspBidder (String endpointUrl ,
49+ CurrencyConversionService currencyConversionService ,
50+ JacksonMapper mapper ) {
51+
4352 this .endpointUrl = HttpUtil .validateUrl (Objects .requireNonNull (endpointUrl ));
53+ this .currencyConversionService = Objects .requireNonNull (currencyConversionService );
4454 this .mapper = Objects .requireNonNull (mapper );
4555 }
4656
@@ -51,7 +61,7 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
5161 for (Imp imp : request .getImp ()) {
5262 try {
5363 final PgamSspImpExt impExt = parseImpExt (imp );
54- final BidRequest modifiedBidRequest = makeRequest (request , imp , impExt );
64+ final BidRequest modifiedBidRequest = makeRequest (request , modifyImp ( imp , request ) , impExt );
5565 httpRequests .add (makeHttpRequest (modifiedBidRequest , imp .getId ()));
5666 } catch (PreBidException e ) {
5767 return Result .withError (BidderError .badInput (e .getMessage ()));
@@ -61,6 +71,31 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request
6171 return Result .withValues (httpRequests );
6272 }
6373
74+ private Imp modifyImp (Imp imp , BidRequest bidRequest ) {
75+ final Price resolvedBidFloor = resolveBidFloor (imp , bidRequest );
76+ return imp .toBuilder ()
77+ .bidfloor (resolvedBidFloor .getValue ())
78+ .bidfloorcur (resolvedBidFloor .getCurrency ())
79+ .build ();
80+ }
81+
82+ private Price resolveBidFloor (Imp imp , BidRequest bidRequest ) {
83+ final Price initialBidFloorPrice = Price .of (imp .getBidfloorcur (), imp .getBidfloor ());
84+ return BidderUtil .shouldConvertBidFloor (initialBidFloorPrice , DEFAULT_BID_CURRENCY )
85+ ? convertBidFloor (initialBidFloorPrice , bidRequest )
86+ : initialBidFloorPrice ;
87+ }
88+
89+ private Price convertBidFloor (Price bidFloorPrice , BidRequest bidRequest ) {
90+ final BigDecimal convertedPrice = currencyConversionService .convertCurrency (
91+ bidFloorPrice .getValue (),
92+ bidRequest ,
93+ bidFloorPrice .getCurrency (),
94+ DEFAULT_BID_CURRENCY );
95+
96+ return Price .of (DEFAULT_BID_CURRENCY , convertedPrice );
97+ }
98+
6499 private PgamSspImpExt parseImpExt (Imp imp ) throws PreBidException {
65100 try {
66101 return mapper .mapper ().convertValue (imp .getExt (), PGAMSSP_EXT_TYPE_REFERENCE ).getBidder ();
0 commit comments