Skip to content

Commit

Permalink
Make multibid-config available to bidders (#1193)
Browse files Browse the repository at this point in the history
  • Loading branch information
SerhiiNahornyi authored and nickluck8 committed Aug 10, 2021
1 parent 4291b2b commit d014af3
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 30 deletions.
37 changes: 29 additions & 8 deletions src/main/java/org/prebid/server/auction/ExchangeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@
import org.prebid.server.proto.openrtb.ext.request.ExtApp;
import org.prebid.server.proto.openrtb.ext.request.ExtBidderConfigOrtb;
import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidCache;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidMultiBid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidSchain;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidSchainSchain;
Expand Down Expand Up @@ -161,7 +161,8 @@ public Future<BidResponse> holdAuction(AuctionContext context) {

return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), timeout)
.map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedAuctionResponses))
.compose(storedResponseResult -> extractBidderRequests(context, storedResponseResult, aliases))
.compose(storedResponseResult -> extractBidderRequests(
context, storedResponseResult, aliases, bidderToMultiBid))
.map(bidderRequests -> updateRequestMetric(
bidderRequests, uidsCookie, aliases, publisherId, context.getRequestTypeMetric()))
.compose(bidderRequests -> CompositeFuture.join(
Expand Down Expand Up @@ -366,7 +367,8 @@ private static StoredResponseResult populateStoredResponse(StoredResponseResult
*/
private Future<List<BidderRequest>> extractBidderRequests(AuctionContext context,
StoredResponseResult storedResponseResult,
BidderAliases aliases) {
BidderAliases aliases,
Map<String, MultiBidConfig> bidderToMultiBid) {
final List<Imp> imps = storedResponseResult.getRequiredRequestImps().stream()
.filter(imp -> bidderParamsFromImpExt(imp.getExt()) != null)
.collect(Collectors.toList());
Expand All @@ -378,7 +380,7 @@ private Future<List<BidderRequest>> extractBidderRequests(AuctionContext context
.collect(Collectors.toList());

return makeBidderRequests(bidders, context, aliases, storedResponseResult.getImpBidderToStoredBidResponse(),
imps);
imps, bidderToMultiBid);
}

private static JsonNode bidderParamsFromImpExt(ObjectNode ext) {
Expand Down Expand Up @@ -411,7 +413,8 @@ private Future<List<BidderRequest>> makeBidderRequests(List<String> bidders,
AuctionContext context,
BidderAliases aliases,
Map<String, Map<String, String>> impBidderToStoredResponse,
List<Imp> imps) {
List<Imp> imps,
Map<String, MultiBidConfig> bidderToMultiBid) {

final BidRequest bidRequest = context.getBidRequest();
final User user = bidRequest.getUser();
Expand All @@ -430,7 +433,7 @@ private Future<List<BidderRequest>> makeBidderRequests(List<String> bidders,
.mask(context, bidderToUser, bidders, aliases)
.map(bidderToPrivacyResult ->
getBidderRequests(bidderToPrivacyResult, bidRequest, impBidderToStoredResponse, imps,
biddersToConfigs));
bidderToMultiBid, biddersToConfigs));
}

private Map<String, ExtBidderConfigOrtb> getBiddersToConfigs(ExtRequestPrebid prebid) {
Expand Down Expand Up @@ -639,6 +642,7 @@ private List<BidderRequest> getBidderRequests(List<BidderPrivacyResult> bidderPr
BidRequest bidRequest,
Map<String, Map<String, String>> impBidderToStoredBidResponse,
List<Imp> imps,
Map<String, MultiBidConfig> bidderToMultiBid,
Map<String, ExtBidderConfigOrtb> biddersToConfigs) {

final Map<String, JsonNode> bidderToPrebidBidders = bidderToPrebidBidders(bidRequest);
Expand All @@ -652,6 +656,7 @@ private List<BidderRequest> getBidderRequests(List<BidderPrivacyResult> bidderPr
bidRequest,
impBidderToStoredBidResponse,
imps,
bidderToMultiBid,
biddersToConfigs,
bidderToPrebidBidders))
.filter(Objects::nonNull)
Expand Down Expand Up @@ -689,6 +694,7 @@ private BidderRequest createBidderRequest(BidderPrivacyResult bidderPrivacyResul
BidRequest bidRequest,
Map<String, Map<String, String>> impBidderToStoredBidResponse,
List<Imp> imps,
Map<String, MultiBidConfig> bidderToMultiBid,
Map<String, ExtBidderConfigOrtb> biddersToConfigs,
Map<String, JsonNode> bidderToPrebidBidders) {

Expand Down Expand Up @@ -727,7 +733,7 @@ private BidderRequest createBidderRequest(BidderPrivacyResult bidderPrivacyResul
.app(prepareApp(bidRequestApp, fpdApp, useFirstPartyData))
.site(prepareSite(bidRequestSite, fpdSite, useFirstPartyData))
.source(prepareSource(bidder, bidRequest))
.ext(prepareExt(bidder, bidderToPrebidBidders, bidRequest.getExt()))
.ext(prepareExt(bidder, bidderToPrebidBidders, bidderToMultiBid, bidRequest.getExt()))
.build());
}

Expand Down Expand Up @@ -881,6 +887,7 @@ private Source prepareSource(String bidder, BidRequest bidRequest) {
*/
private ExtRequest prepareExt(String bidder,
Map<String, JsonNode> bidderToPrebidBidders,
Map<String, MultiBidConfig> bidderToMultiBid,
ExtRequest requestExt) {

final ExtRequestPrebid extPrebid = requestExt != null ? requestExt.getPrebid() : null;
Expand All @@ -893,7 +900,12 @@ private ExtRequest prepareExt(String bidder,
final boolean suppressBidderConfig = extPrebidBidderconfig != null;
final boolean suppressPrebidData = extPrebidData != null;

if (bidderToPrebidBidders.isEmpty() && !suppressSchains && !suppressBidderConfig && !suppressPrebidData) {
if (bidderToPrebidBidders.isEmpty()
&& bidderToMultiBid.isEmpty()
&& !suppressSchains
&& !suppressBidderConfig
&& !suppressPrebidData) {

return requestExt;
}

Expand All @@ -908,13 +920,22 @@ private ExtRequest prepareExt(String bidder,

return ExtRequest.of(
extPrebidBuilder
.multibid(resolveExtRequestMultiBids(bidderToMultiBid.get(bidder), bidder))
.bidders(bidders)
.schains(null)
.data(null)
.bidderconfig(null)
.build());
}

private List<ExtRequestPrebidMultiBid> resolveExtRequestMultiBids(MultiBidConfig multiBidConfig,
String bidder) {
return multiBidConfig != null
? Collections.singletonList(ExtRequestPrebidMultiBid.of(
bidder, null, multiBidConfig.getMaxBids(), multiBidConfig.getTargetBidderCodePrefix()))
: null;
}

/**
* Updates 'account.*.request', 'request' and 'no_cookie_requests' metrics for each {@link BidderRequest}.
*/
Expand Down
31 changes: 26 additions & 5 deletions src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
import org.prebid.server.proto.openrtb.ext.request.ExtPublisher;
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidMultiBid;
import org.prebid.server.proto.openrtb.ext.request.ExtSite;
import org.prebid.server.proto.openrtb.ext.request.ExtUser;
import org.prebid.server.proto.openrtb.ext.request.ExtUserEid;
Expand Down Expand Up @@ -329,7 +330,7 @@ private BidRequest createSingleRequest(Imp imp,
final App app = bidRequest.getApp();

return bidRequest.toBuilder()
.imp(Collections.singletonList(makeImp(imp, extPrebid, extRubicon, site, app)))
.imp(Collections.singletonList(makeImp(imp, extPrebid, extRubicon, site, app, bidRequest.getExt())))
.user(makeUser(bidRequest.getUser(), extRubicon))
.device(makeDevice(bidRequest.getDevice()))
.site(makeSite(site, impLanguage, extRubicon))
Expand Down Expand Up @@ -377,10 +378,14 @@ private RubiconExtPrebidBiddersBidder extPrebidBiddersRubicon(ExtRequest extRequ
return null;
}

private Imp makeImp(Imp imp, ExtImpPrebid extPrebid, ExtImpRubicon extRubicon, Site site, App app) {
private Imp makeImp(Imp imp,
ExtImpPrebid extPrebid,
ExtImpRubicon extRubicon,
Site site, App app,
ExtRequest extRequest) {
final Imp.ImpBuilder builder = imp.toBuilder()
.metric(makeMetrics(imp))
.ext(mapper.mapper().valueToTree(makeImpExt(imp, extRubicon, site, app)));
.ext(mapper.mapper().valueToTree(makeImpExt(imp, extRubicon, site, app, extRequest)));

if (isVideo(imp)) {
builder
Expand Down Expand Up @@ -418,13 +423,19 @@ private boolean isMetricSupported(Metric metric) {
return supportedVendors.contains(metric.getVendor()) && Objects.equals(metric.getType(), "viewability");
}

private RubiconImpExt makeImpExt(Imp imp, ExtImpRubicon rubiconImpExt, Site site, App app) {
private RubiconImpExt makeImpExt(Imp imp,
ExtImpRubicon rubiconImpExt,
Site site,
App app,
ExtRequest extRequest) {

return RubiconImpExt.of(
RubiconImpExtRp.of(
rubiconImpExt.getZoneId(),
makeTarget(imp, rubiconImpExt, site, app),
RubiconImpExtRpTrack.of("", "")),
mapVendorsNamesToUrls(imp.getMetric()));
mapVendorsNamesToUrls(imp.getMetric()),
getMaxBids(extRequest));
}

private JsonNode makeTarget(Imp imp, ExtImpRubicon rubiconImpExt, Site site, App app) {
Expand Down Expand Up @@ -638,6 +649,16 @@ private List<String> mapVendorsNamesToUrls(List<Metric> metrics) {
return vendorsUrls.isEmpty() ? null : vendorsUrls;
}

private Integer getMaxBids(ExtRequest extRequest) {
final ExtRequestPrebid extRequestPrebid = extRequest != null ? extRequest.getPrebid() : null;
final List<ExtRequestPrebidMultiBid> multibids = extRequestPrebid != null
? extRequestPrebid.getMultibid() : null;
final ExtRequestPrebidMultiBid extRequestPrebidMultiBid =
CollectionUtils.isNotEmpty(multibids) ? multibids.get(0) : null;

return extRequestPrebidMultiBid != null ? extRequestPrebidMultiBid.getMaxBids() : null;
}

private static boolean isVideo(Imp imp) {
final Video video = imp.getVideo();
if (video != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public class RubiconImpExt {
RubiconImpExtRp rp;

List<String> viewabilityvendors;

Integer maxbids;
}
41 changes: 41 additions & 0 deletions src/test/java/org/prebid/server/auction/ExchangeServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -1422,6 +1423,46 @@ public void shouldCleanRequestExtPrebidData() {
.build()));
}

@Test
public void shouldAddMultiBidInfoAboutRequestedBidderIfDataShouldNotBeSuppressed() {
// given
final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1)),
builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder()
.multibid(Collections.singletonList(
ExtRequestPrebidMultiBid.of("someBidder", null, 3, "prefix")))
.build())));

// when
exchangeService.holdAuction(givenRequestContext(bidRequest));

// then
final ExtRequest extRequest = captureBidRequest().getExt();
assertThat(extRequest)
.extracting(ExtRequest::getPrebid)
.flatExtracting("multibid")
.containsExactly(ExtRequestPrebidMultiBid.of("someBidder", null, 3, "prefix"));
}

@Test
public void shouldAddMultibidInfoOnlyAboutRequestedBidder() {
// given
final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1)),
builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder()
.multibid(Collections.singletonList(
ExtRequestPrebidMultiBid.of(null, asList("someBidder", "anotherBidder"), 3, null)))
.build())));

// when
exchangeService.holdAuction(givenRequestContext(bidRequest));

// then
final ExtRequest extRequest = captureBidRequest().getExt();
assertThat(extRequest)
.extracting(ExtRequest::getPrebid)
.flatExtracting("multibid")
.containsExactly(ExtRequestPrebidMultiBid.of("someBidder", null, 3, null));
}

@Test
public void shouldPassUserDataAndExtDataOnlyForAllowedBidder() {
// given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import org.prebid.server.proto.openrtb.ext.request.ExtRegs;
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidMultiBid;
import org.prebid.server.proto.openrtb.ext.request.ExtSite;
import org.prebid.server.proto.openrtb.ext.request.ExtUser;
import org.prebid.server.proto.openrtb.ext.request.ExtUserEid;
Expand Down Expand Up @@ -206,6 +207,30 @@ public void makeHttpRequestsShouldReplaceDefaultParametersWithExtPrebidBiddersBi
.returns(expectedUrl, HttpRequest::getUri);
}

@Test
public void makeHttpRequestsShouldAddMaxbidsAttributeFromExtPrebidMultibid() {
// given
final BidRequest bidRequest = givenBidRequest(
builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder()
.multibid(singletonList(ExtRequestPrebidMultiBid.of("rubicon", null, 5, "prefix")))
.build())),
impBuilder -> impBuilder.video(Video.builder().build()),
identity());

// when
final Result<List<HttpRequest<BidRequest>>> result = rubiconBidder.makeHttpRequests(bidRequest);

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).doesNotContainNull()
.extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class))
.flatExtracting(BidRequest::getImp).doesNotContainNull()
.extracting(Imp::getExt).doesNotContainNull()
.extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class))
.extracting(RubiconImpExt::getMaxbids)
.containsExactly(5);
}

