Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions extra/bundle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.prebid</groupId>
<artifactId>prebid-server-aggregator</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
<relativePath>../../extra/pom.xml</relativePath>
</parent>

Expand Down Expand Up @@ -77,12 +77,12 @@
<dependency>
<groupId>org.prebid</groupId>
<artifactId>prebid-server</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.prebid.server.hooks.modules</groupId>
<artifactId>ortb2-blocking</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
</dependency>
</dependencies>

Expand Down
2 changes: 1 addition & 1 deletion extra/modules/ortb2-blocking/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.prebid.server.hooks.modules</groupId>
<artifactId>all-modules</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
</parent>

<artifactId>ortb2-blocking</artifactId>
Expand Down
4 changes: 2 additions & 2 deletions extra/modules/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.prebid</groupId>
<artifactId>prebid-server-aggregator</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
<relativePath>../../extra/pom.xml</relativePath>
</parent>

Expand All @@ -26,7 +26,7 @@
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>

<prebid-server.version>1.87.0-SNAPSHOT</prebid-server.version>
<prebid-server.version>1.88.0-SNAPSHOT</prebid-server.version>

<lombok.version>1.18.22</lombok.version>

Expand Down
2 changes: 1 addition & 1 deletion extra/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>org.prebid</groupId>
<artifactId>prebid-server-aggregator</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
<packaging>pom</packaging>

<scm>
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.prebid</groupId>
<artifactId>prebid-server-aggregator</artifactId>
<version>1.87.0-SNAPSHOT</version>
<version>1.88.0-SNAPSHOT</version>
<relativePath>extra/pom.xml</relativePath>
</parent>

Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/prebid/server/bidder/model/BidderError.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ public static BidderError badServerResponse(String message) {
return BidderError.of(message, Type.bad_server_response);
}

public static BidderError rejectedIpf(String message) {
return BidderError.of(message, Type.rejected_ipf);
}

public static BidderError failedToRequestBids(String message) {
return BidderError.of(message, Type.failed_to_request_bids);
}
Expand Down Expand Up @@ -79,6 +83,11 @@ public enum Type {
*/
invalid_bid(5),

/**
* Covers the case where a bid was rejected by price-floors feature functionality
*/
rejected_ipf(6),

timeout(1),
generic(999);

Expand Down
113 changes: 68 additions & 45 deletions src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.prebid.server.bidder.model.BidderError;
import org.prebid.server.bidder.model.HttpCall;
import org.prebid.server.bidder.model.HttpRequest;
import org.prebid.server.bidder.model.PriceFloorInfo;
import org.prebid.server.bidder.model.Result;
import org.prebid.server.bidder.rubicon.proto.request.RubiconAppExt;
import org.prebid.server.bidder.rubicon.proto.request.RubiconBannerExt;
Expand Down Expand Up @@ -67,8 +68,6 @@
import org.prebid.server.currency.CurrencyConversionService;
import org.prebid.server.exception.PreBidException;
import org.prebid.server.floors.PriceFloorResolver;
import org.prebid.server.floors.model.PriceFloorData;
import org.prebid.server.floors.model.PriceFloorModelGroup;
import org.prebid.server.floors.model.PriceFloorResult;
import org.prebid.server.floors.model.PriceFloorRules;
import org.prebid.server.json.DecodeException;
Expand Down Expand Up @@ -418,14 +417,31 @@ private Imp makeImp(Imp imp,
final PriceFloorResult priceFloorResult = resolvePriceFloors(bidRequest, imp,
isVideo ? ImpMediaType.video : ImpMediaType.banner, priceFloorsWarnings);

final BigDecimal ipfFloor = ObjectUtil.getIfNotNull(priceFloorResult, PriceFloorResult::getFloorValue);
final String ipfCurrency = ipfFloor != null
? resolveCurrencyFromFloorResult(
ObjectUtil.getIfNotNull(priceFloorResult, PriceFloorResult::getCurrency),
bidRequest,
imp,
errors)
: null;

final Imp.ImpBuilder builder = imp.toBuilder()
.metric(makeMetrics(imp))
.ext(mapper.mapper().valueToTree(
makeImpExt(imp, extImpRubicon, site, app, extRequest, priceFloorResult)));

final BigDecimal resolvedBidFloor = priceFloorResult != null
? resolvePriceFloorBidFloor(imp, bidRequest, priceFloorResult, errors)
: resolveBidFloor(imp, bidRequest, errors);
makeImpExt(
imp,
bidRequest,
extImpRubicon,
site,
app,
extRequest,
ipfCurrency,
priceFloorResult)));

final BigDecimal resolvedBidFloor = ipfFloor != null
? convertToXAPICurrency(ipfFloor, ipfCurrency, imp, bidRequest)
: resolveBidFloorFromImp(imp, bidRequest, errors);

