diff --git a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java index ba5203e5e75..b98c3c7c033 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java +++ b/extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java @@ -10,7 +10,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.SetUtils; -import org.apache.commons.lang3.StringUtils; import org.prebid.server.activity.Activity; import org.prebid.server.activity.ComponentType; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; @@ -50,7 +49,6 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHook implements ProcessedAuctionRequestHook { @@ -216,19 +214,24 @@ private BidRequest updateBidRequest(BidRequest bidRequest, List resolvedEid } private ExtRequest updateExtRequest(ExtRequest ext, List resolvedEids) { - final Set uniqueSources = CollectionUtils.emptyIfNull(resolvedEids).stream() - .map(Eid::getSource) - .filter(StringUtils::isNotEmpty) - .collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(resolvedEids)) { + return ext; + } final ExtRequestPrebid extPrebid = ext != null ? ext.getPrebid() : null; final ExtRequestPrebidData extPrebidData = extPrebid != null ? extPrebid.getData() : null; final List eidPermissions = extPrebidData != null ? extPrebidData.getEidPermissions() : null; + final String matcher = resolvedEids.stream() + .map(Eid::getMatcher) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + final List modifiedEidPermissions = CollectionUtils.isEmpty(eidPermissions) - ? createEidPermissions(uniqueSources) - : modifyEidPermissions(eidPermissions, uniqueSources); + ? createEidPermissions(matcher) + : modifyEidPermissions(eidPermissions, matcher); final ExtRequestPrebid updatedExtPrebid = Optional.ofNullable(extPrebid) .map(ExtRequestPrebid::toBuilder) @@ -257,25 +260,21 @@ private static User updateUser(User user, List resolvedEids) { .build(); } - private List createEidPermissions(Set sources) { - return sources.stream() - .map(source -> ExtRequestPrebidDataEidPermissions.builder() - .source(source) - .inserter(INSERTER) - .bidders(targetBidders.stream().toList()) - .build()) - .toList(); + private List createEidPermissions(String matcher) { + return List.of(ExtRequestPrebidDataEidPermissions.builder() + .matcher(matcher) + .inserter(INSERTER) + .bidders(targetBidders.stream().toList()) + .build()); } private List modifyEidPermissions( - List eidPermissions, - Set sources) { + List eidPermissions, String matcher) { final List modifiedEidPermissions = eidPermissions.stream() - .map(it -> updateEidPermission(it, sources)) - .filter(Objects::nonNull) - .toList(); - final List defaultEidPermissions = createEidPermissions(sources); - return ListUtils.union(modifiedEidPermissions, defaultEidPermissions); + .map(p -> updateEidPermission(p, matcher)) + .filter(Objects::nonNull) + .toList(); + return ListUtils.union(modifiedEidPermissions, createEidPermissions(matcher)); } private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData, @@ -287,8 +286,8 @@ private ExtRequestPrebidData updatePrebidData(ExtRequestPrebidData extPrebidData } private ExtRequestPrebidDataEidPermissions updateEidPermission(ExtRequestPrebidDataEidPermissions eidPermission, - Set sources) { - if (!sources.contains(eidPermission.getSource()) || !INSERTER.equals(eidPermission.getInserter())) { + String matcher) { + if (!Objects.equals(matcher, eidPermission.getMatcher()) || !INSERTER.equals(eidPermission.getInserter())) { return eidPermission; } diff --git a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java index e89910b02de..3b9f905428a 100644 --- a/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java +++ b/extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java @@ -91,8 +91,8 @@ public void setUp() { defaultPermissions = ExtRequestPrebidDataEidPermissions.builder() .inserter("s2s.liveintent.com") + .matcher("test.matcher.com") .bidders(configuredBidders.stream().toList()) - .source("liveintent.com") .build(); target = new LiveIntentOmniChannelIdentityProcessedAuctionRequestHook( @@ -254,13 +254,13 @@ public void callShouldEnrichUserEidsWithRequestedEids() { final User givenUser = User.builder().eids(singletonList(givenEid)).build(); final BidRequest givenBidRequest = BidRequest.builder().id("request").user(givenUser).build(); - final Eid expectedEid = Eid.builder() + final Eid apiResponseEid = Eid.builder() .source("liveintent.com") + .matcher("test.matcher.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) - .matcher("liveintent.com") .build(); - final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); + final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(apiResponseEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); @@ -279,11 +279,24 @@ public void callShouldEnrichUserEidsWithRequestedEids() { // then assertThat(result.status()).isEqualTo(InvocationStatus.success); assertThat(result.action()).isEqualTo(InvocationAction.update); - assertThat(result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest))) + + final AuctionRequestPayload updatedPayload = + result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest)); + + assertThat(updatedPayload) .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) - .isEqualTo(List.of(givenEid, expectedEid.toBuilder().inserter("s2s.liveintent.com").build())); + .isEqualTo(List.of(givenEid, apiResponseEid.toBuilder() + .inserter("s2s.liveintent.com") + .build())); + + assertThat(updatedPayload) + .extracting(AuctionRequestPayload::bidRequest) + .extracting(BidRequest::getExt) + .extracting(ExtRequest::getPrebid) + .extracting(ExtRequestPrebid::getData) + .isEqualTo(ExtRequestPrebidData.of(null, List.of(defaultPermissions))); verify(httpClient).post( eq("https://test.com/idres"), @@ -297,13 +310,13 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { // given final BidRequest givenBidRequest = BidRequest.builder().id("request").user(null).build(); - final Eid expectedEid = Eid.builder() + final Eid apiResponseEid = Eid.builder() .source("liveintent.com") + .matcher("test.matcher.com") .uids(singletonList(Uid.builder().id("id2").atype(3).build())) - .matcher("liveintent.com") .build(); - final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); + final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(apiResponseEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); @@ -326,7 +339,9 @@ public void callShouldCreateUserAndUseRequestedEidsWhenUserIsAbsent() { .extracting(AuctionRequestPayload::bidRequest) .extracting(BidRequest::getUser) .extracting(User::getEids) - .isEqualTo(List.of(expectedEid.toBuilder().inserter("s2s.liveintent.com").build())); + .isEqualTo(List.of(apiResponseEid.toBuilder() + .inserter("s2s.liveintent.com") + .build())); verify(httpClient).post( eq("https://test.com/idres"), @@ -400,12 +415,12 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde .build(); final ExtRequestPrebidDataEidPermissions liBidder2 = ExtRequestPrebidDataEidPermissions.builder() - .source("liveintent.com") + .matcher("test.matcher.com") .inserter("s2s.liveintent.com") .bidders(singletonList("bidder2")) .build(); final ExtRequestPrebidDataEidPermissions liBidder23 = ExtRequestPrebidDataEidPermissions.builder() - .source("liveintent.com") + .matcher("test.matcher.com") .inserter("s2s.liveintent.com") .bidders(List.of("bidder2", "bidder3")) .build(); @@ -423,70 +438,7 @@ public void shouldRestrictExistingEidPermissionsByIntersectionAndKeepGlobalBidde List.of("bidderX"), ListUtil.union(List.of(otherBidder, liBidder2), List.of(defaultPermissions))); - final Eid expectedEid = Eid.builder().source("liveintent.com").build(); - - final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); - given(httpClient.post(any(), any(), any(), anyLong())) - .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody))); - - given(auctionInvocationContext.auctionContext()).willReturn(auctionContext); - given(auctionContext.getActivityInfrastructure()).willReturn(activityInfrastructure); - given(activityInfrastructure.isAllowed(any(), any())).willReturn(true); - given(userFpdActivityMask.maskUser(any(), eq(false), eq(false))) - .willAnswer(invocation -> invocation.getArgument(0)); - given(userFpdActivityMask.maskDevice(any(), eq(false), eq(false))) - .willAnswer(invocation -> invocation.getArgument(0)); - - // when - final InvocationResult result = - target.call(AuctionRequestPayloadImpl.of(givenBidRequest), auctionInvocationContext).result(); - // then - assertThat(result.status()).isEqualTo(InvocationStatus.success); - assertThat(result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest))) - .extracting(AuctionRequestPayload::bidRequest) - .extracting(BidRequest::getExt) - .extracting(ExtRequest::getPrebid) - .extracting(ExtRequestPrebid::getData) - .isEqualTo(expectedData); - - verify(httpClient).post( - eq("https://test.com/idres"), - argThat(headers -> headers.contains("Authorization", "Bearer auth_token", true)), - eq(MAPPER.encodeToString(givenBidRequest)), - eq(5L)); - } - - @Test - public void shouldNotAddNewEidPermissionsOrModifyGlobalBiddersWhenSourceNotPresent() { - // given - final Uid givenUid = Uid.builder().id("id1").atype(2).build(); - final Eid givenEid = Eid.builder().source("some.source.com").uids(singletonList(givenUid)).build(); - final User givenUser = User.builder().eids(singletonList(givenEid)).build(); - final ExtRequestPrebidDataEidPermissions bidder1 = ExtRequestPrebidDataEidPermissions.builder() - .source("some.other-source.com") - .inserter("some.other-inserter.com") - .bidders(singletonList("bidder3")) - .build(); - final ExtRequestPrebidDataEidPermissions bidder2 = ExtRequestPrebidDataEidPermissions.builder() - .source("some.source.com") - .inserter("s2s.liveintent.com") - .bidders(singletonList("bidder3")) - .build(); - - final List bidders = List.of(bidder1, bidder2); - - final BidRequest givenBidRequest = BidRequest.builder() - .id("request") - .user(givenUser) - .ext(ExtRequest.of(ExtRequestPrebid.builder() - .data(ExtRequestPrebidData.of(singletonList("bidder3"), bidders)) - .build())) - .build(); - - final ExtRequestPrebidData expectedData = ExtRequestPrebidData.of(List.of("bidder3"), - ListUtil.union(bidders, List.of(defaultPermissions))); - - final Eid expectedEid = Eid.builder().source("liveintent.com").build(); + final Eid expectedEid = Eid.builder().source("liveintent.com").matcher("test.matcher.com").build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); given(httpClient.post(any(), any(), any(), anyLong())) @@ -530,7 +482,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { List.of("bidderGlobal"), List.of( ExtRequestPrebidDataEidPermissions.builder() - .source("liveintent.com") + .matcher("test.matcher.com") .inserter("s2s.liveintent.com") .bidders(singletonList("not-allowed")) .build(), @@ -545,7 +497,7 @@ public void shouldRemovePermissionWhenIntersectionIsEmpty() { .ext(ExtRequest.of(ExtRequestPrebid.builder().data(givenData).build())) .build(); - final Eid expectedEid = Eid.builder().source("liveintent.com").build(); + final Eid expectedEid = Eid.builder().source("liveintent.com").matcher("test.matcher.com").build(); final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid))); given(httpClient.post(any(), any(), any(), anyLong())) .willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody)));