Skip to content

Commit 8e8a301

Browse files
Multiple Bidder Codes (#3855)
1 parent af5af58 commit 8e8a301

407 files changed

Lines changed: 6074 additions & 1460 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

extra/modules/ortb2-blocking/src/main/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/Ortb2BlockingBidderRequestHook.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.iab.openrtb.request.BidRequest;
44
import io.vertx.core.Future;
5-
import org.prebid.server.auction.BidderAliases;
5+
import org.prebid.server.auction.aliases.BidderAliases;
66
import org.prebid.server.auction.versionconverter.OrtbVersion;
77
import org.prebid.server.bidder.BidderCatalog;
88
import org.prebid.server.hooks.execution.v1.InvocationResultImpl;

src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ private static Map<String, NonBid> getSeatsWithNonBids(AuctionContext auctionCon
383383

384384
private static SeatNonBid toSeatNonBid(String bidder, BidRejectionTracker bidRejectionTracker) {
385385
final List<NonBid> nonBids = bidRejectionTracker.getRejectedImps().entrySet().stream()
386-
.map(entry -> NonBid.of(entry.getKey(), entry.getValue()))
386+
.map(entry -> NonBid.of(entry.getKey(), entry.getValue().getRight()))
387387
.toList();
388388

389389
return SeatNonBid.of(bidder, nonBids);

src/main/java/org/prebid/server/auction/BidResponseCreator.java

Lines changed: 142 additions & 118 deletions
Large diffs are not rendered by default.

src/main/java/org/prebid/server/auction/BidderAliases.java

Lines changed: 0 additions & 60 deletions
This file was deleted.

src/main/java/org/prebid/server/auction/BidsAdjuster.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.iab.openrtb.request.BidRequest;
44
import com.iab.openrtb.response.Bid;
5+
import org.prebid.server.auction.aliases.BidderAliases;
56
import org.prebid.server.auction.model.AuctionContext;
67
import org.prebid.server.auction.model.AuctionParticipation;
78
import org.prebid.server.auction.model.BidderResponse;
@@ -44,7 +45,6 @@ public List<AuctionParticipation> validateAndAdjustBids(List<AuctionParticipatio
4445

4546
return auctionParticipations.stream()
4647
.map(auctionParticipation -> validBidderResponse(auctionParticipation, auctionContext, aliases))
47-
4848
.map(auctionParticipation -> bidAdjustmentsProcessor.enrichWithAdjustedBids(
4949
auctionParticipation,
5050
auctionContext.getBidRequest(),

src/main/java/org/prebid/server/auction/ExchangeService.java

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload;
2929
import org.prebid.server.activity.infrastructure.payload.impl.ActivityInvocationPayloadImpl;
3030
import org.prebid.server.activity.infrastructure.payload.impl.BidRequestActivityInvocationPayload;
31+
import org.prebid.server.auction.aliases.AlternateBidderCodesConfig;
32+
import org.prebid.server.auction.aliases.BidderAliases;
3133
import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessingResult;
3234
import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessor;
3335
import org.prebid.server.auction.model.AuctionContext;
@@ -79,6 +81,7 @@
7981
import org.prebid.server.proto.openrtb.ext.request.ExtDooh;
8082
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
8183
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
84+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidAlternateBidderCodes;
8285
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig;
8386
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidCache;
8487
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData;
@@ -88,6 +91,7 @@
8891
import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting;
8992
import org.prebid.server.proto.openrtb.ext.request.ExtSite;
9093
import org.prebid.server.proto.openrtb.ext.request.ExtUser;
94+
import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta;
9195
import org.prebid.server.settings.model.Account;
9296
import org.prebid.server.util.HttpUtil;
9397
import org.prebid.server.util.ListUtil;
@@ -115,6 +119,7 @@ public class ExchangeService {
115119
private static final ConditionalLogger conditionalLogger = new ConditionalLogger(logger);
116120

117121
private static final String PREBID_EXT = "prebid";
122+
private static final String PREBID_META_EXT = "meta";
118123
private static final String BIDDER_EXT = "bidder";
119124
private static final String TID_EXT = "tid";
120125
private static final String ALL_BIDDERS_CONFIG = "*";
@@ -233,7 +238,7 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
233238
final MetricName requestTypeMetric = receivedContext.getRequestTypeMetric();
234239

235240
final List<SeatBid> storedAuctionResponses = new ArrayList<>();
236-
final BidderAliases aliases = aliases(bidRequest);
241+
final BidderAliases aliases = aliases(bidRequest, account);
237242
final BidRequestCacheInfo cacheInfo = bidRequestCacheInfo(bidRequest);
238243
final Map<String, MultiBidConfig> bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings);
239244
receivedContext.getBidRejectionTrackers().putAll(makeBidRejectionTrackers(bidRequest, aliases));
@@ -273,7 +278,7 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
273278
.map(auctionParticipations -> updateResponsesMetrics(auctionParticipations, account, aliases))
274279
.map(context::with))
275280
// produce response from bidder results
276-
.compose(context -> bidResponseCreator.create(context, cacheInfo, aliases, bidderToMultiBid)
281+
.compose(context -> bidResponseCreator.create(context, cacheInfo, bidderToMultiBid)
277282
.map(bidResponse -> criteriaLogManager.traceResponse(
278283
logger,
279284
bidResponse,
@@ -284,11 +289,19 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
284289
.map(context::with));
285290
}
286291

287-
private BidderAliases aliases(BidRequest bidRequest) {
292+
private BidderAliases aliases(BidRequest bidRequest, Account account) {
288293
final ExtRequestPrebid prebid = PbsUtil.extRequestPrebid(bidRequest);
289294
final Map<String, String> aliases = prebid != null ? prebid.getAliases() : null;
290295
final Map<String, Integer> aliasgvlids = prebid != null ? prebid.getAliasgvlids() : null;
291-
return BidderAliases.of(aliases, aliasgvlids, bidderCatalog);
296+
final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = prebid != null
297+
? prebid.getAlternateBidderCodes()
298+
: null;
299+
300+
final AlternateBidderCodesConfig alternateBidderCodesConfig = ObjectUtils.defaultIfNull(
301+
alternateBidderCodes,
302+
account.getAlternateBidderCodes());
303+
304+
return BidderAliases.of(aliases, aliasgvlids, bidderCatalog, alternateBidderCodesConfig);
292305
}
293306

294307
private static ExtRequestTargeting targeting(BidRequest bidRequest) {
@@ -1225,9 +1238,43 @@ private Future<BidderResponse> requestBids(BidderRequest bidderRequest,
12251238
requestHeaders,
12261239
aliases,
12271240
debugResolver.resolveDebugForBidder(auctionContext, resolvedBidderName)))
1241+
.map(seatBid -> populateBidderCode(seatBid, bidderName, resolvedBidderName))
12281242
.map(seatBid -> BidderResponse.of(bidderName, seatBid, responseTime(bidderRequestStartTime)));
12291243
}
12301244

1245+
private BidderSeatBid populateBidderCode(BidderSeatBid seatBid, String bidderName, String resolvedBidderName) {
1246+
return seatBid.with(seatBid.getBids().stream()
1247+
.map(bidderBid -> bidderBid.toBuilder()
1248+
.seat(ObjectUtils.defaultIfNull(bidderBid.getSeat(), bidderName))
1249+
.bid(bidderBid.getBid().toBuilder()
1250+
.ext(prepareBidExt(
1251+
bidderBid.getBid().getExt(),
1252+
bidderCatalog.configuredName(resolvedBidderName)))
1253+
.build())
1254+
.build())
1255+
.toList());
1256+
}
1257+
1258+
private ObjectNode prepareBidExt(ObjectNode bidExt, String bidderName) {
1259+
final ObjectNode updatedBidExt = bidExt != null ? bidExt : mapper.mapper().createObjectNode();
1260+
1261+
final ObjectNode extPrebid = objectNodeFromOrNew(updatedBidExt, PREBID_EXT);
1262+
final ObjectNode extPrebidMeta = objectNodeFromOrNew(extPrebid, PREBID_META_EXT);
1263+
1264+
final ObjectNode newData = mapper.mapper().valueToTree(
1265+
ExtBidPrebidMeta.builder().adapterCode(bidderName).build());
1266+
extPrebidMeta.setAll(newData);
1267+
1268+
return updatedBidExt;
1269+
}
1270+
1271+
private ObjectNode objectNodeFromOrNew(ObjectNode parent, String key) {
1272+
final JsonNode childNode = parent.get(key);
1273+
return childNode == null || !childNode.isObject()
1274+
? parent.putObject(key)
1275+
: (ObjectNode) childNode;
1276+
}
1277+
12311278
private BidRequest adjustTmax(BidRequest bidRequest,
12321279
long startTime,
12331280
int adjustmentFactor,

src/main/java/org/prebid/server/auction/ImpAdjuster.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.databind.node.IntNode;
55
import com.fasterxml.jackson.databind.node.ObjectNode;
66
import com.iab.openrtb.request.Imp;
7+
import org.prebid.server.auction.aliases.BidderAliases;
78
import org.prebid.server.json.JacksonMapper;
89
import org.prebid.server.json.JsonMerger;
910
import org.prebid.server.validation.ImpValidator;

src/main/java/org/prebid/server/auction/SkippedAuctionService.java

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
package org.prebid.server.auction;
22

33
import com.iab.openrtb.request.BidRequest;
4+
import com.iab.openrtb.response.BidResponse;
45
import com.iab.openrtb.response.SeatBid;
56
import io.vertx.core.Future;
67
import org.apache.commons.collections4.CollectionUtils;
8+
import org.apache.commons.collections4.ListUtils;
79
import org.apache.commons.lang3.StringUtils;
810
import org.prebid.server.auction.model.AuctionContext;
911
import org.prebid.server.auction.model.StoredResponseResult;
12+
import org.prebid.server.bidder.model.BidderError;
1013
import org.prebid.server.exception.InvalidRequestException;
1114
import org.prebid.server.execution.timeout.Timeout;
1215
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
1316
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
1417
import org.prebid.server.proto.openrtb.ext.request.ExtStoredAuctionResponse;
18+
import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse;
19+
import org.prebid.server.proto.openrtb.ext.response.ExtBidderError;
1520

1621
import java.util.Collections;
1722
import java.util.List;
23+
import java.util.Map;
1824
import java.util.Objects;
1925
import java.util.Optional;
2026

2127
public class SkippedAuctionService {
2228

2329
private final StoredResponseProcessor storedResponseProcessor;
24-
private final BidResponseCreator bidResponseCreator;
25-
26-
public SkippedAuctionService(StoredResponseProcessor storedResponseProcessor,
27-
BidResponseCreator bidResponseCreator) {
2830

31+
public SkippedAuctionService(StoredResponseProcessor storedResponseProcessor) {
2932
this.storedResponseProcessor = Objects.requireNonNull(storedResponseProcessor);
30-
this.bidResponseCreator = Objects.requireNonNull(bidResponseCreator);
3133
}
3234

3335
public Future<AuctionContext> skipAuction(AuctionContext auctionContext) {
@@ -53,7 +55,7 @@ public Future<AuctionContext> skipAuction(AuctionContext auctionContext) {
5355
auctionContext.getDebugWarnings().add(throwable.getMessage());
5456
return Future.succeededFuture(Collections.emptyList());
5557
})
56-
.compose(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids))
58+
.map(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids))
5759
.map(AuctionContext::skipAuction);
5860
}
5961

@@ -65,7 +67,7 @@ public Future<AuctionContext> skipAuction(AuctionContext auctionContext) {
6567
auctionContext.getDebugWarnings().add(throwable.getMessage());
6668
return Future.succeededFuture(Collections.emptyList());
6769
})
68-
.compose(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids))
70+
.map(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids))
6971
.map(AuctionContext::skipAuction);
7072
}
7173

@@ -94,10 +96,37 @@ private Future<List<SeatBid>> validateStoredSeatBid(List<SeatBid> seatBids) {
9496
return Future.succeededFuture(seatBids);
9597
}
9698

97-
private Future<AuctionContext> enrichAuctionContextWithBidResponse(AuctionContext auctionContext,
98-
List<SeatBid> seatBids) {
99+
private static AuctionContext enrichAuctionContextWithBidResponse(AuctionContext auctionContext,
100+
List<SeatBid> seatBids) {
99101

100102
auctionContext.getDebugWarnings().add("no auction. response defined by storedauctionresponse");
101-
return bidResponseCreator.createOnSkippedAuction(auctionContext, seatBids).map(auctionContext::with);
103+
return auctionContext.with(bidResponse(auctionContext, seatBids));
104+
}
105+
106+
private static BidResponse bidResponse(AuctionContext auctionContext, List<SeatBid> seatBids) {
107+
final BidRequest bidRequest = auctionContext.getBidRequest();
108+
final ExtBidResponse extBidResponse = ExtBidResponse.builder()
109+
.warnings(extractContextWarnings(auctionContext))
110+
.tmaxrequest(bidRequest.getTmax())
111+
.build();
112+
113+
final List<String> cur = bidRequest.getCur();
114+
115+
return BidResponse.builder()
116+
.id(bidRequest.getId())
117+
.cur(CollectionUtils.isNotEmpty(cur) ? cur.getFirst() : null)
118+
.seatbid(ListUtils.emptyIfNull(seatBids))
119+
.ext(extBidResponse)
120+
.build();
121+
}
122+
123+
private static Map<String, List<ExtBidderError>> extractContextWarnings(AuctionContext auctionContext) {
124+
final List<ExtBidderError> contextWarnings = auctionContext.getDebugWarnings().stream()
125+
.map(message -> ExtBidderError.of(BidderError.Type.generic.getCode(), message))
126+
.toList();
127+
128+
return contextWarnings.isEmpty()
129+
? Collections.emptyMap()
130+
: Collections.singletonMap("prebid", contextWarnings);
102131
}
103132
}

src/main/java/org/prebid/server/auction/StoredResponseProcessor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ private BidderSeatBid makeBidderSeatBid(BidderSeatBid bidderSeatBid,
428428
: DEFAULT_BID_CURRENCY;
429429
final List<BidderBid> bidderBids = seatBid != null
430430
? seatBid.getBid().stream()
431-
.map(bid -> makeBidderBid(bid, bidCurrency, impIdToBidType))
431+
.map(bid -> makeBidderBid(bid, bidCurrency, seatBid.getSeat(), impIdToBidType))
432432
.collect(Collectors.toCollection(ArrayList::new))
433433
: new ArrayList<>();
434434
if (nonNullBidderSeatBid) {
@@ -439,8 +439,8 @@ private BidderSeatBid makeBidderSeatBid(BidderSeatBid bidderSeatBid,
439439
: BidderSeatBid.of(bidderBids);
440440
}
441441

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

446446
private BidType getBidType(ObjectNode bidExt, BidType bidType) {

src/main/java/org/prebid/server/auction/UidUpdater.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.iab.openrtb.request.User;
44
import org.apache.commons.collections4.map.CaseInsensitiveMap;
55
import org.apache.commons.lang3.StringUtils;
6+
import org.prebid.server.auction.aliases.BidderAliases;
67
import org.prebid.server.auction.model.AuctionContext;
78
import org.prebid.server.bidder.BidderCatalog;
89
import org.prebid.server.cookie.UidsCookie;

0 commit comments

Comments
 (0)