@Test
public void makeHttpRequestsShouldFillImpExt() {
// given
Expand All @@ -227,7 +252,7 @@ public void makeHttpRequestsShouldFillImpExt() {
.extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class))
.containsOnly(RubiconImpExt.of(RubiconImpExtRp.of(4001,
mapper.valueToTree(Inventory.of(singletonList("5-star"), singletonList("tech"))),
RubiconImpExtRpTrack.of("", "")), null));
RubiconImpExtRpTrack.of("", "")), null, null));
}

@Test
Expand Down Expand Up @@ -711,13 +736,13 @@ public void makeHttpRequestsShouldFillWithIabAttributeOnlyIfContainsIabInTaxonom
secondUserDataNode.put("taxonomyname", "not contain");
final BidRequest bidRequest = givenBidRequest(
builder -> builder.user(User.builder().data(asList(Data.builder()
.segment(singletonList(Segment.builder().id("segmentId")
.build()))
.ext(firstUserDataNode).build(),
.segment(singletonList(Segment.builder().id("segmentId")
.build()))
.ext(firstUserDataNode).build(),
Data.builder()
.segment(singletonList(Segment.builder().id("secondSegmentId")
.build()))
.ext(secondUserDataNode).build())).build()),
.segment(singletonList(Segment.builder().id("secondSegmentId")
.build()))
.ext(secondUserDataNode).build())).build()),
builder -> builder.video(Video.builder().build()),
identity());

