From 4751ca0ee51e7db6b9c0be011d45516ec92be592 Mon Sep 17 00:00:00 2001 From: markiian Date: Wed, 17 Jan 2024 14:38:55 +0200 Subject: [PATCH 1/3] Update NextMillennium adapter --- .../nextmillennium/NextMillenniumBidder.java | 75 +++++++++++-------- .../bidder/NextMillenniumConfiguration.java | 33 ++++++-- .../bidder-config/nextmillennium.yaml | 4 + .../NextMillenniumBidderTest.java | 32 +++++++- .../test-nextmillennium-bid-request.json | 5 +- .../server/it/test-application.properties | 1 + 6 files changed, 108 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 22e244ac6db..8690e434a52 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -44,41 +44,14 @@ public class NextMillenniumBidder implements Bidder { }; private final String endpointUrl; + private final List nmmFlags; private final JacksonMapper mapper; - public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper) { + public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper, List nmmFlags) { this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl)); this.mapper = Objects.requireNonNull(mapper); - } - - private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) { - - final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder() - .storedrequest(ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext))) - .build()); - - final ObjectNode impExt = mapper.mapper().valueToTree(extRequest); - - final List imps = bidRequest.getImp().stream() - .map(imp -> imp.toBuilder().ext(impExt).build()) - .toList(); - - return bidRequest.toBuilder().imp(imps).ext(extRequest).build(); - } - - private static String resolveStoredRequestId(BidRequest bidRequest, ExtImpNextMillennium extImpNextMillennium) { - final String groupId = extImpNextMillennium.getGroupId(); - if (StringUtils.isEmpty(groupId)) { - return extImpNextMillennium.getPlacementId(); - } + this.nmmFlags = Objects.requireNonNull(nmmFlags); - final String size = formattedSizeFromBanner(bidRequest.getImp().get(0).getBanner()); - final String domain = ObjectUtils.firstNonNull( - ObjectUtil.getIfNotNull(bidRequest.getSite(), Site::getDomain), - ObjectUtil.getIfNotNull(bidRequest.getApp(), App::getDomain), - StringUtils.EMPTY); - - return "g%s;%s;%s".formatted(groupId, size, domain); } @Override @@ -98,6 +71,12 @@ private List getImpExts(BidRequest bidRequest, List> makeRequests(BidRequest bidRequest, List extImps) { + return extImps.stream() + .map(extImp -> makeHttpRequest(updateBidRequest(bidRequest, extImp))) + .toList(); + } + private ExtImpNextMillennium convertExt(Imp imp, List errors) { try { return mapper.mapper() @@ -109,10 +88,33 @@ private ExtImpNextMillennium convertExt(Imp imp, List errors) { return null; } - private List> makeRequests(BidRequest bidRequest, List extImps) { - return extImps.stream() - .map(extImp -> makeHttpRequest(updateBidRequest(bidRequest, extImp))) + private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) { + + final ExtRequestPrebid prebid = ExtRequestPrebid.builder() + .storedrequest(ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext))) + .build(); + final ExtRequest extRequest = ExtRequest.of(prebid); + + final List imps = bidRequest.getImp().stream() + .map(imp -> imp.toBuilder().ext(createImpExt(prebid)).build()) .toList(); + + return bidRequest.toBuilder().imp(imps).ext(extRequest).build(); + } + + private static String resolveStoredRequestId(BidRequest bidRequest, ExtImpNextMillennium extImpNextMillennium) { + final String groupId = extImpNextMillennium.getGroupId(); + if (StringUtils.isEmpty(groupId)) { + return extImpNextMillennium.getPlacementId(); + } + + final String size = formattedSizeFromBanner(bidRequest.getImp().get(0).getBanner()); + final String domain = ObjectUtils.firstNonNull( + ObjectUtil.getIfNotNull(bidRequest.getSite(), Site::getDomain), + ObjectUtil.getIfNotNull(bidRequest.getApp(), App::getDomain), + StringUtils.EMPTY); + + return "g%s;%s;%s".formatted(groupId, size, domain); } private static String formattedSizeFromBanner(Banner banner) { @@ -137,6 +139,13 @@ private static String formatSize(Integer w, Integer h) { : null; } + private ObjectNode createImpExt(ExtRequestPrebid prebid) { + final ObjectNode impExt = mapper.mapper().createObjectNode(); + impExt.set("prebid", mapper.mapper().valueToTree(prebid)); + impExt.set("nextMillennium", mapper.mapper().valueToTree(nmmFlags)); + return impExt; + } + private HttpRequest makeHttpRequest(BidRequest bidRequest) { return HttpRequest.builder() .method(HttpMethod.POST) diff --git a/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java index 7364ec32c2c..f39b830122a 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java @@ -1,5 +1,8 @@ package org.prebid.server.spring.config.bidder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.prebid.server.bidder.BidderDeps; import org.prebid.server.bidder.nextmillennium.NextMillenniumBidder; import org.prebid.server.json.JacksonMapper; @@ -14,6 +17,7 @@ import org.springframework.context.annotation.PropertySource; import javax.validation.constraints.NotBlank; +import java.util.List; @Configuration @PropertySource(value = "classpath:/bidder-config/nextmillennium.yaml", factory = YamlPropertySourceFactory.class) @@ -23,19 +27,36 @@ public class NextMillenniumConfiguration { @Bean("nextMillenniumConfigurationProperties") @ConfigurationProperties("adapters.nextmillennium") - BidderConfigurationProperties configurationProperties() { - return new BidderConfigurationProperties(); + NextMillenniumConfigurationProperties configurationProperties() { + return new NextMillenniumConfigurationProperties(); } @Bean - BidderDeps nextMillenniumBidderDeps(BidderConfigurationProperties nextMillenniumConfigurationProperties, + BidderDeps nextMillenniumBidderDeps(NextMillenniumConfigurationProperties nextMillenniumConfigurationProperties, @NotBlank @Value("${external-url}") String externalUrl, JacksonMapper mapper) { - return BidderDepsAssembler.forBidder(BIDDER_NAME) + return BidderDepsAssembler.forBidder(BIDDER_NAME) .withConfig(nextMillenniumConfigurationProperties) .usersyncerCreator(UsersyncerCreator.create(externalUrl)) - .bidderCreator(config -> new NextMillenniumBidder(config.getEndpoint(), mapper)) - .assemble(); + .bidderCreator(config -> { + final ExtraInfo extraInfo = config.getExtraInfo(); + return new NextMillenniumBidder(config.getEndpoint(), mapper, extraInfo.getNmmFlags()); + }).assemble(); + } + + @Data + @EqualsAndHashCode(callSuper = true) + @NoArgsConstructor + private static class NextMillenniumConfigurationProperties extends BidderConfigurationProperties { + + private ExtraInfo extraInfo = new ExtraInfo(); + } + + @Data + @NoArgsConstructor + private static class ExtraInfo { + + List nmmFlags; } } diff --git a/src/main/resources/bidder-config/nextmillennium.yaml b/src/main/resources/bidder-config/nextmillennium.yaml index a47bbb5440e..51524341a45 100644 --- a/src/main/resources/bidder-config/nextmillennium.yaml +++ b/src/main/resources/bidder-config/nextmillennium.yaml @@ -15,3 +15,7 @@ adapters: url: https://cookies.nextmillmedia.com/sync?gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&redirect={{redirect_url}} support-cors: false uid-macro: '[NMUID]' + redirect: + url: https://cookies.nextmillmedia.com/sync?type=image&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&redirect={{redirect_url}} + support-cors: false + userMacro: '[NMUID]' diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index c3977e55a31..d2a8b3c55e0 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.nextmillennium; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.App; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; @@ -41,11 +42,13 @@ public class NextMillenniumBidderTest extends VertxTest { private static final String ENDPOINT_URL = "https://test-url.com/"; - private final NextMillenniumBidder target = new NextMillenniumBidder(ENDPOINT_URL, jacksonMapper); + private final NextMillenniumBidder target = + new NextMillenniumBidder(ENDPOINT_URL, jacksonMapper, List.of("valueOne", "valueTwo")); @Test public void creationShouldFailOnInvalidEndpointUrl() { - assertThatIllegalArgumentException().isThrownBy(() -> new NextMillenniumBidder("invalid_url", jacksonMapper)); + assertThatIllegalArgumentException().isThrownBy(() -> + new NextMillenniumBidder("invalid_url", jacksonMapper, List.of("valueOne", "valueTwo"))); } @Test @@ -253,6 +256,24 @@ public void makeHttpRequestsWithInvalidImpsShouldReturnError() { assertThat(result.getValue()).isEmpty(); } + @Test + public void makeHttpRequestsShouldReturnImpExtNextMillenniumWhenNmmFlagsConfigured() { + // given + final BidRequest bidRequest = givenBidRequest(identity(), + givenImpWithExt(identity(), ExtImpNextMillennium.of("placement1", "group1"))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getExt) + .containsExactly(createImpExt(List.of("valueOne", "valueTwo"))); + } + @Test public void makeBidsShouldReturnBannerBidByDefault() throws JsonProcessingException { // given @@ -477,4 +498,11 @@ private static Imp givenImpWithExt(UnaryOperator impCustomizer, ExtPrebid.of(null, extImpNextMillennium))))::apply); } + private static ObjectNode createImpExt(List values) { + final ObjectNode objectNode = mapper.createObjectNode(); + objectNode.set("prebid", mapper.valueToTree(ExtRequestPrebid.builder() + .storedrequest(ExtStoredRequest.of("ggroup1;;")).build())); + objectNode.set("nextMillennium", mapper.valueToTree(values)); + return objectNode; + } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 39f43c1d5a8..889b35747d7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -13,7 +13,10 @@ "storedrequest": { "id": "placement_id" } - } + }, + "nextMillennium": [ + "1" + ] } } ], diff --git a/src/test/resources/org/prebid/server/it/test-application.properties b/src/test/resources/org/prebid/server/it/test-application.properties index b62a13726ea..b7e380f5540 100644 --- a/src/test/resources/org/prebid/server/it/test-application.properties +++ b/src/test/resources/org/prebid/server/it/test-application.properties @@ -266,6 +266,7 @@ adapters.motorik.enabled=true adapters.motorik.endpoint=http://localhost:8090/motorik-exchange?k={{AccountID}}&name={{SourceId}} adapters.nextmillennium.enabled=true adapters.nextmillennium.endpoint=http://localhost:8090/nextmillennium-exchange +adapters.nextmillennium.extra-info.nmmFlags=1 adapters.nobid.enabled=true adapters.nobid.endpoint=http://localhost:8090/nobid-exchange?pubid= adapters.oms.enabled=true From 8d7d522fbf34db8b34b3eaba3e7ee3e85239f29d Mon Sep 17 00:00:00 2001 From: markiian Date: Thu, 18 Jan 2024 13:21:46 +0200 Subject: [PATCH 2/3] Update NextMillennium bidder --- .../bidder/nextmillennium/NextMillenniumBidder.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 8690e434a52..46a26422b11 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -44,13 +44,13 @@ public class NextMillenniumBidder implements Bidder { }; private final String endpointUrl; - private final List nmmFlags; private final JacksonMapper mapper; + private final List nmmFlags; public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper, List nmmFlags) { this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl)); this.mapper = Objects.requireNonNull(mapper); - this.nmmFlags = Objects.requireNonNull(nmmFlags); + this.nmmFlags = nmmFlags; } @@ -142,7 +142,9 @@ private static String formatSize(Integer w, Integer h) { private ObjectNode createImpExt(ExtRequestPrebid prebid) { final ObjectNode impExt = mapper.mapper().createObjectNode(); impExt.set("prebid", mapper.mapper().valueToTree(prebid)); - impExt.set("nextMillennium", mapper.mapper().valueToTree(nmmFlags)); + impExt.set("nextMillennium", CollectionUtils.isNotEmpty(nmmFlags) + ? mapper.mapper().valueToTree(nmmFlags) + : null); return impExt; } From 76487e2ff3db5ee9192ef86751025192f697912a Mon Sep 17 00:00:00 2001 From: markiian Date: Tue, 23 Jan 2024 12:06:18 +0200 Subject: [PATCH 3/3] Update after review --- .../bidder/nextmillennium/NextMillenniumBidder.java | 9 ++++----- .../config/bidder/NextMillenniumConfiguration.java | 9 +++++---- .../bidder/nextmillennium/NextMillenniumBidderTest.java | 3 ++- .../nextmillennium/test-nextmillennium-bid-request.json | 8 +++++--- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 46a26422b11..955ae3bb9d6 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -67,7 +67,6 @@ public final Result>> makeHttpRequests(BidRequest b private List getImpExts(BidRequest bidRequest, List errors) { return bidRequest.getImp().stream() .map(imp -> convertExt(imp, errors)) - .filter(Objects::nonNull) .toList(); } @@ -89,7 +88,6 @@ private ExtImpNextMillennium convertExt(Imp imp, List errors) { } private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) { - final ExtRequestPrebid prebid = ExtRequestPrebid.builder() .storedrequest(ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext))) .build(); @@ -142,9 +140,10 @@ private static String formatSize(Integer w, Integer h) { private ObjectNode createImpExt(ExtRequestPrebid prebid) { final ObjectNode impExt = mapper.mapper().createObjectNode(); impExt.set("prebid", mapper.mapper().valueToTree(prebid)); - impExt.set("nextMillennium", CollectionUtils.isNotEmpty(nmmFlags) - ? mapper.mapper().valueToTree(nmmFlags) - : null); + if (CollectionUtils.isNotEmpty(nmmFlags)) { + impExt.putObject("nextMillennium") + .set("nmmFlags", mapper.mapper().valueToTree(nmmFlags)); + } return impExt; } diff --git a/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java index f39b830122a..320f0a249ec 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java @@ -39,10 +39,11 @@ BidderDeps nextMillenniumBidderDeps(NextMillenniumConfigurationProperties nextMi return BidderDepsAssembler.forBidder(BIDDER_NAME) .withConfig(nextMillenniumConfigurationProperties) .usersyncerCreator(UsersyncerCreator.create(externalUrl)) - .bidderCreator(config -> { - final ExtraInfo extraInfo = config.getExtraInfo(); - return new NextMillenniumBidder(config.getEndpoint(), mapper, extraInfo.getNmmFlags()); - }).assemble(); + .bidderCreator(config -> new NextMillenniumBidder( + config.getEndpoint(), + mapper, + config.getExtraInfo().getNmmFlags()) + ).assemble(); } @Data diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index d2a8b3c55e0..62ac9ae78a5 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -502,7 +502,8 @@ private static ObjectNode createImpExt(List values) { final ObjectNode objectNode = mapper.createObjectNode(); objectNode.set("prebid", mapper.valueToTree(ExtRequestPrebid.builder() .storedrequest(ExtStoredRequest.of("ggroup1;;")).build())); - objectNode.set("nextMillennium", mapper.valueToTree(values)); + objectNode.putObject("nextMillennium") + .set("nmmFlags", mapper.valueToTree(values)); return objectNode; } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 889b35747d7..92191632e7c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -14,9 +14,11 @@ "id": "placement_id" } }, - "nextMillennium": [ - "1" - ] + "nextMillennium": { + "nmmFlags": [ + "1" + ] + } } } ],