2
2
3
3
import com .fasterxml .jackson .core .JsonProcessingException ;
4
4
import com .fasterxml .jackson .core .type .TypeReference ;
5
+ import com .fasterxml .jackson .databind .JsonNode ;
5
6
import com .fasterxml .jackson .databind .node .ObjectNode ;
6
7
import com .iab .openrtb .request .BidRequest ;
7
8
import com .iab .openrtb .request .Imp ;
@@ -40,19 +41,23 @@ public class KoblerBidder implements Bidder<BidRequest> {
40
41
private static final TypeReference <ExtPrebid <?, ExtImpKobler >> KOBLER_EXT_TYPE_REFERENCE =
41
42
new TypeReference <>() {
42
43
};
43
- private static final String EXT_PREBID = "prebid" ;
44
- private static final String DEFAULT_BID_CURRENCY = "USD" ;
45
- private static final String DEV_ENDPOINT = "https://bid-service.dev.essrtb.com/bid/prebid_server_rtb_call" ;
46
-
47
44
private final String endpointUrl ;
45
+ private final String defaultBidCurrency ;
46
+ private final String devEndpoint ;
47
+ private final String extPrebid ;
48
48
private final CurrencyConversionService currencyConversionService ;
49
49
private final JacksonMapper mapper ;
50
50
51
51
public KoblerBidder (String endpointUrl ,
52
+ String defaultBidCurrency ,
53
+ String devEndpoint ,
54
+ String extPrebid ,
52
55
CurrencyConversionService currencyConversionService ,
53
56
JacksonMapper mapper ) {
54
-
55
57
this .endpointUrl = HttpUtil .validateUrl (endpointUrl );
58
+ this .defaultBidCurrency = Objects .requireNonNull (defaultBidCurrency );
59
+ this .devEndpoint = Objects .requireNonNull (devEndpoint );
60
+ this .extPrebid = Objects .requireNonNull (extPrebid );
56
61
this .currencyConversionService = Objects .requireNonNull (currencyConversionService );
57
62
this .mapper = Objects .requireNonNull (mapper );
58
63
}
@@ -63,19 +68,13 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequ
63
68
boolean testMode = false ;
64
69
final List <Imp > modifiedImps = new ArrayList <>();
65
70
66
- final List <String > currencies = new ArrayList <>(bidRequest .getCur ());
67
- if (!currencies .contains (DEFAULT_BID_CURRENCY )) {
68
- currencies .add (DEFAULT_BID_CURRENCY );
69
- }
71
+ final List <String > currencies = normalizeCurrencies (bidRequest );
70
72
71
73
final List <Imp > imps = bidRequest .getImp ();
72
- if (!imps .isEmpty ()) {
73
- try {
74
- testMode = parseImpExt (imps .getFirst ()).getTest ();
75
- } catch (PreBidException e ) {
76
- errors .add (BidderError .badInput (e .getMessage ()));
77
- return Result .withErrors (errors );
78
- }
74
+ try {
75
+ testMode = isTest (imps .getFirst ());
76
+ } catch (PreBidException e ) {
77
+ errors .add (BidderError .badInput (e .getMessage ()));
79
78
}
80
79
81
80
for (Imp imp : imps ) {
@@ -92,12 +91,28 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequ
92
91
.imp (modifiedImps )
93
92
.build ();
94
93
95
- final String endpoint = testMode ? DEV_ENDPOINT : endpointUrl ;
94
+ final String endpoint = testMode ? devEndpoint : endpointUrl ;
96
95
97
96
final HttpRequest <BidRequest > httpRequest = BidderUtil .defaultRequest (modifiedRequest , endpoint , mapper );
98
97
return Result .of (Collections .singletonList (httpRequest ), errors );
99
98
}
100
99
100
+ private boolean isTest (Imp imp ) {
101
+ try {
102
+ return parseImpExt (imp ).getTest ();
103
+ } catch (PreBidException e ) {
104
+ return false ;
105
+ }
106
+ }
107
+
108
+ private List <String > normalizeCurrencies (BidRequest bidRequest ) {
109
+ final List <String > currencies = new ArrayList <>(bidRequest .getCur ());
110
+ if (!currencies .contains (defaultBidCurrency )) {
111
+ currencies .add (defaultBidCurrency );
112
+ }
113
+ return currencies ;
114
+ }
115
+
101
116
private Imp modifyImp (BidRequest bidRequest , Imp imp ) {
102
117
final Price resolvedBidFloor = resolveBidFloor (imp , bidRequest );
103
118
@@ -109,7 +124,7 @@ private Imp modifyImp(BidRequest bidRequest, Imp imp) {
109
124
110
125
private Price resolveBidFloor (Imp imp , BidRequest bidRequest ) {
111
126
final Price initialBidFloorPrice = Price .of (imp .getBidfloorcur (), imp .getBidfloor ());
112
- return BidderUtil .shouldConvertBidFloor (initialBidFloorPrice , DEFAULT_BID_CURRENCY )
127
+ return BidderUtil .shouldConvertBidFloor (initialBidFloorPrice , defaultBidCurrency )
113
128
? convertBidFloor (initialBidFloorPrice , bidRequest )
114
129
: initialBidFloorPrice ;
115
130
}
@@ -119,9 +134,9 @@ private Price convertBidFloor(Price bidFloorPrice, BidRequest bidRequest) {
119
134
bidFloorPrice .getValue (),
120
135
bidRequest ,
121
136
bidFloorPrice .getCurrency (),
122
- DEFAULT_BID_CURRENCY );
137
+ defaultBidCurrency );
123
138
124
- return Price .of (DEFAULT_BID_CURRENCY , convertedPrice );
139
+ return Price .of (defaultBidCurrency , convertedPrice );
125
140
}
126
141
127
142
private ExtImpKobler parseImpExt (Imp imp ) {
@@ -155,13 +170,15 @@ private List<BidderBid> bidsFromResponse(BidResponse bidResponse) {
155
170
.map (SeatBid ::getBid )
156
171
.filter (Objects ::nonNull )
157
172
.flatMap (Collection ::stream )
173
+ .filter (Objects ::nonNull )
158
174
.map (bid -> BidderBid .of (bid , getBidType (bid ), bidResponse .getCur ()))
159
175
.toList ();
160
176
}
161
177
162
178
private BidType getBidType (Bid bid ) {
163
179
return Optional .ofNullable (bid .getExt ())
164
- .map (ext -> ext .get (EXT_PREBID ))
180
+ .map (ext -> ext .get (extPrebid ))
181
+ .filter (JsonNode ::isObject )
165
182
.map (ObjectNode .class ::cast )
166
183
.map (this ::parseExtBidPrebid )
167
184
.map (ExtBidPrebid ::getType )
0 commit comments