Skip to content
Merged
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
97 changes: 53 additions & 44 deletions src/main/java/org/prebid/server/auction/BidResponseCreator.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
.map(auctionParticipations -> updateResponsesMetrics(auctionParticipations, account, aliases))
.map(context::with))
// produce response from bidder results
.compose(context -> bidResponseCreator.create(context, cacheInfo, aliases, bidderToMultiBid)
.compose(context -> bidResponseCreator.create(context, cacheInfo, bidderToMultiBid)
.map(bidResponse -> criteriaLogManager.traceResponse(
logger,
bidResponse,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.map.CaseInsensitiveMap;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.bidder.BidderCatalog;

Expand Down Expand Up @@ -85,10 +86,19 @@ private Integer resolveAliasVendorIdViaCatalog(String alias) {
}

public boolean isAllowedAlternateBidderCode(String bidder, String alternateBidderCode) {
final Set<String> allowedBidderCodes = bidderToAllowedBidderCodes.getOrDefault(bidder, Collections.emptySet());
final Set<String> allowedBidderCodes = ObjectUtils.firstNonNull(
bidderToAllowedBidderCodes.get(bidder),
bidderToAllowedBidderCodes.get(resolveBidder(bidder)),
Collections.emptySet());
return allowedBidderCodes.contains(WILDCARD) || allowedBidderCodes.contains(alternateBidderCode);
}

public boolean isKnownAlternateBidderCode(String alternateBidderCode) {
return bidderToAllowedBidderCodes.values().stream()
.anyMatch(knownBidderCodes ->
knownBidderCodes.contains(WILDCARD) || knownBidderCodes.contains(alternateBidderCode));
}

private static Map<String, Set<String>> resolveAlternateBidderCodes(
AlternateBidderCodesConfig alternateBidderCodes) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,15 @@ public class BidderResponseInfo {

String bidder;

String seat;

String adapterCode;

BidderSeatBidInfo seatBid;

int responseTime;

public BidderResponseInfo with(BidderSeatBidInfo seatBid) {
return of(this.bidder, seatBid, this.responseTime);
return of(this.bidder, this.seat, this.adapterCode, seatBid, this.responseTime);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.prebid.server.bidadjustments;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.DecimalNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
Expand All @@ -21,18 +22,22 @@
import org.prebid.server.proto.openrtb.ext.request.ExtRequestBidAdjustmentFactors;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
import org.prebid.server.proto.openrtb.ext.request.ImpMediaType;
import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid;
import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta;
import org.prebid.server.util.PbsUtil;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

public class BidAdjustmentsProcessor {

private static final String ORIGINAL_BID_CPM = "origbidcpm";
private static final String ORIGINAL_BID_CURRENCY = "origbidcur";
private static final String PREBID_EXT = "prebid";

private final CurrencyConversionService currencyService;
private final BidAdjustmentFactorResolver bidAdjustmentFactorResolver;
Expand Down Expand Up @@ -97,7 +102,7 @@ private BidderBid applyBidAdjustments(BidderBid bidderBid,

final Price priceWithFactorsApplied = applyBidAdjustmentFactors(
originalPrice,
bidder,
getAdapterCode(bidderBid.getBid()),
bidderBid.getSeat(),
bidRequest,
mediaType);
Expand All @@ -117,6 +122,23 @@ private BidderBid applyBidAdjustments(BidderBid bidderBid,
}
}

private String getAdapterCode(Bid bid) {
return Optional.ofNullable(bid.getExt())
.filter(ext -> ext.hasNonNull(PREBID_EXT))
.map(this::convertValue)
.map(ExtBidPrebid::getMeta)
.map(ExtBidPrebidMeta::getAdapterCode)
.orElse(null);
}

private ExtBidPrebid convertValue(JsonNode jsonNode) {
try {
return mapper.mapper().convertValue(jsonNode.get(PREBID_EXT), ExtBidPrebid.class);
} catch (IllegalArgumentException ignored) {
return null;
}
}

private BidderBid updateBid(Price originalPrice, Price adjustedPrice, BidderBid bidderBid, BidRequest bidRequest) {
final Bid bid = bidderBid.getBid();
final ObjectNode bidExt = bid.getExt();
Expand Down
57 changes: 50 additions & 7 deletions src/main/java/org/prebid/server/validation/RequestValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
import org.apache.commons.collections4.map.CaseInsensitiveMap;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.auction.aliases.AlternateBidder;
import org.prebid.server.auction.aliases.AlternateBidderCodesConfig;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.auction.model.debug.DebugContext;
import org.prebid.server.bidder.BidderCatalog;
import org.prebid.server.json.JacksonMapper;
Expand Down Expand Up @@ -135,10 +138,17 @@ public ValidationResult validate(Account account,
validateTargeting(targeting);
}
aliases = new CaseInsensitiveMap<>(MapUtils.emptyIfNull(extRequestPrebid.getAliases()));

validateAliases(aliases, warnings, account);
validateAliasesGvlIds(extRequestPrebid, aliases);
validateBidAdjustmentFactors(extRequestPrebid.getBidadjustmentfactors());
validateAlternateBidderCodes(extRequestPrebid.getAlternateBidderCodes(), aliases);

final AlternateBidderCodesConfig alternateBidderCodesConfig = ObjectUtils.defaultIfNull(
extRequestPrebid.getAlternateBidderCodes(),
account == null ? null : account.getAlternateBidderCodes());

final BidderAliases bidderAliases = BidderAliases.of(
aliases, null, bidderCatalog, alternateBidderCodesConfig);
validateBidAdjustmentFactors(extRequestPrebid.getBidadjustmentfactors(), bidderAliases);
validateExtBidPrebidData(extRequestPrebid.getData(), aliases, isDebugEnabled, warnings);
validateSchains(extRequestPrebid.getSchains());
}
Expand Down Expand Up @@ -241,8 +251,24 @@ private void validateAliasesGvlIds(ExtRequestPrebid extRequestPrebid,
}
}

private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustmentFactors)
throws ValidationException {
private void validateAlternateBidderCodes(AlternateBidderCodesConfig alternateBidderCodesConfig,
Map<String, String> aliases) throws ValidationException {

final Map<String, ? extends AlternateBidder> alternateBidders = Optional.ofNullable(alternateBidderCodesConfig)
.map(AlternateBidderCodesConfig::getBidders)
.orElse(Collections.emptyMap());

for (Map.Entry<String, ? extends AlternateBidder> alternateBidder : alternateBidders.entrySet()) {
final String bidder = alternateBidder.getKey();
if (isUnknownBidderOrAlias(bidder, aliases)) {
throw new ValidationException(
"request.ext.prebid.alternatebiddercodes.bidders.%s is not a known bidder or alias", bidder);
}
}
}

private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustmentFactors,
BidderAliases bidderAliases) throws ValidationException {

final Map<String, BigDecimal> bidderAdjustments = adjustmentFactors != null
? adjustmentFactors.getAdjustments()
Expand All @@ -251,6 +277,14 @@ private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustm
for (Map.Entry<String, BigDecimal> bidderAdjustment : bidderAdjustments.entrySet()) {
final String bidder = bidderAdjustment.getKey();

if (!bidderCatalog.isValidName(bidder)
&& !bidderAliases.isAliasDefined(bidder)
&& !bidderAliases.isKnownAlternateBidderCode(bidder)) {

throw new ValidationException(
"request.ext.prebid.bidadjustmentfactors.%s is not a known bidder or alias", bidder);
}

final BigDecimal adjustmentFactor = bidderAdjustment.getValue();
if (adjustmentFactor.compareTo(BigDecimal.ZERO) <= 0) {
throw new ValidationException(
Expand All @@ -269,17 +303,26 @@ private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustm

for (Map.Entry<ImpMediaType, Map<String, BigDecimal>> entry
: adjustmentsMediaTypeFactors.entrySet()) {
validateBidAdjustmentFactorsByMediatype(entry.getKey(), entry.getValue());
validateBidAdjustmentFactorsByMediatype(entry.getKey(), entry.getValue(), bidderAliases);
}
}

private void validateBidAdjustmentFactorsByMediatype(ImpMediaType mediaType,
Map<String, BigDecimal> bidderAdjustments)
throws ValidationException {
Map<String, BigDecimal> bidderAdjustments,
BidderAliases bidderAliases) throws ValidationException {

for (Map.Entry<String, BigDecimal> bidderAdjustment : bidderAdjustments.entrySet()) {
final String bidder = bidderAdjustment.getKey();

if (!bidderCatalog.isValidName(bidder)
&& !bidderAliases.isAliasDefined(bidder)
&& !bidderAliases.isKnownAlternateBidderCode(bidder)) {

throw new ValidationException(
"request.ext.prebid.bidadjustmentfactors.%s.%s is not a known bidder or alias",
mediaType, bidder);
}

final BigDecimal adjustmentFactor = bidderAdjustment.getValue();
if (adjustmentFactor.compareTo(BigDecimal.ZERO) <= 0) {
throw new ValidationException(
Expand Down
Loading
Loading