6
6
import com .iab .openrtb .request .App ;
7
7
import com .iab .openrtb .request .BidRequest ;
8
8
import com .iab .openrtb .request .Device ;
9
+ import com .iab .openrtb .request .Geo ;
9
10
import com .iab .openrtb .request .Imp ;
10
11
import com .iab .openrtb .request .Publisher ;
11
12
import com .iab .openrtb .request .Site ;
32
33
import org .prebid .server .exception .UnauthorizedAccountException ;
33
34
import org .prebid .server .execution .Timeout ;
34
35
import org .prebid .server .execution .TimeoutFactory ;
36
+ import org .prebid .server .geolocation .model .GeoInfo ;
35
37
import org .prebid .server .identity .IdGenerator ;
36
38
import org .prebid .server .json .JacksonMapper ;
37
39
import org .prebid .server .log .ConditionalLogger ;
40
+ import org .prebid .server .metric .MetricName ;
41
+ import org .prebid .server .privacy .model .PrivacyContext ;
38
42
import org .prebid .server .proto .openrtb .ext .request .ExtMediaTypePriceGranularity ;
39
43
import org .prebid .server .proto .openrtb .ext .request .ExtPriceGranularity ;
40
44
import org .prebid .server .proto .openrtb .ext .request .ExtPublisher ;
@@ -98,6 +102,7 @@ public class AuctionRequestFactory {
98
102
private final TimeoutFactory timeoutFactory ;
99
103
private final ApplicationSettings applicationSettings ;
100
104
private final IdGenerator idGenerator ;
105
+ private final PrivacyEnforcementService privacyEnforcementService ;
101
106
private final JacksonMapper mapper ;
102
107
private final OrtbTypesResolver ortbTypesResolver ;
103
108
@@ -119,6 +124,7 @@ public AuctionRequestFactory(long maxRequestSize,
119
124
TimeoutFactory timeoutFactory ,
120
125
ApplicationSettings applicationSettings ,
121
126
IdGenerator idGenerator ,
127
+ PrivacyEnforcementService privacyEnforcementService ,
122
128
JacksonMapper mapper ) {
123
129
124
130
this .maxRequestSize = maxRequestSize ;
@@ -139,6 +145,7 @@ public AuctionRequestFactory(long maxRequestSize,
139
145
this .timeoutFactory = Objects .requireNonNull (timeoutFactory );
140
146
this .applicationSettings = Objects .requireNonNull (applicationSettings );
141
147
this .idGenerator = Objects .requireNonNull (idGenerator );
148
+ this .privacyEnforcementService = Objects .requireNonNull (privacyEnforcementService );
142
149
this .mapper = Objects .requireNonNull (mapper );
143
150
}
144
151
@@ -171,9 +178,13 @@ public Future<AuctionContext> fromRequest(RoutingContext routingContext, long st
171
178
}
172
179
173
180
return updateBidRequest (routingContext , incomingBidRequest )
174
- .compose (bidRequest ->
175
- toAuctionContext (routingContext , bidRequest , errors , startTime ,
176
- timeoutResolver ));
181
+ .compose (bidRequest -> toAuctionContext (
182
+ routingContext ,
183
+ bidRequest ,
184
+ requestTypeMetric (bidRequest ),
185
+ errors ,
186
+ startTime ,
187
+ timeoutResolver ));
177
188
}
178
189
179
190
/**
@@ -183,21 +194,28 @@ public Future<AuctionContext> fromRequest(RoutingContext routingContext, long st
183
194
*/
184
195
Future <AuctionContext > toAuctionContext (RoutingContext routingContext ,
185
196
BidRequest bidRequest ,
197
+ MetricName requestTypeMetric ,
186
198
List <String > errors ,
187
199
long startTime ,
188
200
TimeoutResolver timeoutResolver ) {
189
201
190
202
final Timeout timeout = timeout (bidRequest , startTime , timeoutResolver );
191
203
192
204
return accountFrom (bidRequest , timeout , routingContext )
193
- .map (account -> AuctionContext .builder ()
194
- .routingContext (routingContext )
195
- .uidsCookie (uidsCookieService .parseFromRequest (routingContext ))
196
- .bidRequest (enrichBidRequestWithAccountBasedData (bidRequest , account ))
197
- .timeout (timeout )
198
- .account (account )
199
- .prebidErrors (errors )
200
- .build ());
205
+ .compose (account -> privacyEnforcementService .contextFromBidRequest (
206
+ bidRequest , account , requestTypeMetric , timeout )
207
+ .map (privacyContext -> AuctionContext .builder ()
208
+ .routingContext (routingContext )
209
+ .uidsCookie (uidsCookieService .parseFromRequest (routingContext ))
210
+ .bidRequest (enrichBidRequestWithAccountAndPrivacyData (
211
+ bidRequest , account , privacyContext ))
212
+ .requestTypeMetric (requestTypeMetric )
213
+ .timeout (timeout )
214
+ .account (account )
215
+ .prebidErrors (errors )
216
+ .privacyContext (privacyContext )
217
+ .geoInfo (privacyContext .getTcfContext ().getGeoInfo ())
218
+ .build ()));
201
219
}
202
220
203
221
/**
@@ -430,14 +448,13 @@ private User populateUser(User user) {
430
448
final ExtUser ext = userExtOrNull (user );
431
449
432
450
if (ext != null ) {
433
- final User .UserBuilder builder = user == null ? User .builder () : user .toBuilder ();
434
- return builder .ext (ext ).build ();
451
+ return user .toBuilder ().ext (ext ).build ();
435
452
}
436
453
return null ;
437
454
}
438
455
439
456
/**
440
- * Returns {@link ObjectNode} of updated {@link ExtUser} or null if no updates needed.
457
+ * Returns updated {@link ExtUser} or null if no updates needed.
441
458
*/
442
459
private ExtUser userExtOrNull (User user ) {
443
460
final ExtUser extUser = user != null ? user .getExt () : null ;
@@ -571,7 +588,7 @@ private ExtRequestTargeting targetingOrNull(ExtRequestPrebid prebid, Set<BidType
571
588
.pricegranularity (populatePriceGranularity (targeting , isPriceGranularityNull ,
572
589
isPriceGranularityTextual , impMediaTypes ))
573
590
.mediatypepricegranularity (targeting .getMediatypepricegranularity ())
574
- .includewinners (isIncludeWinnersNull ? true : targeting .getIncludewinners ())
591
+ .includewinners (isIncludeWinnersNull || targeting .getIncludewinners ())
575
592
.includebidderkeys (isIncludeBidderKeysNull
576
593
? !isWinningOnly (prebid .getCache ())
577
594
: targeting .getIncludebidderkeys ())
@@ -838,13 +855,19 @@ private Future<Account> responseForUnknownAccount(String accountId) {
838
855
: Future .succeededFuture (Account .empty (accountId ));
839
856
}
840
857
841
- private BidRequest enrichBidRequestWithAccountBasedData (BidRequest bidRequest , Account account ) {
858
+ private BidRequest enrichBidRequestWithAccountAndPrivacyData (
859
+ BidRequest bidRequest , Account account , PrivacyContext privacyContext ) {
860
+
842
861
final ExtRequest requestExt = bidRequest .getExt ();
843
862
final ExtRequest enrichedRequestExt = enrichExtRequest (requestExt , account );
844
863
845
- if (enrichedRequestExt != null ) {
864
+ final Device device = bidRequest .getDevice ();
865
+ final Device enrichedDevice = enrichDevice (device , privacyContext );
866
+
867
+ if (enrichedRequestExt != null || enrichedDevice != null ) {
846
868
return bidRequest .toBuilder ()
847
- .ext (enrichedRequestExt )
869
+ .ext (ObjectUtils .defaultIfNull (enrichedRequestExt , requestExt ))
870
+ .device (ObjectUtils .defaultIfNull (enrichedDevice , device ))
848
871
.build ();
849
872
}
850
873
@@ -867,4 +890,39 @@ private ExtRequest enrichExtRequest(ExtRequest ext, Account account) {
867
890
868
891
return null ;
869
892
}
893
+
894
+ private Device enrichDevice (Device device , PrivacyContext privacyContext ) {
895
+ final String ipAddress = privacyContext .getIpAddress ();
896
+ final String country = getIfNotNull (privacyContext .getTcfContext ().getGeoInfo (), GeoInfo ::getCountry );
897
+
898
+ final String ipAddressInRequest = getIfNotNull (device , Device ::getIp );
899
+
900
+ final Geo geo = getIfNotNull (device , Device ::getGeo );
901
+ final String countryFromRequest = getIfNotNull (geo , Geo ::getCountry );
902
+
903
+ final boolean shouldUpdateIp = ipAddress != null && !Objects .equals (ipAddressInRequest , ipAddress );
904
+ final boolean shouldUpdateCountry = country != null && !Objects .equals (countryFromRequest , country );
905
+
906
+ if (shouldUpdateIp || shouldUpdateCountry ) {
907
+ final Device .DeviceBuilder deviceBuilder = device != null ? device .toBuilder () : Device .builder ();
908
+
909
+ if (shouldUpdateIp ) {
910
+ deviceBuilder .ip (ipAddress );
911
+ }
912
+
913
+ if (shouldUpdateCountry ) {
914
+ final Geo .GeoBuilder geoBuilder = geo != null ? geo .toBuilder () : Geo .builder ();
915
+ geoBuilder .country (country );
916
+ deviceBuilder .geo (geoBuilder .build ());
917
+ }
918
+
919
+ return deviceBuilder .build ();
920
+ }
921
+
922
+ return null ;
923
+ }
924
+
925
+ private static MetricName requestTypeMetric (BidRequest bidRequest ) {
926
+ return bidRequest .getApp () != null ? MetricName .openrtb2app : MetricName .openrtb2web ;
927
+ }
870
928
}
0 commit comments