if (resolvedBidFloor != null) {
builder
Expand Down Expand Up @@ -455,21 +471,16 @@ private PriceFloorResult resolvePriceFloors(BidRequest bidRequest,

return floorResolver.resolve(
bidRequest,
extractFloorModelGroup(bidRequest),
extractFloorRules(bidRequest),
imp,
mediaType,
null,
warnings);
}

private static PriceFloorModelGroup extractFloorModelGroup(BidRequest bidRequest) {
private static PriceFloorRules extractFloorRules(BidRequest bidRequest) {
final ExtRequestPrebid prebid = ObjectUtil.getIfNotNull(bidRequest.getExt(), ExtRequest::getPrebid);
final PriceFloorRules floorRules = ObjectUtil.getIfNotNull(prebid, ExtRequestPrebid::getFloors);

final PriceFloorData data = ObjectUtil.getIfNotNull(floorRules, PriceFloorRules::getData);
final List<PriceFloorModelGroup> modelGroups = ObjectUtil.getIfNotNull(data, PriceFloorData::getModelGroups);

return CollectionUtils.isNotEmpty(modelGroups) ? modelGroups.get(0) : null;
return ObjectUtil.getIfNotNull(prebid, ExtRequestPrebid::getFloors);
}

private List<Metric> makeMetrics(Imp imp) {
Expand All @@ -495,31 +506,27 @@ private boolean isMetricSupported(Metric metric) {
return supportedVendors.contains(metric.getVendor()) && Objects.equals(metric.getType(), "viewability");
}

private BigDecimal resolvePriceFloorBidFloor(Imp imp,
BidRequest bidRequest,
PriceFloorResult floorResult,
List<BidderError> errors) {
final BigDecimal floorValue = ObjectUtil.getIfNotNull(floorResult, PriceFloorResult::getFloorValue);
if (floorValue == null) {
private BigDecimal resolveBidFloorFromImp(Imp imp, BidRequest bidRequest, List<BidderError> errors) {
final BigDecimal resolvedBidFloorPrice = resolveBidFloorPrice(imp);
if (resolvedBidFloorPrice == null) {
return null;
}

final String floorCurrency = resolveCurrencyFromFloorResult(floorResult, bidRequest, imp, errors);
return ObjectUtils.notEqual(floorCurrency, XAPI_CURRENCY)
? convertBidFloorCurrency(floorValue, floorCurrency, imp, bidRequest)
: null;
return convertToXAPICurrency(
resolvedBidFloorPrice,
resolveBidFloorCurrency(imp, bidRequest, errors),
imp,
bidRequest);
}

private BigDecimal resolveBidFloor(Imp imp, BidRequest bidRequest, List<BidderError> errors) {
final BigDecimal resolvedBidFloorPrice = resolveBidFloorPrice(imp);
if (resolvedBidFloorPrice == null) {
return null;
}
private BigDecimal convertToXAPICurrency(BigDecimal value,
String fromCurrency,
Imp imp,
BidRequest bidRequest) {

final String resolvedBidFloorCurrency = resolveBidFloorCurrency(imp, bidRequest, errors);
return ObjectUtils.notEqual(resolvedBidFloorCurrency, XAPI_CURRENCY)
? convertBidFloorCurrency(resolvedBidFloorPrice, resolvedBidFloorCurrency, imp, bidRequest)
: null;
return ObjectUtils.notEqual(fromCurrency, XAPI_CURRENCY)
? convertBidFloorCurrency(value, fromCurrency, imp, bidRequest)
: value;
}

private static BigDecimal resolveBidFloorPrice(Imp imp) {
Expand All @@ -539,20 +546,19 @@ private static String resolveBidFloorCurrency(Imp imp, BidRequest bidRequest, Li
return bidFloorCurrency;
}

private static String resolveCurrencyFromFloorResult(PriceFloorResult floorResult,
private static String resolveCurrencyFromFloorResult(String floorCurrency,
BidRequest bidRequest,
Imp imp,
List<BidderError> errors) {

final String bidFloorCurrency = floorResult.getCurrency();
if (StringUtils.isBlank(bidFloorCurrency)) {
if (StringUtils.isBlank(floorCurrency)) {
if (isDebugEnabled(bidRequest)) {
errors.add(BidderError.badInput(String.format("Imp `%s` floor provided with no currency, assuming %s",
imp.getId(), XAPI_CURRENCY)));
errors.add(BidderError.badInput(String.format("Ipf for imp `%s` provided floor with no currency, "
+ "assuming %s", imp.getId(), XAPI_CURRENCY)));
}
return XAPI_CURRENCY;
}
return bidFloorCurrency;
return floorCurrency;
}

/**
Expand Down Expand Up @@ -581,15 +587,17 @@ private BigDecimal convertBidFloorCurrency(BigDecimal bidFloor,
}

private RubiconImpExt makeImpExt(Imp imp,
BidRequest bidRequest,
ExtImpRubicon rubiconImpExt,
Site site,
App app,
ExtRequest extRequest,
String ipfResolvedCurrency,
PriceFloorResult priceFloorResult) {

final ExtImpContext context = extImpContext(imp);
final RubiconImpExtPrebid rubiconImpExtPrebid = priceFloorResult != null
? makeRubiconExtPrebid(priceFloorResult)
? makeRubiconExtPrebid(priceFloorResult, ipfResolvedCurrency, imp, bidRequest)
: null;
return RubiconImpExt.of(
RubiconImpExtRp.of(
Expand Down Expand Up @@ -626,11 +634,14 @@ private JsonNode makeTarget(Imp imp, ExtImpRubicon rubiconImpExt, Site site, App
return result.size() > 0 ? result : null;
}

private RubiconImpExtPrebid makeRubiconExtPrebid(PriceFloorResult priceFloorResult) {
private RubiconImpExtPrebid makeRubiconExtPrebid(PriceFloorResult priceFloorResult,
String currency,
Imp imp,
BidRequest bidRequest) {
return RubiconImpExtPrebid.of(ExtImpPrebidFloors.of(
priceFloorResult.getFloorRule(),
priceFloorResult.getFloorRuleValue(),
priceFloorResult.getFloorValue()));
convertToXAPICurrency(priceFloorResult.getFloorRuleValue(), currency, imp, bidRequest),
convertToXAPICurrency(priceFloorResult.getFloorValue(), currency, imp, bidRequest)));
}

private void mergeFirstPartyDataFromSite(Site site, ObjectNode result) {
Expand Down Expand Up @@ -1477,6 +1488,8 @@ private List<BidderBid> bidsFromResponse(BidRequest prebidRequest,
List<BidderError> errors) {
final Map<String, Imp> idToImp = prebidRequest.getImp().stream()
.collect(Collectors.toMap(Imp::getId, Function.identity()));
final Map<String, Imp> idToRubiconImp = bidRequest.getImp().stream()
.collect(Collectors.toMap(Imp::getId, Function.identity()));
final Float cpmOverrideFromRequest = cpmOverrideFromRequest(prebidRequest);
final BidType bidType = bidType(bidRequest);

Expand All @@ -1487,7 +1500,7 @@ private List<BidderBid> bidsFromResponse(BidRequest prebidRequest,
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.map(bid -> updateBid(bid, idToImp.get(bid.getImpid()), cpmOverrideFromRequest, bidResponse))
.map(bid -> BidderBid.of(bid, bidType, bidResponse.getCur()))
.map(bid -> createBidderBid(bid, idToRubiconImp.get(bid.getImpid()), bidType, bidResponse.getCur()))
.collect(Collectors.toList());
}

Expand Down Expand Up @@ -1561,6 +1574,16 @@ private Bid updateBid(Bid bid, Imp imp, Float cpmOverrideFromRequest, RubiconBid
.build();
}

private static BidderBid createBidderBid(Bid bid, Imp imp, BidType bidType, String currency) {

return BidderBid.builder()
.bid(bid)
.type(bidType)
.bidCurrency(currency)
.priceFloorInfo(imp != null ? PriceFloorInfo.of(imp.getBidfloor(), imp.getBidfloorcur()) : null)
.build();
}

private Float cpmOverrideFromRequest(BidRequest bidRequest) {
final RubiconExtPrebidBiddersBidder bidder = extPrebidBiddersRubicon(bidRequest.getExt());
final RubiconExtPrebidBiddersBidderDebug debug = bidder != null ? bidder.getDebug() : null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ private AuctionParticipation applyEnforcement(BidRequest bidRequest,

final List<BidderBid> updatedBidderBids = new ArrayList<>(bidderBids);
final List<BidderError> errors = new ArrayList<>(seatBid.getErrors());
final List<BidderError> warnings = new ArrayList<>(seatBid.getErrors());
final List<BidderError> warnings = new ArrayList<>(seatBid.getWarnings());

final BidRequest bidderBidRequest = auctionParticipation.getBidderRequest().getBidRequest();
final PriceFloorRules floors = extractFloors(auctionParticipation);
Expand All @@ -153,7 +153,7 @@ private AuctionParticipation applyEnforcement(BidRequest bidRequest,
final BigDecimal floor = resolveFloor(bidderBid, bidderBidRequest, bidRequest, errors);

if (isPriceBelowFloor(price, floor)) {
warnings.add(BidderError.generic(
warnings.add(BidderError.rejectedIpf(
String.format("Bid with id '%s' was rejected by floor enforcement: "
+ "price %s is below the floor %s", bid.getId(), price, floor)));

Expand Down
Loading