From 39fb08e1853abb03e20000e98e65c5249884466f Mon Sep 17 00:00:00 2001 From: Ivan Krdzavac Date: Tue, 27 May 2025 10:52:16 +0200 Subject: [PATCH 1/2] enable ogury in app traffic --- .../server/bidder/ogury/OguryBidder.java | 17 ++++++- src/main/resources/bidder-config/ogury.yaml | 2 + .../server/bidder/ogury/OguryBidderTest.java | 46 +++++++++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java b/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java index 91906d7643c..fa5aed4f37a 100644 --- a/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java +++ b/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java @@ -70,7 +70,12 @@ public Result>> makeHttpRequests(BidRequest bidRequ } } - if (!isValidRequestKeys(bidRequest, impsWithOguryParams)) { + if (isAppRequest(bidRequest)) { + if (!isValidAppRequestKeys(impsWithOguryParams)) { + errors.add(BidderError.badInput("Invalid request. assetKey/adUnitId required")); + return Result.withErrors(errors); + } + } else if (!isValidSiteRequestKeys(bidRequest, impsWithOguryParams)) { errors.add(BidderError.badInput( "Invalid request. assetKey/adUnitId or request.site.publisher.id required")); return Result.withErrors(errors); @@ -137,7 +142,15 @@ private boolean hasOguryParams(Imp imp) { && impExtBidderHoist.has(PREBID_FIELD_ADUNIT_ID); } - private boolean isValidRequestKeys(BidRequest request, List impsWithOguryParams) { + private boolean isAppRequest(BidRequest request) { + return Optional.ofNullable(request.getApp()).isPresent(); + } + + private boolean isValidAppRequestKeys(List impsWithOguryParams) { + return !CollectionUtils.isEmpty(impsWithOguryParams); + } + + private boolean isValidSiteRequestKeys(BidRequest request, List impsWithOguryParams) { return !CollectionUtils.isEmpty(impsWithOguryParams) || Optional.ofNullable(request.getSite()) .map(Site::getPublisher) .map(Publisher::getId) diff --git a/src/main/resources/bidder-config/ogury.yaml b/src/main/resources/bidder-config/ogury.yaml index 32ccccac07e..90fe12ccd76 100644 --- a/src/main/resources/bidder-config/ogury.yaml +++ b/src/main/resources/bidder-config/ogury.yaml @@ -8,6 +8,8 @@ adapters: maintainer-email: deliveryservices@ogury.co site-media-types: - banner + app-media-types: + - banner vendor-id: 31 usersync: cookie-family-name: ogury diff --git a/src/test/java/org/prebid/server/bidder/ogury/OguryBidderTest.java b/src/test/java/org/prebid/server/bidder/ogury/OguryBidderTest.java index 8222df6ab01..d5426ab415d 100644 --- a/src/test/java/org/prebid/server/bidder/ogury/OguryBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/ogury/OguryBidderTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.iab.openrtb.request.App; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; import com.iab.openrtb.request.Imp; @@ -191,6 +192,47 @@ public void makeHttpRequestsShouldNotSendImpsWhenHasNotPublisherIdAndImpsWithOgu BidderError.badInput("Invalid request. assetKey/adUnitId or request.site.publisher.id required")); } + @Test + public void makeHttpRequestsAppShouldSendOnlyImpsWithOguryParamsIfPresent() { + // given + final BidRequest bidrequest = givenBidRequest( + bidRequest -> bidRequest.app(givenApp()), + givenImp(imp -> imp.id("without_ogury_keys").ext(givenEmptyImpExt())), + givenImp(imp -> imp.id("with_ogury_keys").ext(givenImpExtWithOguryKeys()))); + + // when + final Result>> result = target.makeHttpRequests(bidrequest); + + // then + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getId) + .containsExactly("with_ogury_keys"); + + assertThat(result.getErrors()).isEmpty(); + } + + @Test + public void makeHttpRequestsAppShouldNotSendImpsWhenImpsWithOguryIsEmpty() { + // given + final ObjectNode emptyImpExt = givenEmptyImpExt(); + + final BidRequest bidrequest = givenBidRequest( + bidRequest -> bidRequest.app(givenApp()), + givenImp(imp -> imp.id("id1").ext(emptyImpExt)), + givenImp(imp -> imp.id("id2").ext(emptyImpExt))); + + // when + final Result>> result = target.makeHttpRequests(bidrequest); + + // then + assertThat(result.getValue()).isEmpty(); + + assertThat(result.getErrors()).containsExactly( + BidderError.badInput("Invalid request. assetKey/adUnitId required")); + } + @Test public void makeHttpRequestsShouldCopyImpIdToTagId() { // given @@ -564,6 +606,10 @@ private Site givenSite() { .build(); } + private App givenApp() { + return App.builder().bundle("app_bundle").build(); + } + private ObjectNode givenEmptyImpExt() { final ObjectNode ext = mapper.createObjectNode(); ext.putIfAbsent("bidder", mapper.createObjectNode()); From 08995e95307c71604a7b7bac08cb0153fe61ff86 Mon Sep 17 00:00:00 2001 From: Ivan Krdzavac Date: Thu, 5 Jun 2025 10:36:40 +0200 Subject: [PATCH 2/2] PR review - make code clearer --- .../server/bidder/ogury/OguryBidder.java | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java b/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java index fa5aed4f37a..3626f88b93b 100644 --- a/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java +++ b/src/main/java/org/prebid/server/bidder/ogury/OguryBidder.java @@ -70,15 +70,17 @@ public Result>> makeHttpRequests(BidRequest bidRequ } } - if (isAppRequest(bidRequest)) { - if (!isValidAppRequestKeys(impsWithOguryParams)) { + if (CollectionUtils.isEmpty(impsWithOguryParams)) { + if (bidRequest.getApp() != null) { errors.add(BidderError.badInput("Invalid request. assetKey/adUnitId required")); return Result.withErrors(errors); } - } else if (!isValidSiteRequestKeys(bidRequest, impsWithOguryParams)) { - errors.add(BidderError.badInput( - "Invalid request. assetKey/adUnitId or request.site.publisher.id required")); - return Result.withErrors(errors); + // for "site" request we can serve ads with just publisher.id + if (!hasPublisherId(bidRequest)) { + errors.add(BidderError.badInput( + "Invalid request. assetKey/adUnitId or request.site.publisher.id required")); + return Result.withErrors(errors); + } } final BidRequest modifiedBidRequest = bidRequest.toBuilder() @@ -142,16 +144,8 @@ private boolean hasOguryParams(Imp imp) { && impExtBidderHoist.has(PREBID_FIELD_ADUNIT_ID); } - private boolean isAppRequest(BidRequest request) { - return Optional.ofNullable(request.getApp()).isPresent(); - } - - private boolean isValidAppRequestKeys(List impsWithOguryParams) { - return !CollectionUtils.isEmpty(impsWithOguryParams); - } - - private boolean isValidSiteRequestKeys(BidRequest request, List impsWithOguryParams) { - return !CollectionUtils.isEmpty(impsWithOguryParams) || Optional.ofNullable(request.getSite()) + private boolean hasPublisherId(BidRequest request) { + return Optional.ofNullable(request.getSite()) .map(Site::getPublisher) .map(Publisher::getId) .isPresent();