77import com .iab .openrtb .request .User ;
88import io .vertx .core .Future ;
99import io .vertx .core .MultiMap ;
10+ import org .apache .commons .collections4 .CollectionUtils ;
1011import org .apache .commons .collections4 .ListUtils ;
1112import org .prebid .server .activity .Activity ;
1213import org .prebid .server .activity .ComponentType ;
3334import org .prebid .server .json .JacksonMapper ;
3435import org .prebid .server .log .ConditionalLogger ;
3536import 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 ;
3641import org .prebid .server .util .HttpUtil ;
3742import org .prebid .server .util .ListUtil ;
3843import org .prebid .server .vertx .httpclient .HttpClient ;
4247import java .util .Objects ;
4348import java .util .Optional ;
4449import java .util .concurrent .ThreadLocalRandom ;
50+ import java .util .stream .Stream ;
4551
4652public 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