From 323a4ab75abb846f1f9b7dd0800309123c790b37 Mon Sep 17 00:00:00 2001 From: antonbabak Date: Tue, 5 Aug 2025 10:59:52 +0200 Subject: [PATCH] Smartadserver Adapter: Send multi-impression requests without flattening --- .../smartadserver/SmartadserverBidder.java | 56 ++++++++++--------- .../SmartadserverBidderTest.java | 25 ++++----- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/smartadserver/SmartadserverBidder.java b/src/main/java/org/prebid/server/bidder/smartadserver/SmartadserverBidder.java index d6dd53b75d7..e2d353fb003 100644 --- a/src/main/java/org/prebid/server/bidder/smartadserver/SmartadserverBidder.java +++ b/src/main/java/org/prebid/server/bidder/smartadserver/SmartadserverBidder.java @@ -49,22 +49,30 @@ public SmartadserverBidder(String endpointUrl, JacksonMapper mapper) { @Override public Result>> makeHttpRequests(BidRequest request) { - final List> result = new ArrayList<>(); final List errors = new ArrayList<>(); + final List imps = new ArrayList<>(); + ExtImpSmartadserver extImp = null; for (Imp imp : request.getImp()) { try { - final ExtImpSmartadserver extImpSmartadserver = parseImpExt(imp); - final BidRequest updatedRequest = request.toBuilder() - .imp(Collections.singletonList(imp)) - .site(modifySite(request.getSite(), extImpSmartadserver.getNetworkId())) - .build(); - result.add(createSingleRequest(updatedRequest)); + extImp = parseImpExt(imp); + imps.add(imp); } catch (PreBidException e) { errors.add(BidderError.badInput(e.getMessage())); } } - return Result.of(result, errors); + + if (imps.isEmpty()) { + return Result.withErrors(errors); + } + + final BidRequest outgoingRequest = request.toBuilder() + .imp(imps) + .site(modifySite(request.getSite(), extImp.getNetworkId())) + .build(); + + final HttpRequest httpRequest = BidderUtil.defaultRequest(outgoingRequest, makeUrl(), mapper); + return Result.of(Collections.singletonList(httpRequest), errors); } private ExtImpSmartadserver parseImpExt(Imp imp) { @@ -75,24 +83,6 @@ private ExtImpSmartadserver parseImpExt(Imp imp) { } } - private HttpRequest createSingleRequest(BidRequest request) { - - return BidderUtil.defaultRequest(request, getUri(), mapper); - } - - private String getUri() { - final URI uri; - try { - uri = new URI(endpointUrl); - } catch (URISyntaxException e) { - throw new PreBidException("Malformed URL: %s.".formatted(endpointUrl)); - } - return new URIBuilder(uri) - .setPath(StringUtils.removeEnd(uri.getPath(), "/") + "/api/bid") - .addParameter("callerId", "5") - .toString(); - } - private static Site modifySite(Site site, Integer networkId) { final Site.SiteBuilder siteBuilder = site != null ? site.toBuilder() : Site.builder(); final Publisher sitePublisher = site != null ? site.getPublisher() : null; @@ -108,6 +98,19 @@ private static Publisher modifyPublisher(Publisher publisher, Integer networkId) return publisherBuilder.id(String.valueOf(networkId)).build(); } + private String makeUrl() { + final URI uri; + try { + uri = new URI(endpointUrl); + } catch (URISyntaxException e) { + throw new PreBidException("Malformed URL: %s.".formatted(endpointUrl)); + } + return new URIBuilder(uri) + .setPath(StringUtils.removeEnd(uri.getPath(), "/") + "/api/bid") + .addParameter("callerId", "5") + .toString(); + } + @Override public Result> makeBids(BidderCall httpCall, BidRequest bidRequest) { try { @@ -135,7 +138,6 @@ private Result> extractBids(BidResponse bidResponse) { private static BidType getBidTypeFromMarkupType(Integer markupType) { return switch (markupType) { - case 1 -> BidType.banner; case 2 -> BidType.video; case 3 -> BidType.audio; case 4 -> BidType.xNative; diff --git a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java index d31213136fb..4565c7581de 100644 --- a/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/smartadserver/SmartadserverBidderTest.java @@ -108,12 +108,12 @@ public void makeHttpRequestsShouldUpdateSiteObjectIfPresent() { } @Test - public void makeHttpRequestsShouldCreateRequestForEveryValidImp() { + public void makeHttpRequestsShouldCreateSingleRequest() { // given final BidRequest bidRequest = BidRequest.builder() - .imp(Arrays.asList(givenImp(identity()), - givenImp(impBuilder -> impBuilder.id("456")) - )) + .imp(Arrays.asList( + givenImp(impBuilder -> impBuilder.id("123")), + givenImp(impBuilder -> impBuilder.id("456")))) .build(); // when @@ -121,23 +121,22 @@ public void makeHttpRequestsShouldCreateRequestForEveryValidImp() { // then assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()) + assertThat(result.getValue()).hasSize(1) .extracting(HttpRequest::getPayload) .flatExtracting(BidRequest::getImp) - .flatExtracting(Imp::getId) + .extracting(Imp::getId) .containsExactly("123", "456"); } @Test - public void makeHttpRequestsShouldCreateRequestForValidImpAndSaveErrorForInvalid() { + public void makeHttpRequestsShouldCreateSingleRequestWithValidImpsOnly() { // given final BidRequest bidRequest = BidRequest.builder() - .imp(Arrays.asList(givenImp(impBuilder -> impBuilder.id("456")), + .imp(Arrays.asList(givenImp(impBuilder -> impBuilder.id("123")), Imp.builder() .id("invalidImp") .ext(mapper.valueToTree(ExtPrebid.of(null, mapper.createArrayNode()))) - .build() - )) + .build())) .build(); // when @@ -146,11 +145,11 @@ public void makeHttpRequestsShouldCreateRequestForValidImpAndSaveErrorForInvalid // then assertThat(result.getErrors()) .containsExactly(BidderError.badInput("Error parsing smartadserverExt parameters")); - assertThat(result.getValue()) + assertThat(result.getValue()).hasSize(1) .extracting(HttpRequest::getPayload) .flatExtracting(BidRequest::getImp) - .flatExtracting(Imp::getId) - .containsExactly("456"); + .extracting(Imp::getId) + .containsExactly("123"); } @Test