Skip to content

Commit 00dabfe

Browse files
committed
Added support for rejection tracking.
1 parent 7e07e46 commit 00dabfe

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

extra/modules/pb-rule-engine/src/main/java/org/prebid/server/hooks/modules/rule/engine/v1/PbRuleEngineProcessedAuctionRequestHook.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.vertx.core.Future;
66
import org.apache.commons.lang3.StringUtils;
77
import org.prebid.server.auction.model.AuctionContext;
8+
import org.prebid.server.auction.model.ImpRejection;
9+
import org.prebid.server.auction.model.Rejection;
810
import org.prebid.server.hooks.execution.v1.InvocationResultImpl;
911
import org.prebid.server.hooks.execution.v1.auction.AuctionRequestPayloadImpl;
1012
import org.prebid.server.hooks.modules.rule.engine.core.config.RuleParser;
@@ -19,8 +21,12 @@
1921
import org.prebid.server.hooks.v1.auction.AuctionInvocationContext;
2022
import org.prebid.server.hooks.v1.auction.AuctionRequestPayload;
2123
import org.prebid.server.hooks.v1.auction.ProcessedAuctionRequestHook;
24+
import org.prebid.server.proto.openrtb.ext.response.seatnonbid.SeatNonBid;
2225

26+
import java.util.List;
27+
import java.util.Map;
2328
import java.util.Objects;
29+
import java.util.stream.Collectors;
2430

2531
public class PbRuleEngineProcessedAuctionRequestHook implements ProcessedAuctionRequestHook {
2632

@@ -60,6 +66,7 @@ private static Future<InvocationResult<AuctionRequestPayload>> succeeded(RuleRes
6066
InvocationResultImpl.<AuctionRequestPayload>builder()
6167
.status(InvocationStatus.success)
6268
.action(toInvocationAction(result.getAction()))
69+
.rejections(toRejections(result.getSeatNonBid()))
6370
.analyticsTags(result.getAnalyticsTags());
6471

6572
if (result.isUpdate()) {
@@ -69,6 +76,25 @@ private static Future<InvocationResult<AuctionRequestPayload>> succeeded(RuleRes
6976
return Future.succeededFuture(resultBuilder.build());
7077
}
7178

79+
private static InvocationAction toInvocationAction(RuleAction ruleAction) {
80+
return switch (ruleAction) {
81+
case NO_ACTION -> InvocationAction.no_action;
82+
case UPDATE -> InvocationAction.update;
83+
case REJECT -> InvocationAction.reject;
84+
};
85+
}
86+
87+
private static List<Rejection> toRejections(SeatNonBid seatNonBid) {
88+
return seatNonBid.getNonBid().stream()
89+
.map(nonBid -> (Rejection) ImpRejection.of(nonBid.getImpId(), nonBid.getStatusCode()))
90+
.toList();
91+
}
92+
93+
private static Map<String, List<Rejection>> toRejections(List<SeatNonBid> seatNonBids) {
94+
return seatNonBids.stream()
95+
.collect(Collectors.toMap(SeatNonBid::getSeat, PbRuleEngineProcessedAuctionRequestHook::toRejections));
96+
}
97+
7298
private static Future<InvocationResult<AuctionRequestPayload>> failure(Throwable error) {
7399
return Future.succeededFuture(
74100
InvocationResultImpl.<AuctionRequestPayload>builder()
@@ -78,14 +104,6 @@ private static Future<InvocationResult<AuctionRequestPayload>> failure(Throwable
78104
.build());
79105
}
80106

81-
private static InvocationAction toInvocationAction(RuleAction ruleAction) {
82-
return switch (ruleAction) {
83-
case NO_ACTION -> InvocationAction.no_action;
84-
case UPDATE -> InvocationAction.update;
85-
case REJECT -> InvocationAction.reject;
86-
};
87-
}
88-
89107
@Override
90108
public String code() {
91109
return CODE;

extra/modules/pb-rule-engine/src/test/java/org/prebid/server/hooks/modules/rule/engine/v1/PbRuleEngineProcessedAuctionRequestHookTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import org.mockito.Mock;
1010
import org.mockito.junit.jupiter.MockitoExtension;
1111
import org.prebid.server.auction.model.AuctionContext;
12+
import org.prebid.server.auction.model.BidRejectionReason;
13+
import org.prebid.server.auction.model.ImpRejection;
14+
import org.prebid.server.auction.model.Rejection;
1215
import org.prebid.server.exception.PreBidException;
1316
import org.prebid.server.hooks.modules.rule.engine.core.config.RuleParser;
1417
import org.prebid.server.hooks.modules.rule.engine.core.request.Granularity;
@@ -22,10 +25,14 @@
2225
import org.prebid.server.hooks.v1.analytics.Tags;
2326
import org.prebid.server.hooks.v1.auction.AuctionInvocationContext;
2427
import org.prebid.server.hooks.v1.auction.AuctionRequestPayload;
28+
import org.prebid.server.proto.openrtb.ext.response.seatnonbid.NonBid;
29+
import org.prebid.server.proto.openrtb.ext.response.seatnonbid.SeatNonBid;
2530
import org.prebid.server.settings.model.Account;
2631

2732
import java.time.Instant;
2833
import java.util.Collections;
34+
import java.util.List;
35+
import java.util.Map;
2936

3037
import static org.assertj.core.api.Assertions.assertThat;
3138
import static org.mockito.ArgumentMatchers.any;
@@ -104,16 +111,23 @@ public void callShouldReturnNoActionWhenRuleActionIsNoAction() {
104111
@Test
105112
public void callShouldReturnPayloadUpdateWhenRuleActionIsUpdate() {
106113
// given
114+
final SeatNonBid seatNonBid = SeatNonBid.of(
115+
"bidder", Collections.singletonList(NonBid.of("impId", BidRejectionReason.NO_BID)));
116+
107117
given(invocationContext.accountConfig()).willReturn(MAPPER.createObjectNode());
108118
given(processedAuctionRequestRule.process(
109119
bidRequest,
110120
RequestRuleContext.of(auctionContext, Granularity.Request.instance(), "datacenter")))
111-
.willReturn(RuleResult.of(bidRequest, RuleAction.UPDATE, tags, Collections.emptyList()));
121+
.willReturn(RuleResult.of(bidRequest, RuleAction.UPDATE, tags, Collections.singletonList(seatNonBid)));
112122

113123
// when and then
124+
final Map<String, List<Rejection>> rejections = Map.of(
125+
"bidder", List.of(ImpRejection.of("impId", BidRejectionReason.NO_BID)));
126+
114127
assertThat(target.call(payload, invocationContext).result()).satisfies(invocationResult -> {
115128
assertThat(invocationResult.status()).isEqualTo(InvocationStatus.success);
116129
assertThat(invocationResult.action()).isEqualTo(InvocationAction.update);
130+
assertThat(invocationResult.rejections()).containsExactlyEntriesOf(rejections);
117131
assertThat(invocationResult.payloadUpdate()).isNotNull();
118132
assertThat(invocationResult.analyticsTags()).isEqualTo(tags);
119133
});

src/main/java/org/prebid/server/auction/model/BidRejectionReason.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ public enum BidRejectionReason {
5656
*/
5757
REQUEST_BLOCKED_UNSUPPORTED_MEDIA_TYPE(202),
5858

59-
REQUEST_BLOCKED_OPTIMIZED(203),
60-
6159
/**
6260
* This impression not sent to the bid adapter because the impression or the bidder was removed from the request.
6361
*/

0 commit comments

Comments
 (0)