diff --git a/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java b/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java index ad63bb5fe0f..d66fd90adf5 100644 --- a/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java +++ b/src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java @@ -1595,8 +1595,10 @@ private ObjectNode prepareBidExt(RubiconBid bid, final Integer networkId = resolveNetworkId(seatBid); final String seat = seatBid.getSeat(); final String rendererUrl = resolveRendererUrl(imp, meta, bidType, hasApexRenderer); + final List advertiserDomains = bid.getAdomain(); + final Integer advertiserId = resolveAdvertiserId(bidExt); - if (ObjectUtils.allNull(networkId, rendererUrl, seat)) { + if (ObjectUtils.allNull(networkId, rendererUrl, seat, advertiserDomains, advertiserId)) { return bidExt; } @@ -1606,6 +1608,8 @@ private ObjectNode prepareBidExt(RubiconBid bid, .networkId(networkId) .seat(seat) .rendererUrl(rendererUrl) + .advertiserId(advertiserId) + .advertiserDomains(advertiserDomains) .build(); final ExtBidPrebid modifiedExtBidPrebid = extBidPrebid != null @@ -1652,6 +1656,31 @@ private static Boolean isVideoMetaMediaType(ExtBidPrebidMeta meta) { .orElse(false); } + private static Integer resolveAdvertiserId(ObjectNode bidExt) { + return Optional.ofNullable(bidExt) + .map(ext -> ext.get("rp")) + .filter(JsonNode::isObject) + .map(rp -> rp.get("advid")) + .map(RubiconBidder::convertToInt) + .orElse(null); + } + + private static Integer convertToInt(JsonNode jsonNode) { + if (jsonNode.canConvertToInt()) { + return jsonNode.asInt(); + } + + if (jsonNode.isTextual()) { + try { + return Integer.parseInt(jsonNode.asText()); + } catch (NumberFormatException e) { + return null; + } + } + + return null; + } + private String resolveBidId(Imp rubiconImp, RubiconBid bid) { return generateBidId ? Optional.ofNullable(rubiconImp) diff --git a/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java b/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java index 5ed82129c2f..49cb2a20e97 100644 --- a/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/rubicon/RubiconBidderTest.java @@ -3430,6 +3430,62 @@ public void makeBidsShouldSetSeatToMetaSeat() throws JsonProcessingException { .containsExactly(expectedBidExt); } + @Test + public void makeBidsShouldSetBidExtRpAdvidToMetaAdvertiserId() throws JsonProcessingException { + // given + final ObjectNode givenBidExt = mapper.createObjectNode() + .set("rp", mapper.createObjectNode().put("advid", "1")); + + final BidderCall httpCall = givenHttpCall( + givenBidRequest(identity()), + mapper.writeValueAsString(RubiconBidResponse.builder() + .cur("USD") + .seatbid(singletonList(RubiconSeatBid.builder() + .bid(singletonList(givenRubiconBid(bid -> bid.ext(givenBidExt)))) + .build())) + .build())); + + // when + final Result> result = target.makeBids(httpCall, givenBidRequest(identity())); + + // then + final ObjectNode expectedBidExt = givenBidExt.deepCopy() + .set("prebid", mapper.createObjectNode() + .set("meta", mapper.createObjectNode().put("advertiserId", 1))); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .extracting(BidderBid::getBid) + .extracting(Bid::getExt) + .containsExactly(expectedBidExt); + } + + @Test + public void makeBidsShouldSetBidAdomainToMetaAdvertiserDomains() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall( + givenBidRequest(identity()), + mapper.writeValueAsString(RubiconBidResponse.builder() + .cur("USD") + .seatbid(singletonList(RubiconSeatBid.builder() + .bid(singletonList(givenRubiconBid(bid -> bid.adomain(List.of("A", "B"))))) + .build())) + .build())); + + // when + final Result> result = target.makeBids(httpCall, givenBidRequest(identity())); + + // then + final ObjectNode expectedBidExt = mapper.valueToTree( + ExtPrebid.of(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().advertiserDomains(List.of("A", "B")).build()) + .build(), null)); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .extracting(BidderBid::getBid) + .extracting(Bid::getExt) + .containsExactly(expectedBidExt); + } + @Test public void makeBidsShouldSetSeatBuyerToMetaNetworkId() throws JsonProcessingException { // given diff --git a/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json b/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json index 0f321a8402e..b0a256793f6 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json @@ -15,6 +15,9 @@ "w": 300, "h": 250, "ext": { + "rp": { + "advid": "1" + }, "prebid": { "meta": { "advertiserId": 1, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-magnite-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-magnite-bid-response.json index dd045a80c89..bd9eef22d1f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-magnite-bid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-magnite-bid-response.json @@ -15,9 +15,11 @@ "h": 250, "w": 300, "ext": { + "rp": { + "advid": "1" + }, "prebid": { "meta": { - "advertiserId": 1, "secondaryCatIds": [ "id1", "id2" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json b/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json index 3baa5fddcda..f7136a7cffc 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json @@ -15,6 +15,9 @@ "w": 300, "h": 250, "ext": { + "rp": { + "advid": "1" + }, "prebid": { "meta": { "advertiserId": 1, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-rubicon-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-rubicon-bid-response.json index dd045a80c89..bd9eef22d1f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-rubicon-bid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-rubicon-bid-response.json @@ -15,9 +15,11 @@ "h": 250, "w": 300, "ext": { + "rp": { + "advid": "1" + }, "prebid": { "meta": { - "advertiserId": 1, "secondaryCatIds": [ "id1", "id2"