Skip to content

Commit 5ee2283

Browse files
fix comments
1 parent 3521a00 commit 5ee2283

File tree

5 files changed

+116
-55
lines changed

5 files changed

+116
-55
lines changed

src/main/java/org/prebid/server/bidder/kobler/KoblerBidder.java

+38-21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.core.type.TypeReference;
5+
import com.fasterxml.jackson.databind.JsonNode;
56
import com.fasterxml.jackson.databind.node.ObjectNode;
67
import com.iab.openrtb.request.BidRequest;
78
import com.iab.openrtb.request.Imp;
@@ -40,19 +41,23 @@ public class KoblerBidder implements Bidder<BidRequest> {
4041
private static final TypeReference<ExtPrebid<?, ExtImpKobler>> KOBLER_EXT_TYPE_REFERENCE =
4142
new TypeReference<>() {
4243
};
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-
4744
private final String endpointUrl;
45+
private final String defaultBidCurrency;
46+
private final String devEndpoint;
47+
private final String extPrebid;
4848
private final CurrencyConversionService currencyConversionService;
4949
private final JacksonMapper mapper;
5050

5151
public KoblerBidder(String endpointUrl,
52+
String defaultBidCurrency,
53+
String devEndpoint,
54+
String extPrebid,
5255
CurrencyConversionService currencyConversionService,
5356
JacksonMapper mapper) {
54-
5557
this.endpointUrl = HttpUtil.validateUrl(endpointUrl);
58+
this.defaultBidCurrency = Objects.requireNonNull(defaultBidCurrency);
59+
this.devEndpoint = Objects.requireNonNull(devEndpoint);
60+
this.extPrebid = Objects.requireNonNull(extPrebid);
5661
this.currencyConversionService = Objects.requireNonNull(currencyConversionService);
5762
this.mapper = Objects.requireNonNull(mapper);
5863
}
@@ -63,19 +68,13 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequ
6368
boolean testMode = false;
6469
final List<Imp> modifiedImps = new ArrayList<>();
6570

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);
7072

7173
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()));
7978
}
8079

8180
for (Imp imp : imps) {
@@ -92,12 +91,28 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequ
9291
.imp(modifiedImps)
9392
.build();
9493

95-
final String endpoint = testMode ? DEV_ENDPOINT : endpointUrl;
94+
final String endpoint = testMode ? devEndpoint : endpointUrl;
9695

9796
final HttpRequest<BidRequest> httpRequest = BidderUtil.defaultRequest(modifiedRequest, endpoint, mapper);
9897
return Result.of(Collections.singletonList(httpRequest), errors);
9998
}
10099

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+
101116
private Imp modifyImp(BidRequest bidRequest, Imp imp) {
102117
final Price resolvedBidFloor = resolveBidFloor(imp, bidRequest);
103118

@@ -109,7 +124,7 @@ private Imp modifyImp(BidRequest bidRequest, Imp imp) {
109124

110125
private Price resolveBidFloor(Imp imp, BidRequest bidRequest) {
111126
final Price initialBidFloorPrice = Price.of(imp.getBidfloorcur(), imp.getBidfloor());
112-
return BidderUtil.shouldConvertBidFloor(initialBidFloorPrice, DEFAULT_BID_CURRENCY)
127+
return BidderUtil.shouldConvertBidFloor(initialBidFloorPrice, defaultBidCurrency)
113128
? convertBidFloor(initialBidFloorPrice, bidRequest)
114129
: initialBidFloorPrice;
115130
}
@@ -119,9 +134,9 @@ private Price convertBidFloor(Price bidFloorPrice, BidRequest bidRequest) {
119134
bidFloorPrice.getValue(),
120135
bidRequest,
121136
bidFloorPrice.getCurrency(),
122-
DEFAULT_BID_CURRENCY);
137+
defaultBidCurrency);
123138

124-
return Price.of(DEFAULT_BID_CURRENCY, convertedPrice);
139+
return Price.of(defaultBidCurrency, convertedPrice);
125140
}
126141

