|
10 | 10 | import org.apache.commons.collections4.CollectionUtils; |
11 | 11 | import org.apache.commons.collections4.ListUtils; |
12 | 12 | import org.apache.commons.collections4.SetUtils; |
| 13 | +import org.apache.commons.lang3.StringUtils; |
13 | 14 | import org.prebid.server.activity.Activity; |
14 | 15 | import org.prebid.server.activity.ComponentType; |
15 | 16 | import org.prebid.server.activity.infrastructure.ActivityInfrastructure; |
|
23 | 24 | import org.prebid.server.hooks.execution.v1.analytics.ResultImpl; |
24 | 25 | import org.prebid.server.hooks.execution.v1.analytics.TagsImpl; |
25 | 26 | import org.prebid.server.hooks.execution.v1.auction.AuctionRequestPayloadImpl; |
26 | | -import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.FullSource; |
27 | 27 | import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.IdResResponse; |
28 | 28 | import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.model.config.LiveIntentOmniChannelProperties; |
29 | 29 | import org.prebid.server.hooks.modules.liveintent.omni.channel.identity.v1.LiveIntentOmniChannelIdentityModule; |
|
45 | 45 | import org.prebid.server.vertx.httpclient.HttpClient; |
46 | 46 | import org.prebid.server.vertx.httpclient.model.HttpClientResponse; |
47 | 47 |
|
48 | | -import java.util.Collections; |
49 | 48 | import java.util.List; |
50 | 49 | import java.util.Objects; |
51 | 50 | import java.util.Optional; |
@@ -166,10 +165,17 @@ private MultiMap headers() { |
166 | 165 |
|
167 | 166 | private IdResResponse processResponse(HttpClientResponse response) { |
168 | 167 | final IdResResponse res = mapper.decodeValue(response.getBody(), IdResResponse.class); |
169 | | - final List<Eid> eids = res.getEids().stream() |
| 168 | + final List<Eid> eids = res.getEids(); |
| 169 | + |
| 170 | + if (CollectionUtils.isEmpty(eids)) { |
| 171 | + return res; |
| 172 | + } |
| 173 | + |
| 174 | + final List<Eid> modifiedEids = eids.stream() |
170 | 175 | .map(eid -> eid.toBuilder().inserter(INSERTER).build()) |
171 | 176 | .toList(); |
172 | | - return IdResResponse.of(eids); |
| 177 | + |
| 178 | + return IdResResponse.of(modifiedEids); |
173 | 179 | } |
174 | 180 |
|
175 | 181 | private static Future<InvocationResult<AuctionRequestPayload>> noAction() { |
@@ -197,95 +203,109 @@ private InvocationResultImpl<AuctionRequestPayload> update(IdResResponse resolut |
197 | 203 | } |
198 | 204 |
|
199 | 205 | private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List<Eid> resolvedEids) { |
200 | | - final List<Eid> eids = ListUtils.emptyIfNull(resolvedEids); |
201 | | - if (CollectionUtils.isEmpty(eids)) { |
202 | | - return requestPayload; |
203 | | - } |
204 | | - final BidRequest bidRequest = updateAllowedBidders(requestPayload.bidRequest(), resolvedEids); |
205 | | - final User updatedUser = Optional.ofNullable(bidRequest.getUser()) |
206 | | - .map(user -> user.toBuilder().eids(ListUtil.union(ListUtils.emptyIfNull(user.getEids()), eids))) |
207 | | - .orElseGet(() -> User.builder().eids(eids)) |
208 | | - .build(); |
| 206 | + return CollectionUtils.isNotEmpty(resolvedEids) |
| 207 | + ? AuctionRequestPayloadImpl.of(updateBidRequest(requestPayload.bidRequest(), resolvedEids)) |
| 208 | + : requestPayload; |
| 209 | + } |
209 | 210 |
|
210 | | - return AuctionRequestPayloadImpl.of(bidRequest.toBuilder().user(updatedUser).build()); |
| 211 | + private BidRequest updateBidRequest(BidRequest bidRequest, List<Eid> resolvedEids) { |
| 212 | + return bidRequest.toBuilder() |
| 213 | + .ext(updateExtRequest(bidRequest.getExt(), resolvedEids)) |
| 214 | + .user(updateUser(bidRequest.getUser(), resolvedEids)) |
| 215 | + .build(); |
211 | 216 | } |
212 | 217 |
|
213 | | - private BidRequest updateAllowedBidders(BidRequest bidRequest, List<Eid> resolvedEids) { |
214 | | - if (CollectionUtils.isEmpty(targetBidders)) { |
215 | | - return bidRequest; |
216 | | - } |
| 218 | + private ExtRequest updateExtRequest(ExtRequest ext, List<Eid> resolvedEids) { |
| 219 | + final Set<String> uniqueSources = CollectionUtils.emptyIfNull(resolvedEids).stream() |
| 220 | + .map(Eid::getSource) |
| 221 | + .filter(StringUtils::isNotEmpty) |
| 222 | + .collect(Collectors.toSet()); |
217 | 223 |
|
218 | | - final ExtRequest ext = bidRequest.getExt(); |
219 | 224 | final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; |
220 | 225 | final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; |
| 226 | + final List<ExtRequestPrebidDataEidPermissions> eidPermissions = |
| 227 | + extPrebidData != null ? extPrebidData.getEidPermissions() : null; |
| 228 | + |
| 229 | + final List<ExtRequestPrebidDataEidPermissions> modifiedEidPermissions = CollectionUtils.isEmpty(eidPermissions) |
| 230 | + ? createEidPermissions(uniqueSources) |
| 231 | + : modifyEidPermissions(eidPermissions, uniqueSources); |
221 | 232 |
|
222 | 233 | final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) |
223 | 234 | .map(ExtRequestPrebid::toBuilder) |
224 | 235 | .orElseGet(ExtRequestPrebid::builder) |
225 | | - .data(updatePrebidData(extPrebidData, resolvedEids)) |
| 236 | + .data(updatePrebidData(extPrebidData, modifiedEidPermissions)) |
226 | 237 | .build(); |
227 | 238 |
|
228 | 239 | final ExtRequest updatedExtRequest = ExtRequest.of(updatedExtPrebid); |
229 | 240 | if (ext != null) { |
230 | 241 | mapper.fillExtension(updatedExtRequest, ext.getProperties()); |
231 | 242 | } |
232 | 243 |
|
233 | | - return bidRequest.toBuilder().ext(updatedExtRequest).build(); |
| 244 | + return updatedExtRequest; |
234 | 245 | } |
235 | 246 |
|
236 | | - private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, List<Eid> resolvedEids) { |
237 | | - final List<String> originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; |
| 247 | + private static User updateUser(User user, List<Eid> resolvedEids) { |
| 248 | + final List<Eid> updatedEids = Optional.ofNullable(user) |
| 249 | + .map(User::getEids) |
| 250 | + .map(eids -> ListUtil.union(eids, resolvedEids)) |
| 251 | + .orElse(resolvedEids); |
238 | 252 |
|
239 | | - final Set<FullSource> resolvedSources = resolvedEids.stream() |
240 | | - .map(eid -> FullSource.of(eid.getSource(), eid.getInserter())) |
241 | | - .collect(Collectors.toSet()); |
| 253 | + return Optional.ofNullable(user) |
| 254 | + .map(User::toBuilder) |
| 255 | + .orElseGet(User::builder) |
| 256 | + .eids(updatedEids) |
| 257 | + .build(); |
| 258 | + } |
242 | 259 |
|
243 | | - final List<ExtRequestPrebidDataEidPermissions> eidPermissions = extPrebidData != null |
244 | | - ? ListUtils.emptyIfNull(extPrebidData.getEidPermissions()) |
245 | | - : Collections.emptyList(); |
| 260 | + private List<ExtRequestPrebidDataEidPermissions> createEidPermissions(Set<String> sources) { |
| 261 | + return sources.stream() |
| 262 | + .map(source -> ExtRequestPrebidDataEidPermissions.builder() |
| 263 | + .source(source) |
| 264 | + .inserter(INSERTER) |
| 265 | + .bidders(targetBidders.stream().toList()) |
| 266 | + .build()) |
| 267 | + .toList(); |
| 268 | + } |
246 | 269 |
|
247 | | - final List<ExtRequestPrebidDataEidPermissions> updatedPermissions = eidPermissions.stream() |
248 | | - .map(permission -> restrictEidPermission(permission, resolvedSources)) |
| 270 | + private List<ExtRequestPrebidDataEidPermissions> modifyEidPermissions( |
| 271 | + List<ExtRequestPrebidDataEidPermissions> eidPermissions, |
| 272 | + Set<String> sources) { |
| 273 | + final List<ExtRequestPrebidDataEidPermissions> modifiedEidPermissions = eidPermissions.stream() |
| 274 | + .map(it -> updateEidPermission(it, sources)) |
249 | 275 | .filter(Objects::nonNull) |
250 | 276 | .toList(); |
251 | | - |
252 | | - return CollectionUtils.isEmpty(updatedPermissions) |
253 | | - ? ExtRequestPrebidData.of( |
254 | | - originalBidders, |
255 | | - resolvedEids.stream() |
256 | | - .map(eid -> |
257 | | - ExtRequestPrebidDataEidPermissions.builder() |
258 | | - .bidders(targetBidders.stream().toList()) |
259 | | - .inserter(INSERTER) |
260 | | - .source(eid.getSource()) |
261 | | - .build()) |
262 | | - .toList()) |
263 | | - : ExtRequestPrebidData.of(originalBidders, updatedPermissions); |
| 277 | + final List<ExtRequestPrebidDataEidPermissions> defaultEidPermissions = createEidPermissions(sources); |
| 278 | + return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); |
264 | 279 | } |
265 | 280 |
|
266 | | - private ExtRequestPrebidDataEidPermissions restrictEidPermission(ExtRequestPrebidDataEidPermissions permission, |
267 | | - Set<FullSource> resolvedSources) { |
| 281 | + private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, |
| 282 | + List<ExtRequestPrebidDataEidPermissions> eidPermissions) { |
268 | 283 |
|
269 | | - final FullSource permFullSource = FullSource.of(permission.getSource(), permission.getInserter()); |
270 | | - if (!resolvedSources.contains(permFullSource)) { |
271 | | - return permission; |
272 | | - } |
| 284 | + final List<String> originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; |
273 | 285 |
|
274 | | - final List<String> permittedBidders = ListUtils.emptyIfNull(permission.getBidders()); |
| 286 | + return ExtRequestPrebidData.of(originalBidders, eidPermissions); |
| 287 | + } |
275 | 288 |
|
276 | | - if (CollectionUtils.isEmpty(permittedBidders) || permittedBidders.contains("*")) { |
277 | | - return permission.toBuilder() |
278 | | - .bidders(targetBidders.stream().toList()) |
279 | | - .build(); |
| 289 | + private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission, |
| 290 | + Set<String> sources) { |
| 291 | + if (!sources.contains(eidPermission.getSource()) || !INSERTER.equals(eidPermission.getInserter())) { |
| 292 | + return eidPermission; |
280 | 293 | } |
281 | 294 |
|
282 | | - final List<String> finalBidders = ListUtils.emptyIfNull(permission.getBidders()).stream() |
| 295 | + final List<String> allowedBidders = ListUtils.emptyIfNull(eidPermission.getBidders()); |
| 296 | + final List<String> finalBidders = allowedBidders.stream() |
283 | 297 | .filter(targetBidders::contains) |
284 | 298 | .toList(); |
285 | 299 |
|
286 | | - return CollectionUtils.isEmpty(finalBidders) |
287 | | - ? null |
288 | | - : permission.toBuilder().bidders(finalBidders).build(); |
| 300 | + if (CollectionUtils.isEmpty(allowedBidders) || allowedBidders.contains("*")) { |
| 301 | + return eidPermission.toBuilder().bidders(targetBidders.stream().toList()).build(); |
| 302 | + } |
| 303 | + |
| 304 | + if (CollectionUtils.isEmpty(finalBidders)) { |
| 305 | + return null; |
| 306 | + } |
| 307 | + |
| 308 | + return eidPermission.toBuilder().bidders(finalBidders).build(); |
289 | 309 | } |
290 | 310 |
|
291 | 311 | @Override |
|
0 commit comments