Expand Down Expand Up @@ -1572,15 +1597,15 @@ public void makeHttpRequestsShouldCreateRequestPerImp() {
.imp(singletonList(Imp.builder()
.video(Video.builder().build())
.ext(mapper.valueToTree(RubiconImpExt.of(
RubiconImpExtRp.of(null, null, RubiconImpExtRpTrack.of("", "")), null)))
RubiconImpExtRp.of(null, null, RubiconImpExtRpTrack.of("", "")), null, null)))
.build()))
.build();
final BidRequest expectedBidRequest2 = BidRequest.builder()
.imp(singletonList(Imp.builder()
.id("2")
.video(Video.builder().build())
.ext(mapper.valueToTree(RubiconImpExt.of(
RubiconImpExtRp.of(null, null, RubiconImpExtRpTrack.of("", "")), null)))
RubiconImpExtRp.of(null, null, RubiconImpExtRpTrack.of("", "")), null, null)))
.build()))
.build();

Expand Down Expand Up @@ -2282,7 +2307,7 @@ public void makeHttpRequestsShouldProcessMetricsAndFillViewabilityVendor() {
.extracting(ext -> mapper.treeToValue(ext, RubiconImpExt.class))
.containsOnly(RubiconImpExt.of(RubiconImpExtRp.of(null,
null,
RubiconImpExtRpTrack.of("", "")), asList("moat.com", "doubleclickbygoogle.com")));
RubiconImpExtRpTrack.of("", "")), asList("moat.com", "doubleclickbygoogle.com"), null));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,6 @@
}
},
"multibid": [
{
"bidder": "rubicon",
"maxbids": 2,
"targetbiddercodeprefix": "rubN"
},
{
"bidder": "appnexus",
"maxbids": 2
Expand Down
Loading

0 comments on commit d014af3

Please sign in to comment.