127142
private ExtImpKobler parseImpExt(Imp imp) {
@@ -155,13 +170,15 @@ private List<BidderBid> bidsFromResponse(BidResponse bidResponse) {
155170
.map(SeatBid::getBid)
156171
.filter(Objects::nonNull)
157172
.flatMap(Collection::stream)
173+
.filter(Objects::nonNull)
158174
.map(bid -> BidderBid.of(bid, getBidType(bid), bidResponse.getCur()))
159175
.toList();
160176
}
161177

162178
private BidType getBidType(Bid bid) {
163179
return Optional.ofNullable(bid.getExt())
164-
.map(ext -> ext.get(EXT_PREBID))
180+
.map(ext -> ext.get(extPrebid))
181+
.filter(JsonNode::isObject)
165182
.map(ObjectNode.class::cast)
166183
.map(this::parseExtBidPrebid)
167184
.map(ExtBidPrebid::getType)
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package org.prebid.server.proto.openrtb.ext.request.kobler;
22

3-
import com.fasterxml.jackson.annotation.JsonProperty;
43
import lombok.Value;
54

65
@Value(staticConstructor = "of")
76
public class ExtImpKobler {
87

9-
@JsonProperty("test")
108
Boolean test;
119
}

src/main/java/org/prebid/server/spring/config/bidder/KoblerConfiguration.java

+33-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package org.prebid.server.spring.config.bidder;
22

3+
import lombok.Data;
4+
import lombok.EqualsAndHashCode;
5+
import lombok.NoArgsConstructor;
36
import org.prebid.server.bidder.BidderDeps;
47
import org.prebid.server.bidder.kobler.KoblerBidder;
58
import org.prebid.server.currency.CurrencyConversionService;
@@ -13,6 +16,7 @@
1316
import org.springframework.context.annotation.Bean;
1417
import org.springframework.context.annotation.Configuration;
1518
import org.springframework.context.annotation.PropertySource;
19+
import org.springframework.validation.annotation.Validated;
1620

1721
import jakarta.validation.constraints.NotBlank;
1822

@@ -24,20 +28,43 @@ public class KoblerConfiguration {
2428

2529
@Bean("koblerConfigurationProperties")
2630
@ConfigurationProperties("adapters.kobler")
27-
BidderConfigurationProperties configurationProperties() {
28-
return new BidderConfigurationProperties();
31+
KoblerConfigurationProperties configurationProperties() {
32+
return new KoblerConfigurationProperties();
2933
}
3034

3135
@Bean
32-
BidderDeps koblerBidderDeps(BidderConfigurationProperties koblerConfigurationProperties,
36+
BidderDeps koblerBidderDeps(KoblerConfigurationProperties config,
3337
CurrencyConversionService currencyConversionService,
3438
@NotBlank @Value("${external-url}") String externalUrl,
3539
JacksonMapper mapper) {
3640

37-
return BidderDepsAssembler.forBidder(BIDDER_NAME)
38-
.withConfig(koblerConfigurationProperties)
41+
return BidderDepsAssembler.<KoblerConfigurationProperties>forBidder(BIDDER_NAME)
42+
.withConfig(config)
3943
.usersyncerCreator(UsersyncerCreator.create(externalUrl))
40-
.bidderCreator(config -> new KoblerBidder(config.getEndpoint(), currencyConversionService, mapper))
44+
.bidderCreator(cfg -> new KoblerBidder(
45+
cfg.getEndpoint(),
46+
cfg.getDefaultBidCurrency(),
47+
cfg.getDevEndpoint(),
48+
cfg.getExtPrebid(),
49+
currencyConversionService,
50+
mapper))
4151
.assemble();
52+
53+
}
54+
55+
@Validated
56+
@Data
57+
@EqualsAndHashCode(callSuper = true)
58+
@NoArgsConstructor
59+
private static class KoblerConfigurationProperties extends BidderConfigurationProperties {
60+
61+
@NotBlank
62+
private String defaultBidCurrency;
63+
64+
@NotBlank
65+
private String devEndpoint;
66+
67+
@NotBlank
68+
private String extPrebid;
4269
}
4370
}

src/main/resources/bidder-config/kobler.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
adapters:
22
kobler:
33
endpoint: "https://bid.essrtb.com/bid/prebid_server_rtb_call"
4+
default-bid-currency: "USD"
5+
dev-endpoint: "https://bid-service.dev.essrtb.com/bid/prebid_server_rtb_call"
6+
ext-prebid: "prebid"
47
endpoint-compression: gzip
58
geoscope:
69
- NOR

src/test/java/org/prebid/server/bidder/kobler/KoblerBidderTest.java

+42-26
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class KoblerBidderTest extends VertxTest {
4343

4444
private static final String ENDPOINT_URL = "https://test.com";
4545
private static final String DEV_ENDPOINT = "https://bid-service.dev.essrtb.com/bid/prebid_server_rtb_call";
46+
private static final String DEFAULT_BID_CURRENCY = "USD";
47+
private static final String EXT_PREBID = "prebid";
4648

4749
@Mock
4850
private CurrencyConversionService currencyConversionService;
@@ -51,13 +53,25 @@ public class KoblerBidderTest extends VertxTest {
5153

5254
@BeforeEach
5355
public void setUp() {
54-
target = new KoblerBidder(ENDPOINT_URL, currencyConversionService, jacksonMapper);
56+
target = new KoblerBidder(
57+
ENDPOINT_URL,
58+
DEFAULT_BID_CURRENCY,
59+
EXT_PREBID,
60+
DEV_ENDPOINT,
61+
currencyConversionService,
62+
jacksonMapper);
5563
}
5664

5765
@Test
5866
public void creationShouldFailOnInvalidEndpointUrl() {
5967
assertThatIllegalArgumentException().isThrownBy(() ->
60-
new KoblerBidder("invalid_url", currencyConversionService, jacksonMapper));
68+
new KoblerBidder(
69+
"invalid_url",
70+
DEFAULT_BID_CURRENCY,
71+
EXT_PREBID,
72+
DEV_ENDPOINT,
73+
currencyConversionService,
74+
jacksonMapper));
6175
}
6276

6377
@Test
@@ -98,13 +112,15 @@ public void makeHttpRequestsShouldConvertBidFloorCurrency() {
98112

99113
// then
100114
assertThat(result.getErrors()).isEmpty();
101-
assertThat(result.getValue().get(0).getPayload().getImp())
115+
assertThat(result.getValue())
116+
.extracting(HttpRequest::getPayload)
117+
.flatExtracting(BidRequest::getImp)
102118
.extracting(Imp::getBidfloor, Imp::getBidfloorcur)
103119
.containsExactly(tuple(BigDecimal.TEN, "USD"));
104120
}
105121

106122
@Test
107-
public void makeHttpRequestsShouldUseDevEndpointwhenTestModeEnabled() {
123+
public void makeHttpRequestsShouldUseDevEndpointWhenTestModeEnabled() {
108124
// given
109125
final BidRequest bidRequest = givenBidRequest(bidRequestBuilder -> bidRequestBuilder
110126
.cur(singletonList("EUR")),
@@ -132,6 +148,28 @@ public void makeHttpRequestsShouldAddUsdToCurrenciesIfMissing() {
132148
assertThat(result.getValue().get(0).getPayload().getCur()).containsExactlyInAnyOrder("EUR", "USD");
133149
}
134150

151+
@Test
152+
public void makeHttpRequestsShouldUseDevEndpointwhenImpExtTestIsTrue() {
153+
// given
154+
final ObjectNode extNode = jacksonMapper.mapper().createObjectNode();
155+
extNode.putObject("bidder").put("test", true);
156+
157+
final Imp imp = Imp.builder().id("test-imp").ext(extNode).build();
158+
159+
final BidRequest bidRequest = BidRequest.builder()
160+
.imp(Collections.singletonList(imp)).cur(Collections.singletonList("USD")).build();
161+
162+
// when
163+
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
164+
165+
// then
166+
assertThat(result.getErrors()).isEmpty();
167+
assertThat(result.getValue()).hasSize(1);
168+
169+
final HttpRequest<BidRequest> httpRequest = result.getValue().get(0);
170+
assertThat(httpRequest.getUri()).isEqualTo(DEV_ENDPOINT);
171+
}
172+
135173
@Test
136174
public void makeBidsShouldReturnErrorIfResponseBodyIsInvalid() {
137175
// given
@@ -196,28 +234,6 @@ public void makeBidsShouldReturnEmptyListwhenSeatbidIsEmpty() throws JsonProcess
196234
assertThat(result.getErrors()).isEmpty();
197235
}
198236

199-
@Test
200-
public void makeHttpRequestsShouldUseDevEndpointwhenImpExtTestIsTrue() {
201-
// given
202-
final ObjectNode extNode = jacksonMapper.mapper().createObjectNode();
203-
extNode.putObject("bidder").put("test", true);
204-
205-
final Imp imp = Imp.builder().id("test-imp").ext(extNode).build();
206-
207-
final BidRequest bidRequest = BidRequest.builder()
208-
.imp(Collections.singletonList(imp)).cur(Collections.singletonList("USD")).build();
209-
210-
// when
211-
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
212-
213-
// then
214-
assertThat(result.getErrors()).isEmpty();
215-
assertThat(result.getValue()).hasSize(1);
216-
217-
final HttpRequest<BidRequest> httpRequest = result.getValue().get(0);
218-
assertThat(httpRequest.getUri()).isEqualTo(DEV_ENDPOINT);
219-
}
220-
221237
private static BidRequest givenBidRequest(UnaryOperator<Imp.ImpBuilder> impCustomizer) {
222238
return givenBidRequest(identity(), impCustomizer);
223239
}

0 commit comments

Comments
 (0)