diff --git a/src/main/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactory.java b/src/main/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactory.java index 087b72a67c6..61477f66084 100644 --- a/src/main/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactory.java +++ b/src/main/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactory.java @@ -1,5 +1,6 @@ package org.prebid.server.auction.privacy.contextfactory; +import com.iab.openrtb.request.App; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; import com.iab.openrtb.request.Geo; @@ -101,13 +102,17 @@ private static AccountGdprConfig accountGdprConfig(Account account) { } private static RequestLogInfo requestLogInfo(MetricName requestType, BidRequest bidRequest, String accountId) { - final String referrerUrl = MetricName.openrtb2web == requestType - ? Optional.ofNullable(bidRequest.getSite()) - .map(Site::getRef) - .orElse(null) - : null; - - return RequestLogInfo.of(requestType, referrerUrl, accountId); + final String source = switch (requestType) { + case MetricName.openrtb2web -> Optional.ofNullable(bidRequest.getSite()) + .map(Site::getRef) + .orElse(null); + case MetricName.openrtb2app -> Optional.ofNullable(bidRequest.getApp()) + .map(App::getBundle) + .orElse(null); + case null, default -> null; + }; + + return RequestLogInfo.of(requestType, source, accountId); } private static TcfContext logWarnings(List debugWarnings, TcfContext tcfContext) { diff --git a/src/main/java/org/prebid/server/privacy/gdpr/TcfDefinerService.java b/src/main/java/org/prebid/server/privacy/gdpr/TcfDefinerService.java index 91e89d0e2b3..2fa6d20b837 100644 --- a/src/main/java/org/prebid/server/privacy/gdpr/TcfDefinerService.java +++ b/src/main/java/org/prebid/server/privacy/gdpr/TcfDefinerService.java @@ -421,8 +421,11 @@ private static void logWarn(String consent, String message, RequestLogInfo reque } private static String logMessage(String consent, String type, RequestLogInfo requestLogInfo, String message) { - return "Parsing consent string: \"%s\" failed for: %s type for account id: %s with ref: %s with exception: %s" - .formatted(consent, type, requestLogInfo.getAccountId(), requestLogInfo.getRefUrl(), message); + return """ + Parsing consent string: "%s" failed for: \ + %s type for account id: %s from source: \ + %s with exception: %s""" + .formatted(consent, type, requestLogInfo.getAccountId(), requestLogInfo.getSource(), message); } private static boolean isConsentValid(TCString consent) { diff --git a/src/main/java/org/prebid/server/privacy/gdpr/model/RequestLogInfo.java b/src/main/java/org/prebid/server/privacy/gdpr/model/RequestLogInfo.java index 55eb248b739..07993be1163 100644 --- a/src/main/java/org/prebid/server/privacy/gdpr/model/RequestLogInfo.java +++ b/src/main/java/org/prebid/server/privacy/gdpr/model/RequestLogInfo.java @@ -8,7 +8,7 @@ public class RequestLogInfo { MetricName requestType; - String refUrl; + String source; String accountId; } diff --git a/src/test/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactoryTest.java b/src/test/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactoryTest.java index 79c1af860af..d61b421d5c0 100644 --- a/src/test/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/privacy/contextfactory/AuctionPrivacyContextFactoryTest.java @@ -1,5 +1,6 @@ package org.prebid.server.auction.privacy.contextfactory; +import com.iab.openrtb.request.App; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; import com.iab.openrtb.request.Site; @@ -183,7 +184,9 @@ public void contextFromShouldAddRefUrlWhenPresentAndRequestTypeIsWeb() { given(tcfDefinerService.resolveTcfContext(any(), any(), any(), any(), any(), any(), any(), any())) .willReturn(Future.succeededFuture(TcfContext.empty())); - final BidRequest bidRequest = givenBidRequest(request -> request.site(Site.builder().ref("refUrl").build())); + final BidRequest bidRequest = givenBidRequest(request -> request + .site(Site.builder().ref("refUrl").build()) + .app(App.builder().bundle("bundle").build())); final AuctionContext auctionContext = givenAuctionContext(context -> context .requestTypeMetric(MetricName.openrtb2web) .httpRequest(givenHttpRequestContext("invalid")) @@ -198,6 +201,37 @@ public void contextFromShouldAddRefUrlWhenPresentAndRequestTypeIsWeb() { .resolveTcfContext(any(), any(), any(), any(), any(), eq(expectedRequestLogInfo), any(), any()); } + @Test + public void contextFromShouldAddBundleWhenPresentAndRequestTypeIsApp() { + // given + final Privacy privacy = Privacy.builder() + .gdpr("1") + .consentString("consent_string") + .ccpa(Ccpa.EMPTY) + .coppa(0) + .build(); + given(privacyExtractor.validPrivacyFrom(any(), any())).willReturn(privacy); + + given(tcfDefinerService.resolveTcfContext(any(), any(), any(), any(), any(), any(), any(), any())) + .willReturn(Future.succeededFuture(TcfContext.empty())); + + final BidRequest bidRequest = givenBidRequest(request -> request + .site(Site.builder().ref("refUrl").build()) + .app(App.builder().bundle("bundle").build())); + final AuctionContext auctionContext = givenAuctionContext(context -> context + .requestTypeMetric(MetricName.openrtb2app) + .httpRequest(givenHttpRequestContext("invalid")) + .bidRequest(bidRequest)); + + // when + target.contextFrom(auctionContext); + + // then + final RequestLogInfo expectedRequestLogInfo = RequestLogInfo.of(MetricName.openrtb2app, "bundle", null); + verify(tcfDefinerService) + .resolveTcfContext(any(), any(), any(), any(), any(), eq(expectedRequestLogInfo), any(), any()); + } + private static AuctionContext givenAuctionContext( UnaryOperator auctionContextCustomizer) {