Skip to content

Commit e32018f

Browse files
author
ilya
committed
DATA-43462: Limiting LI ids to bidders
1 parent 3eaafd4 commit e32018f

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/model/config/LiveIntentOmniChannelProperties.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import lombok.Data;
44

5+
import java.util.List;
6+
57
@Data
68
public final class LiveIntentOmniChannelProperties {
79

@@ -12,4 +14,6 @@ public final class LiveIntentOmniChannelProperties {
1214
String authToken;
1315

1416
float treatmentRate;
17+
18+
List<String> targetBidders;
1519
}

extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.iab.openrtb.request.User;
88
import io.vertx.core.Future;
99
import io.vertx.core.MultiMap;
10+
import org.apache.commons.collections4.CollectionUtils;
1011
import org.apache.commons.collections4.ListUtils;
1112
import org.prebid.server.activity.Activity;
1213
import org.prebid.server.activity.ComponentType;
@@ -33,6 +34,10 @@
3334
import org.prebid.server.json.JacksonMapper;
3435
import org.prebid.server.log.ConditionalLogger;
3536
import org.prebid.server.log.LoggerFactory;
37+
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
38+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
39+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData;
40+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;
3641
import org.prebid.server.util.HttpUtil;
3742
import org.prebid.server.util.ListUtil;
3843
import org.prebid.server.vertx.httpclient.HttpClient;
@@ -42,6 +47,7 @@
4247
import java.util.Objects;
4348
import java.util.Optional;
4449
import java.util.concurrent.ThreadLocalRandom;
50+
import java.util.stream.Stream;
4551

4652
public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements ProcessedAuctionRequestHook {
4753

@@ -55,6 +61,7 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements
5561
private final HttpClient httpClient;
5662
private final UserFpdActivityMask userFpdActivityMask;
5763
private final double logSamplingRate;
64+
private final List<String> targetBidders;
5865

5966
public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniChannelProperties config,
6067
UserFpdActivityMask userFpdActivityMask,
@@ -68,6 +75,7 @@ public LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(LiveIntentOmniCh
6875
this.httpClient = Objects.requireNonNull(httpClient);
6976
this.logSamplingRate = logSamplingRate;
7077
this.userFpdActivityMask = Objects.requireNonNull(userFpdActivityMask);
78+
this.targetBidders = ListUtils.emptyIfNull(config.getTargetBidders());
7179
}
7280

7381
@Override
@@ -170,17 +178,17 @@ private InvocationResultImpl<AuctionRequestPayload> update(IdResResponse resolut
170178
ActivityImpl.of(
171179
"liveintent-enriched", "success",
172180
List.of(
173-
ResultImpl.of(
174-
"",
175-
mapper.mapper().createObjectNode()
176-
.put("treatmentRate", config.getTreatmentRate()),
177-
null))))))
181+
ResultImpl.of(
182+
"",
183+
mapper.mapper().createObjectNode()
184+
.put("treatmentRate", config.getTreatmentRate()),
185+
null))))))
178186
.build();
179187
}
180188

181189
private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List<Eid> resolvedEids) {
182190
final List<Eid> eids = ListUtils.emptyIfNull(resolvedEids);
183-
final BidRequest bidRequest = requestPayload.bidRequest();
191+
final BidRequest bidRequest = updateAllowedBidders(requestPayload.bidRequest(), resolvedEids);
184192
final User updatedUser = Optional.ofNullable(bidRequest.getUser())
185193
.map(user -> user.toBuilder().eids(ListUtil.union(ListUtils.emptyIfNull(user.getEids()), eids)))
186194
.orElseGet(() -> User.builder().eids(eids))
@@ -189,6 +197,47 @@ private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayloa
189197
return AuctionRequestPayloadImpl.of(bidRequest.toBuilder().user(updatedUser).build());
190198
}
191199

200+
private BidRequest updateAllowedBidders(BidRequest bidRequest, List<Eid> resolvedEids) {
201+
if (this.targetBidders.isEmpty()) {
202+
return bidRequest;
203+
}
204+
205+
final List<String> resolvedSources = resolvedEids.stream().map(Eid::getSource).distinct().toList();
206+
final ExtRequest requestExt = bidRequest.getExt();
207+
final ExtRequestPrebid prebid = requestExt == null ? null : requestExt.getPrebid();
208+
final ExtRequestPrebidData prebidData = prebid != null
209+
? prebid.getData()
210+
: null;
211+
final List<ExtRequestPrebidDataEidPermissions> eidPermissions = prebidData == null
212+
? List.of()
213+
: CollectionUtils.emptyIfNull(prebidData.getEidPermissions()).stream().toList();
214+
final Stream<ExtRequestPrebidDataEidPermissions> existingPermissions = eidPermissions
215+
.stream()
216+
.filter(e -> resolvedSources.contains(e.getSource()));
217+
218+
final Stream<String> missingSources = resolvedSources.stream()
219+
.filter(src -> eidPermissions.stream().noneMatch(e -> e.getSource().equals(src)));
220+
221+
final List<ExtRequestPrebidDataEidPermissions> updatedPermissions = CollectionUtils.union(
222+
missingSources.map(src -> ExtRequestPrebidDataEidPermissions.of(src, this.targetBidders))
223+
.toList(),
224+
existingPermissions.map(p -> ExtRequestPrebidDataEidPermissions.of(
225+
p.getSource(),
226+
CollectionUtils.union(p.getBidders(), this.targetBidders)
227+
.stream().distinct().toList())).toList())
228+
.stream().toList();
229+
230+
final List<String> bidders = prebidData == null ? this.targetBidders : CollectionUtils.union(this.targetBidders,
231+
CollectionUtils.emptyIfNull(prebidData.getBidders())).stream().distinct().toList();
232+
233+
final ExtRequestPrebidData updatedPrebidData = ExtRequestPrebidData.of(bidders, updatedPermissions);
234+
final ExtRequestPrebid updatedExtPrebid = prebid == null
235+
? ExtRequestPrebid.builder().data(updatedPrebidData).build()
236+
: prebid.toBuilder().data(updatedPrebidData).build();
237+
238+
return bidRequest.toBuilder().ext(ExtRequest.of(updatedExtPrebid)).build();
239+
}
240+
192241
@Override
193242
public String code() {
194243
return CODE;

0 commit comments

Comments
 (0)