Skip to content

Commit 9056f21

Browse files
Smartadserver Adapter: Send multi-impression requests without flattening (#4115)
1 parent db0447d commit 9056f21

File tree

2 files changed

+41
-40
lines changed

2 files changed

+41
-40
lines changed

src/main/java/org/prebid/server/bidder/smartadserver/SmartadserverBidder.java

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,30 @@ public SmartadserverBidder(String endpointUrl, JacksonMapper mapper) {
4949

5050
@Override
5151
public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest request) {
52-
final List<HttpRequest<BidRequest>> result = new ArrayList<>();
5352
final List<BidderError> errors = new ArrayList<>();
53+
final List<Imp> imps = new ArrayList<>();
54+
ExtImpSmartadserver extImp = null;
5455

5556
for (Imp imp : request.getImp()) {
5657
try {
57-
final ExtImpSmartadserver extImpSmartadserver = parseImpExt(imp);
58-
final BidRequest updatedRequest = request.toBuilder()
59-
.imp(Collections.singletonList(imp))
60-
.site(modifySite(request.getSite(), extImpSmartadserver.getNetworkId()))
61-
.build();
62-
result.add(createSingleRequest(updatedRequest));
58+
extImp = parseImpExt(imp);
59+
imps.add(imp);
6360
} catch (PreBidException e) {
6461
errors.add(BidderError.badInput(e.getMessage()));
6562
}
6663
}
67-
return Result.of(result, errors);
64+
65+
if (imps.isEmpty()) {
66+
return Result.withErrors(errors);
67+
}
68+
69+
final BidRequest outgoingRequest = request.toBuilder()
70+
.imp(imps)
71+
.site(modifySite(request.getSite(), extImp.getNetworkId()))
72+
.build();
73+
74+
final HttpRequest<BidRequest> httpRequest = BidderUtil.defaultRequest(outgoingRequest, makeUrl(), mapper);
75+
return Result.of(Collections.singletonList(httpRequest), errors);
6876
}
6977

7078
private ExtImpSmartadserver parseImpExt(Imp imp) {
@@ -75,24 +83,6 @@ private ExtImpSmartadserver parseImpExt(Imp imp) {
7583
}
7684
}
7785

78-
private HttpRequest<BidRequest> createSingleRequest(BidRequest request) {
79-
80-
return BidderUtil.defaultRequest(request, getUri(), mapper);
81-
}
82-
83-
private String getUri() {
84-
final URI uri;
85-
try {
86-
uri = new URI(endpointUrl);
87-
} catch (URISyntaxException e) {
88-
throw new PreBidException("Malformed URL: %s.".formatted(endpointUrl));
89-
}
90-
return new URIBuilder(uri)
91-
.setPath(StringUtils.removeEnd(uri.getPath(), "/") + "/api/bid")
92-
.addParameter("callerId", "5")
93-
.toString();
94-
}
95-
9686
private static Site modifySite(Site site, Integer networkId) {
9787
final Site.SiteBuilder siteBuilder = site != null ? site.toBuilder() : Site.builder();
9888
final Publisher sitePublisher = site != null ? site.getPublisher() : null;
@@ -108,6 +98,19 @@ private static Publisher modifyPublisher(Publisher publisher, Integer networkId)
10898
return publisherBuilder.id(String.valueOf(networkId)).build();
10999
}
110100

101+
private String makeUrl() {
102+
final URI uri;
103+
try {
104+
uri = new URI(endpointUrl);
105+
} catch (URISyntaxException e) {
106+
throw new PreBidException("Malformed URL: %s.".formatted(endpointUrl));
107+
}
108+
return new URIBuilder(uri)
109+
.setPath(StringUtils.removeEnd(uri.getPath(), "/") + "/api/bid")
110+
.addParameter("callerId", "5")
111+
.toString();
112+
}
113+
111114
@Override
112115
public Result<List<BidderBid>> makeBids(BidderCall<BidRequest> httpCall, BidRequest bidRequest) {
113116
try {
@@ -135,7 +138,6 @@ private Result<List<BidderBid>> extractBids(BidResponse bidResponse) {
135138

136139
private static BidType getBidTypeFromMarkupType(Integer markupType) {
137140
return switch (markupType) {
138-
case 1 -> BidType.banner;
139141
case 2 -> BidType.video;
140142
case 3 -> BidType.audio;
141143
case 4 -> BidType.xNative;

src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,36 +108,35 @@ public void makeHttpRequestsShouldUpdateSiteObjectIfPresent() {
108108
}
109109

110110
@Test
111-
public void makeHttpRequestsShouldCreateRequestForEveryValidImp() {
111+
public void makeHttpRequestsShouldCreateSingleRequest() {
112112
// given
113113
final BidRequest bidRequest = BidRequest.builder()
114-
.imp(Arrays.asList(givenImp(identity()),
115-
givenImp(impBuilder -> impBuilder.id("456"))
116-
))
114+
.imp(Arrays.asList(
115+
givenImp(impBuilder -> impBuilder.id("123")),
116+
givenImp(impBuilder -> impBuilder.id("456"))))
117117
.build();
118118

119119
// when
120120
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);
121121

122122
// then
123123
assertThat(result.getErrors()).isEmpty();
124-
assertThat(result.getValue())
124+
assertThat(result.getValue()).hasSize(1)
125125
.extracting(HttpRequest::getPayload)
126126
.flatExtracting(BidRequest::getImp)
127-
.flatExtracting(Imp::getId)
127+
.extracting(Imp::getId)
128128
.containsExactly("123", "456");
129129
}
130130

131131
@Test
132-
public void makeHttpRequestsShouldCreateRequestForValidImpAndSaveErrorForInvalid() {
132+
public void makeHttpRequestsShouldCreateSingleRequestWithValidImpsOnly() {
133133
// given
134134
final BidRequest bidRequest = BidRequest.builder()
135-
.imp(Arrays.asList(givenImp(impBuilder -> impBuilder.id("456")),
135+
.imp(Arrays.asList(givenImp(impBuilder -> impBuilder.id("123")),
136136
Imp.builder()
137137
.id("invalidImp")
138138
.ext(mapper.valueToTree(ExtPrebid.of(null, mapper.createArrayNode())))
139-
.build()
140-
))
139+
.build()))
141140
.build();
142141

143142
// when
@@ -146,11 +145,11 @@ public void makeHttpRequestsShouldCreateRequestForValidImpAndSaveErrorForInvalid
146145
// then
147146
assertThat(result.getErrors())
148147
.containsExactly(BidderError.badInput("Error parsing smartadserverExt parameters"));
149-
assertThat(result.getValue())
148+
assertThat(result.getValue()).hasSize(1)
150149
.extracting(HttpRequest::getPayload)
151150
.flatExtracting(BidRequest::getImp)
152-
.flatExtracting(Imp::getId)
153-
.containsExactly("456");
151+
.extracting(Imp::getId)
152+
.containsExactly("123");
154153
}
155154

156155
@Test

0 commit comments

Comments
 (0)