|
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; |
@@ -58,6 +59,8 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements |
58 | 59 |
|
59 | 60 | private static final String CODE = "liveintent-omni-channel-identity-enrichment-hook"; |
60 | 61 |
|
| 62 | + private static final String INSERTER = "s2s.liveintent.com"; |
| 63 | + |
61 | 64 | private final LiveIntentOmniChannelProperties config; |
62 | 65 | private final JacksonMapper mapper; |
63 | 66 | private final HttpClient httpClient; |
@@ -161,7 +164,18 @@ private MultiMap headers() { |
161 | 164 | } |
162 | 165 |
|
163 | 166 | private IdResResponse processResponse(HttpClientResponse response) { |
164 | | - return mapper.decodeValue(response.getBody(), IdResResponse.class); |
| 167 | + final IdResResponse res = mapper.decodeValue(response.getBody(), IdResResponse.class); |
| 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() |
| 175 | + .map(eid -> eid.toBuilder().inserter(INSERTER).build()) |
| 176 | + .toList(); |
| 177 | + |
| 178 | + return IdResResponse.of(modifiedEids); |
165 | 179 | } |
166 | 180 |
|
167 | 181 | private static Future<InvocationResult<AuctionRequestPayload>> noAction() { |
@@ -189,80 +203,109 @@ private InvocationResultImpl<AuctionRequestPayload> update(IdResResponse resolut |
189 | 203 | } |
190 | 204 |
|
191 | 205 | private AuctionRequestPayload updatedPayload(AuctionRequestPayload requestPayload, List<Eid> resolvedEids) { |
192 | | - final List<Eid> eids = ListUtils.emptyIfNull(resolvedEids); |
193 | | - final BidRequest bidRequest = updateAllowedBidders(requestPayload.bidRequest(), resolvedEids); |
194 | | - final User updatedUser = Optional.ofNullable(bidRequest.getUser()) |
195 | | - .map(user -> user.toBuilder().eids(ListUtil.union(ListUtils.emptyIfNull(user.getEids()), eids))) |
196 | | - .orElseGet(() -> User.builder().eids(eids)) |
197 | | - .build(); |
| 206 | + return CollectionUtils.isNotEmpty(resolvedEids) |
| 207 | + ? AuctionRequestPayloadImpl.of(updateBidRequest(requestPayload.bidRequest(), resolvedEids)) |
| 208 | + : requestPayload; |
| 209 | + } |
198 | 210 |
|
199 | | - 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(); |
200 | 216 | } |
201 | 217 |
|
202 | | - private BidRequest updateAllowedBidders(BidRequest bidRequest, List<Eid> resolvedEids) { |
203 | | - if (CollectionUtils.isEmpty(targetBidders) || CollectionUtils.isEmpty(resolvedEids)) { |
204 | | - return bidRequest; |
205 | | - } |
| 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()); |
206 | 223 |
|
207 | | - final ExtRequest ext = bidRequest.getExt(); |
208 | 224 | final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; |
209 | 225 | final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; |
| 226 | + final List<ExtRequestPrebidDataEidPermissions> eidPermissions = |
| 227 | + extPrebidData != null ? extPrebidData.getEidPermissions() : null; |
210 | 228 |
|
211 | | - final List<ExtRequestPrebidDataEidPermissions> existingPerms = extPrebidData != null |
212 | | - ? extPrebidData.getEidPermissions() |
213 | | - : null; |
214 | | - |
215 | | - if (CollectionUtils.isEmpty(existingPerms)) { |
216 | | - return bidRequest; |
217 | | - } |
| 229 | + final List<ExtRequestPrebidDataEidPermissions> modifiedEidPermissions = CollectionUtils.isEmpty(eidPermissions) |
| 230 | + ? createEidPermissions(uniqueSources) |
| 231 | + : modifyEidPermissions(eidPermissions, uniqueSources); |
218 | 232 |
|
219 | 233 | final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) |
220 | 234 | .map(ExtRequestPrebid::toBuilder) |
221 | 235 | .orElseGet(ExtRequestPrebid::builder) |
222 | | - .data(updatePrebidData(extPrebidData, resolvedEids)) |
| 236 | + .data(updatePrebidData(extPrebidData, modifiedEidPermissions)) |
223 | 237 | .build(); |
224 | 238 |
|
225 | 239 | final ExtRequest updatedExtRequest = ExtRequest.of(updatedExtPrebid); |
226 | 240 | if (ext != null) { |
227 | 241 | mapper.fillExtension(updatedExtRequest, ext.getProperties()); |
228 | 242 | } |
229 | 243 |
|
230 | | - return bidRequest.toBuilder().ext(updatedExtRequest).build(); |
| 244 | + return updatedExtRequest; |
231 | 245 | } |
232 | 246 |
|
233 | | - private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, List<Eid> resolvedEids) { |
234 | | - 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); |
235 | 252 |
|
236 | | - final Set<String> resolvedSources = resolvedEids.stream() |
237 | | - .map(Eid::getSource) |
238 | | - .collect(Collectors.toSet()); |
| 253 | + return Optional.ofNullable(user) |
| 254 | + .map(User::toBuilder) |
| 255 | + .orElseGet(User::builder) |
| 256 | + .eids(updatedEids) |
| 257 | + .build(); |
| 258 | + } |
239 | 259 |
|
240 | | - final List<ExtRequestPrebidDataEidPermissions> updatedPermissions = extPrebidData.getEidPermissions().stream() |
241 | | - .map(permission -> restrictEidPermission(permission, resolvedSources)) |
242 | | - .filter(Objects::nonNull) |
| 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()) |
243 | 267 | .toList(); |
| 268 | + } |
244 | 269 |
|
245 | | - return ExtRequestPrebidData.of(originalBidders, updatedPermissions); |
| 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)) |
| 275 | + .filter(Objects::nonNull) |
| 276 | + .toList(); |
| 277 | + final List<ExtRequestPrebidDataEidPermissions> defaultEidPermissions = createEidPermissions(sources); |
| 278 | + return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); |
246 | 279 | } |
247 | 280 |
|
248 | | - private ExtRequestPrebidDataEidPermissions restrictEidPermission(ExtRequestPrebidDataEidPermissions permission, |
249 | | - Set<String> resolvedSources) { |
| 281 | + private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, |
| 282 | + List<ExtRequestPrebidDataEidPermissions> eidPermissions) { |
| 283 | + |
| 284 | + final List<String> originalBidders = extPrebidData != null ? extPrebidData.getBidders() : null; |
| 285 | + |
| 286 | + return ExtRequestPrebidData.of(originalBidders, eidPermissions); |
| 287 | + } |
250 | 288 |
|
251 | | - if (!resolvedSources.contains(permission.getSource())) { |
252 | | - return permission; |
| 289 | + private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission, |
| 290 | + Set<String> sources) { |
| 291 | + if (!sources.contains(eidPermission.getSource()) || !INSERTER.equals(eidPermission.getInserter())) { |
| 292 | + return eidPermission; |
253 | 293 | } |
254 | 294 |
|
255 | | - 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() |
256 | 297 | .filter(targetBidders::contains) |
257 | 298 | .toList(); |
258 | 299 |
|
259 | | - return CollectionUtils.isEmpty(finalBidders) |
260 | | - ? null |
261 | | - : ExtRequestPrebidDataEidPermissions |
262 | | - .builder() |
263 | | - .bidders(finalBidders) |
264 | | - .source(permission.getSource()) |
265 | | - .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(); |
266 | 309 | } |
267 | 310 |
|
268 | 311 | @Override |
|
0 commit comments