diff --git a/src/main/java/org/prebid/server/bidder/yieldlab/YieldlabBidder.java b/src/main/java/org/prebid/server/bidder/yieldlab/YieldlabBidder.java index af1978d5206..cf99e41de84 100644 --- a/src/main/java/org/prebid/server/bidder/yieldlab/YieldlabBidder.java +++ b/src/main/java/org/prebid/server/bidder/yieldlab/YieldlabBidder.java @@ -49,6 +49,7 @@ import java.time.Clock; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -56,6 +57,7 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; public class YieldlabBidder implements Bidder { @@ -166,6 +168,12 @@ private String makeUrl(ExtImpYieldlab extImpYieldlab, BidRequest request) { .addParameter("ts", timestamp) .addParameter("t", getTargetingValues(extImpYieldlab)); + final String formats = makeFormats(request, extImpYieldlab); + + if (formats != null) { + uriBuilder.addParameter("sizes", formats); + } + final User user = request.getUser(); if (user != null && StringUtils.isNotBlank(user.getBuyeruid())) { uriBuilder.addParameter("ids", String.join("ylid:", user.getBuyeruid())); @@ -209,6 +217,24 @@ private String makeUrl(ExtImpYieldlab extImpYieldlab, BidRequest request) { return uriBuilder.toString(); } + private String makeFormats(BidRequest request, ExtImpYieldlab extImp) { + final List formats = new ArrayList<>(); + for (Imp imp: request.getImp()) { + if (isBanner(imp)) { + Stream.ofNullable(imp.getBanner().getFormat()) + .flatMap(Collection::stream) + .map(format -> "%s:%d|%d".formatted(extImp.getAdslotId(), format.getW(), format.getH())) + .forEach(formats::add); + } + } + + return formats.isEmpty() ? null : String.join(",", formats); + } + + private boolean isBanner(Imp imp) { + return imp.getBanner() != null && imp.getXNative() == null && imp.getVideo() == null && imp.getAudio() == null; + } + /** * Determines debug flag from {@link BidRequest} or {@link ExtRequest}. */ diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/yieldlab/ExtImpYieldlab.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/yieldlab/ExtImpYieldlab.java index 28a4e036904..db165d6dd4e 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/yieldlab/ExtImpYieldlab.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/yieldlab/ExtImpYieldlab.java @@ -6,9 +6,6 @@ import java.util.Map; -/** - * Defines the contract for bidrequest.imp[i].ext.yieldlab - */ @Builder @Value public class ExtImpYieldlab { @@ -19,9 +16,6 @@ public class ExtImpYieldlab { @JsonProperty("supplyId") String supplyId; - @JsonProperty("adSize") - String adSize; - Map targeting; @JsonProperty("extId") diff --git a/src/main/resources/static/bidder-params/yieldlab.json b/src/main/resources/static/bidder-params/yieldlab.json index 900d65da6e5..9d0fd0e88c0 100644 --- a/src/main/resources/static/bidder-params/yieldlab.json +++ b/src/main/resources/static/bidder-params/yieldlab.json @@ -12,10 +12,6 @@ "type": "string", "description": "Yieldlab ID of the supply" }, - "adSize": { - "type": "string", - "description": "Size of the adslot in pixel, e.g. 200x50" - }, "extId": { "type": "string", "description": "External ID used for reporting" @@ -27,7 +23,6 @@ }, "required": [ "adslotId", - "supplyId", - "adSize" + "supplyId" ] } diff --git a/src/test/java/org/prebid/server/bidder/yieldlab/YieldlabBidderTest.java b/src/test/java/org/prebid/server/bidder/yieldlab/YieldlabBidderTest.java index c4ba2bdd8bb..a445a285955 100644 --- a/src/test/java/org/prebid/server/bidder/yieldlab/YieldlabBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/yieldlab/YieldlabBidderTest.java @@ -7,6 +7,7 @@ import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; +import com.iab.openrtb.request.Format; import com.iab.openrtb.request.Imp; import com.iab.openrtb.request.Regs; import com.iab.openrtb.request.Site; @@ -25,9 +26,9 @@ import org.prebid.server.bidder.yieldlab.model.YieldlabDigitalServicesActResponse; import org.prebid.server.bidder.yieldlab.model.YieldlabResponse; import org.prebid.server.proto.openrtb.ext.ExtPrebid; +import org.prebid.server.proto.openrtb.ext.request.DsaTransparency; import org.prebid.server.proto.openrtb.ext.request.ExtRegs; import org.prebid.server.proto.openrtb.ext.request.ExtRegsDsa; -import org.prebid.server.proto.openrtb.ext.request.DsaTransparency; import org.prebid.server.proto.openrtb.ext.request.ExtUser; import org.prebid.server.proto.openrtb.ext.request.yieldlab.ExtImpYieldlab; import org.prebid.server.proto.openrtb.ext.response.BidType; @@ -100,12 +101,15 @@ public void makeHttpRequestsShouldSendRequestToModifiedUrlWithHeaders() { targeting.put("key2", "value2"); final BidRequest bidRequest = BidRequest.builder() .imp(singletonList(Imp.builder() - .banner(Banner.builder().w(1).h(1).build()) + .banner(Banner.builder() + .format(List.of( + Format.builder().w(1).h(1).build(), + Format.builder().w(2).h(2).build())) + .build()) .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpYieldlab.builder() .adslotId("1") .supplyId("2") - .adSize("adSize") .targeting(targeting) .extId("extId") .build()))) @@ -127,8 +131,8 @@ public void makeHttpRequestsShouldSendRequestToModifiedUrlWithHeaders() { .extracting(HttpRequest::getUri) .allSatisfy(uri -> { assertThat(uri).startsWith("https://test.endpoint.com/1?content=json&pvid=true&ts="); - assertThat(uri).endsWith("&t=key1%3Dvalue1%26key2%3Dvalue2&ids=buyeruid&yl_rtb_ifa&" - + "yl_rtb_devicetype=1&gdpr=1&consent=consent"); + assertThat(uri).endsWith("&t=key1%3Dvalue1%26key2%3Dvalue2&sizes=1%3A1%7C1%2C1%3A2%7C2&" + + "ids=buyeruid&yl_rtb_ifa&yl_rtb_devicetype=1&gdpr=1&consent=consent"); final String ts = uri.substring(54, uri.indexOf("&t=")); assertThat(Long.parseLong(ts)).isEqualTo(expectedTime); }); @@ -157,7 +161,6 @@ public void constructExtImpShouldWorkWithDuplicateKeysTargeting() { ExtImpYieldlab.builder() .adslotId("1") .supplyId("2") - .adSize("adSize") .targeting(targeting) .extId("extId") .build()))) @@ -168,7 +171,6 @@ public void constructExtImpShouldWorkWithDuplicateKeysTargeting() { ExtImpYieldlab.builder() .adslotId("2") .supplyId("2") - .adSize("adSize") .targeting(targeting) .extId("extId") .build()))) @@ -220,7 +222,6 @@ public void makeBidsShouldReturnCorrectBidderBid() throws JsonProcessingExceptio .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpYieldlab.builder() .adslotId("1") .supplyId("2") - .adSize("adSize") .targeting(singletonMap("key", "value")) .extId("extId") .build()))) @@ -272,7 +273,6 @@ public void makeBidsShouldReturnCorrectAdm() throws JsonProcessingException { .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpYieldlab.builder() .adslotId("12345") .supplyId("123456789") - .adSize("728x90") .extId("abc") .build()))) .video(Video.builder().build()) @@ -452,7 +452,6 @@ public void makeBidsShouldAddDsaParamsWhenDsaIsPresentInResponse() throws JsonPr .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpYieldlab.builder() .adslotId("1") .supplyId("2") - .adSize("adSize") .targeting(singletonMap("key", "value")) .extId("extId") .build())))