Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
1d581e4
Multiple Bidder Codes
AntoxaAntoxic Feb 28, 2025
d800ede
Multiple Bidder Codes
AntoxaAntoxic Mar 3, 2025
0ca7246
Fix bid rejection
AntoxaAntoxic Mar 5, 2025
592de04
Merge remote-tracking branch 'refs/remotes/origin/master' into multip…
AntoxaAntoxic Mar 5, 2025
e242c3c
Fix tests
AntoxaAntoxic Mar 5, 2025
c76d2cd
Fix mapping
AntoxaAntoxic Mar 6, 2025
93f2573
Fix mapping
AntoxaAntoxic Mar 6, 2025
9226693
Add case-insensitive checks
AntoxaAntoxic Mar 6, 2025
6dd0a64
Fix soft aliases
AntoxaAntoxic Mar 7, 2025
0a5faa5
Fix json mapping
AntoxaAntoxic Mar 10, 2025
1c94278
Fix comments
AntoxaAntoxic Mar 11, 2025
c8715dc
Fix comments + case-insensitive soft aliases
AntoxaAntoxic Mar 12, 2025
df14a12
NPE fix
AntoxaAntoxic Mar 13, 2025
734b2ab
Fix adapter code case
AntoxaAntoxic Mar 13, 2025
06acd4d
Fix adapter code case
AntoxaAntoxic Mar 13, 2025
afc31dc
Remove ResetDigital Adapter Changes
AntoxaAntoxic Mar 13, 2025
888dfc2
Fix targeting
AntoxaAntoxic Mar 13, 2025
4bdf52e
Merge remote-tracking branch 'refs/remotes/origin/master' into multip…
AntoxaAntoxic Mar 14, 2025
3aa5441
Fix NPE for stored response
osulzhenko Mar 17, 2025
d579a85
Update unit tests
osulzhenko Mar 17, 2025
5ff5b60
Merge branch 'refs/heads/master' into multiple-bidder-codes
osulzhenko Mar 17, 2025
e95f416
Fix comments
AntoxaAntoxic Mar 19, 2025
482bac0
Test: `Multiple biddercode support` (#3687)
marki1an Mar 19, 2025
1b8055f
Merge remote-tracking branch 'refs/remotes/origin/master' into multip…
AntoxaAntoxic Mar 19, 2025
1359e61
Fix tests
AntoxaAntoxic Mar 19, 2025
31f1cff
Fix comments
AntoxaAntoxic Mar 19, 2025
9372e10
Revert Bidadjustments Changes
AntoxaAntoxic Mar 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.iab.openrtb.request.BidRequest;
import io.vertx.core.Future;
import org.prebid.server.auction.BidderAliases;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.auction.versionconverter.OrtbVersion;
import org.prebid.server.bidder.BidderCatalog;
import org.prebid.server.hooks.execution.v1.InvocationResultImpl;
Expand Down
51 changes: 33 additions & 18 deletions src/main/java/org/prebid/server/auction/BidResponseCreator.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.auction.categorymapping.CategoryMappingService;
import org.prebid.server.auction.model.AuctionContext;
import org.prebid.server.auction.model.AuctionParticipation;
Expand Down Expand Up @@ -431,9 +432,15 @@ private List<BidderResponseInfo> toBidderResponseInfos(CategoryMappingResult cat
final BidderSeatBid seatBid = bidderResponse.getSeatBid();

for (final BidderBid bidderBid : seatBid.getBids()) {
final Bid bid = bidderBid.getBid();
final BidType type = bidderBid.getType();
final BidInfo bidInfo = toBidInfo(bid, type, imps, bidder, categoryMappingResult, cacheInfo, account);
final BidInfo bidInfo = toBidInfo(
bidderBid.getBid(),
bidderBid.getType(),
bidderBid.getSeat(),
imps,
bidder,
categoryMappingResult,
cacheInfo,
account);
bidInfos.add(bidInfo);
}

Expand All @@ -453,6 +460,7 @@ private List<BidderResponseInfo> toBidderResponseInfos(CategoryMappingResult cat

private BidInfo toBidInfo(Bid bid,
BidType type,
String seat,
List<Imp> imps,
String bidder,
CategoryMappingResult categoryMappingResult,
Expand All @@ -464,6 +472,7 @@ private BidInfo toBidInfo(Bid bid,
.bid(bid)
.bidType(type)
.bidder(bidder)
.seat(seat)
.correspondingImp(correspondingImp)
.ttl(resolveTtl(bid, type, correspondingImp, cacheInfo, account))
.vastTtl(type == BidType.video ? resolveVastTtl(bid, correspondingImp, cacheInfo, account) : null)
Expand Down Expand Up @@ -761,18 +770,16 @@ private static List<BidInfo> injectTargeting(List<BidInfo> bidderImpIdBidInfos,
final int multiBidSize = bidderImpIdBidInfos.size();
for (int i = 0; i < multiBidSize; i++) {
// first bid have the highest value and can't be extra bid
final boolean isFirstBid = i == 0;
final String targetingBidderCode = isFirstBid
? bidder
: bidderCodePrefix == null ? null : bidderCodePrefix + (i + 1);

final String targetingBidderCode = targetingCode(bidder, bidderCodePrefix, i);
final BidInfo bidInfo = bidderImpIdBidInfos.get(i);

final TargetingInfo targetingInfo = TargetingInfo.builder()
.isTargetingEnabled(targetingBidderCode != null)
.isBidderWinningBid(winningBidsByBidder.contains(bidInfo))
.isWinningBid(winningBids.contains(bidInfo))
.isAddTargetBidderCode(targetingBidderCode != null && multiBidSize > 1)
.bidderCode(targetingBidderCode)
.seat(targetingCode(bidInfo.getSeat(), bidderCodePrefix, i))
.build();

final BidInfo modifiedBidInfo = bidInfo.toBuilder().targetingInfo(targetingInfo).build();
Expand All @@ -782,6 +789,14 @@ private static List<BidInfo> injectTargeting(List<BidInfo> bidderImpIdBidInfos,
return result;
}

private static String targetingCode(String base, String prefix, int i) {
if (i == 0) {
return base;
}

return prefix != null ? prefix + (i + 1) : null;
}

/**
* Returns {@link ExtBidResponse} object, populated with response time, errors and debug info (if requested)
* from all bidders.
Expand Down Expand Up @@ -1429,12 +1444,6 @@ private SeatBid toSeatBid(List<BidInfo> bidInfos,
Map<String, List<ExtBidderError>> bidErrors,
Map<String, List<ExtBidderError>> bidWarnings) {

final String bidder = bidInfos.stream()
.map(BidInfo::getBidder)
.findFirst()
// Should never occur
.orElseThrow(() -> new IllegalArgumentException("Bidder was not defined for bidInfo"));

final List<Bid> bids = bidInfos.stream()
.map(bidInfo -> injectAdmWithCacheInfo(
bidInfo,
Expand All @@ -1451,8 +1460,14 @@ private SeatBid toSeatBid(List<BidInfo> bidInfos,
.filter(Objects::nonNull)
.toList();

final String seat = bidInfos.stream()
.map(BidInfo::getSeat)
.findFirst()
// Should never occur
.orElseThrow(() -> new IllegalArgumentException("BidderCode was not defined for bidInfo"));

return SeatBid.builder()
.seat(bidder)
.seat(seat)
.bid(bids)
.group(0) // prebid cannot support roadblocking
.build();
Expand Down Expand Up @@ -1512,16 +1527,16 @@ private Bid toBid(BidInfo bidInfo,
final String videoCacheId = cacheInfo != null ? cacheInfo.getVideoCacheId() : null;

final Map<String, String> targetingKeywords;
final String bidderCode = targetingInfo.getBidderCode();
if (shouldIncludeTargetingInResponse(targeting, bidInfo.getTargetingInfo())) {
final TargetingKeywordsCreator keywordsCreator = resolveKeywordsCreator(
bidType, targeting, bidRequest, account, bidWarnings);

final boolean isWinningBid = targetingInfo.isWinningBid();
final String seat = targetingInfo.getSeat();
final String categoryDuration = bidInfo.getCategory();
targetingKeywords = keywordsCreator != null
? keywordsCreator.makeFor(
bid, bidderCode, isWinningBid, cacheId, bidType.getName(), videoCacheId, categoryDuration)
bid, seat, isWinningBid, cacheId, bidType.getName(), videoCacheId, categoryDuration)
: null;
} else {
targetingKeywords = null;
Expand All @@ -1539,7 +1554,7 @@ private Bid toBid(BidInfo bidInfo,
.map(ExtBidPrebid::toBuilder)
.orElseGet(ExtBidPrebid::builder)
.targeting(MapUtils.isNotEmpty(targetingKeywords) ? targetingKeywords : null)
.targetBidderCode(targetingInfo.isAddTargetBidderCode() ? bidderCode : null)
.targetBidderCode(targetingInfo.isAddTargetBidderCode() ? targetingInfo.getBidderCode() : null)
.dealTierSatisfied(dealsTierSatisfied)
.cache(cache)
.passThrough(extractPassThrough(bidInfo.getCorrespondingImp()))
Expand Down
60 changes: 0 additions & 60 deletions src/main/java/org/prebid/server/auction/BidderAliases.java

This file was deleted.

2 changes: 1 addition & 1 deletion src/main/java/org/prebid/server/auction/BidsAdjuster.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.iab.openrtb.request.BidRequest;
import com.iab.openrtb.response.Bid;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.auction.model.AuctionContext;
import org.prebid.server.auction.model.AuctionParticipation;
import org.prebid.server.auction.model.BidderResponse;
Expand Down Expand Up @@ -44,7 +45,6 @@ public List<AuctionParticipation> validateAndAdjustBids(List<AuctionParticipatio

return auctionParticipations.stream()
.map(auctionParticipation -> validBidderResponse(auctionParticipation, auctionContext, aliases))

.map(auctionParticipation -> bidAdjustmentsProcessor.enrichWithAdjustedBids(
auctionParticipation,
auctionContext.getBidRequest(),
Expand Down
53 changes: 50 additions & 3 deletions src/main/java/org/prebid/server/auction/ExchangeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload;
import org.prebid.server.activity.infrastructure.payload.impl.ActivityInvocationPayloadImpl;
import org.prebid.server.activity.infrastructure.payload.impl.BidRequestActivityInvocationPayload;
import org.prebid.server.auction.aliases.AlternateBidderCodesConfig;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessingResult;
import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessor;
import org.prebid.server.auction.model.AuctionContext;
Expand Down Expand Up @@ -79,6 +81,7 @@
import org.prebid.server.proto.openrtb.ext.request.ExtDooh;
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.ExtRequestPrebidAlternateBidderCodes;
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;
Expand All @@ -88,6 +91,7 @@
import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting;
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.response.ExtBidPrebidMeta;
import org.prebid.server.settings.model.Account;
import org.prebid.server.util.HttpUtil;
import org.prebid.server.util.ListUtil;
Expand Down Expand Up @@ -115,6 +119,7 @@ public class ExchangeService {
private static final ConditionalLogger conditionalLogger = new ConditionalLogger(logger);

private static final String PREBID_EXT = "prebid";
private static final String PREBID_META_EXT = "meta";
private static final String BIDDER_EXT = "bidder";
private static final String TID_EXT = "tid";
private static final String ALL_BIDDERS_CONFIG = "*";
Expand Down Expand Up @@ -233,7 +238,7 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
final MetricName requestTypeMetric = receivedContext.getRequestTypeMetric();

final List<SeatBid> storedAuctionResponses = new ArrayList<>();
final BidderAliases aliases = aliases(bidRequest);
final BidderAliases aliases = aliases(bidRequest, account);
final BidRequestCacheInfo cacheInfo = bidRequestCacheInfo(bidRequest);
final Map<String, MultiBidConfig> bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings);
receivedContext.getBidRejectionTrackers().putAll(makeBidRejectionTrackers(bidRequest, aliases));
Expand Down Expand Up @@ -284,11 +289,19 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
.map(context::with));
}

private BidderAliases aliases(BidRequest bidRequest) {
private BidderAliases aliases(BidRequest bidRequest, Account account) {
final ExtRequestPrebid prebid = PbsUtil.extRequestPrebid(bidRequest);
final Map<String, String> aliases = prebid != null ? prebid.getAliases() : null;
final Map<String, Integer> aliasgvlids = prebid != null ? prebid.getAliasgvlids() : null;
return BidderAliases.of(aliases, aliasgvlids, bidderCatalog);
final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = prebid != null
? prebid.getAlternateBidderCodes()
: null;

final AlternateBidderCodesConfig alternateBidderCodesConfig = ObjectUtils.defaultIfNull(
alternateBidderCodes,
account.getAlternateBidderCodes());

return BidderAliases.of(aliases, aliasgvlids, bidderCatalog, alternateBidderCodesConfig);
}

private static ExtRequestTargeting targeting(BidRequest bidRequest) {
Expand Down Expand Up @@ -1225,9 +1238,43 @@ private Future<BidderResponse> requestBids(BidderRequest bidderRequest,
requestHeaders,
aliases,
debugResolver.resolveDebugForBidder(auctionContext, resolvedBidderName)))
.map(seatBid -> populateBidderCode(seatBid, bidderName, resolvedBidderName))
.map(seatBid -> BidderResponse.of(bidderName, seatBid, responseTime(bidderRequestStartTime)));
}

private BidderSeatBid populateBidderCode(BidderSeatBid seatBid, String bidderName, String resolvedBidderName) {
return seatBid.with(seatBid.getBids().stream()
.map(bidderBid -> bidderBid.toBuilder()
.seat(ObjectUtils.defaultIfNull(bidderBid.getSeat(), bidderName))
.bid(bidderBid.getBid().toBuilder()
.ext(prepareBidExt(
bidderBid.getBid().getExt(),
bidderCatalog.configuredName(resolvedBidderName)))
.build())
.build())
.toList());
}

private ObjectNode prepareBidExt(ObjectNode bidExt, String bidderName) {
final ObjectNode updatedBidExt = bidExt != null ? bidExt : mapper.mapper().createObjectNode();

final ObjectNode extPrebid = objectNodeFromOrNew(updatedBidExt, PREBID_EXT);
final ObjectNode extPrebidMeta = objectNodeFromOrNew(extPrebid, PREBID_META_EXT);

final ObjectNode newData = mapper.mapper().valueToTree(
ExtBidPrebidMeta.builder().adapterCode(bidderName).build());
extPrebidMeta.setAll(newData);

return updatedBidExt;
}

private ObjectNode objectNodeFromOrNew(ObjectNode parent, String key) {
final JsonNode childNode = parent.get(key);
return childNode == null || !childNode.isObject()
? parent.putObject(key)
: (ObjectNode) childNode;
}

private BidRequest adjustTmax(BidRequest bidRequest,
long startTime,
int adjustmentFactor,
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/prebid/server/auction/ImpAdjuster.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.fasterxml.jackson.databind.node.IntNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iab.openrtb.request.Imp;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.json.JsonMerger;
import org.prebid.server.validation.ImpValidator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ private BidderSeatBid makeBidderSeatBid(BidderSeatBid bidderSeatBid,
: DEFAULT_BID_CURRENCY;
final List<BidderBid> bidderBids = seatBid != null
? seatBid.getBid().stream()
.map(bid -> makeBidderBid(bid, bidCurrency, impIdToBidType))
.map(bid -> makeBidderBid(bid, bidCurrency, seatBid.getSeat(), impIdToBidType))
.collect(Collectors.toCollection(ArrayList::new))
: new ArrayList<>();
if (nonNullBidderSeatBid) {
Expand All @@ -439,8 +439,8 @@ private BidderSeatBid makeBidderSeatBid(BidderSeatBid bidderSeatBid,
: BidderSeatBid.of(bidderBids);
}

private BidderBid makeBidderBid(Bid bid, String bidCurrency, Map<String, BidType> impIdToBidType) {
return BidderBid.of(bid, getBidType(bid.getExt(), impIdToBidType.get(bid.getImpid())), bidCurrency);
private BidderBid makeBidderBid(Bid bid, String bidCurrency, String seat, Map<String, BidType> impIdToBidType) {
return BidderBid.of(bid, getBidType(bid.getExt(), impIdToBidType.get(bid.getImpid())), seat, bidCurrency);
}

private BidType getBidType(ObjectNode bidExt, BidType bidType) {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/prebid/server/auction/UidUpdater.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.iab.openrtb.request.User;
import org.apache.commons.collections4.map.CaseInsensitiveMap;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.auction.aliases.BidderAliases;
import org.prebid.server.auction.model.AuctionContext;
import org.prebid.server.bidder.BidderCatalog;
import org.prebid.server.cookie.UidsCookie;
Expand Down
Loading
Loading