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 c026a6c271b..57f5200f786 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -50,7 +50,7 @@ public class NextMillenniumBidder implements Bidder { new TypeReference<>() { }; - private static final String NM_ADAPTER_VERSION = "v1.0.0"; + private static final String NM_ADAPTER_VERSION = "v1.0.1"; private final String endpointUrl; private final JacksonMapper mapper; @@ -101,15 +101,15 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) { } private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium extImp) { - final String soredRequestId = resolveStoredRequestId(bidRequest, extImp); + final String storedRequestId = resolveStoredRequestId(bidRequest, extImp); final ExtRequestPrebidServer extRequestPrebidServer = Optional.ofNullable(bidRequest.getExt()) .map(ExtRequest::getPrebid) .map(ExtRequestPrebid::getServer) .orElse(null); return bidRequest.toBuilder() - .imp(modifyFirstImp(bidRequest.getImp(), soredRequestId)) - .ext(createExtRequest(soredRequestId, extRequestPrebidServer)) + .imp(modifyFirstImp(bidRequest.getImp(), storedRequestId)) + .ext(createExtRequest(storedRequestId, extRequestPrebidServer, extImp)) .build(); } @@ -156,7 +156,7 @@ private List modifyFirstImp(List imps, String storedRequestId) { .build(); final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of( - NextMillenniumExtBidder.of(nmmFlags, null, null)); + NextMillenniumExtBidder.of(nmmFlags)); final ExtRequest extRequest = ExtRequest.of(extRequestPrebid); mapper.fillExtension(extRequest, nextMillenniumExt); @@ -169,14 +169,21 @@ private List modifyFirstImp(List imps, String storedRequestId) { return modifiedImps; } - private ExtRequest createExtRequest(String storedRequestId, ExtRequestPrebidServer extRequestPrebidServer) { + private ExtRequest createExtRequest(String storedRequestId, + ExtRequestPrebidServer extRequestPrebidServer, + ExtImpNextMillennium extImp) { final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder() .storedrequest(ExtStoredRequest.of(storedRequestId)) .server(extRequestPrebidServer) .build(); final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of( - NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); + NextMillenniumExtBidder.of( + nmmFlags, + extImp.getAdSlots(), + extImp.getAllowedAds(), + NM_ADAPTER_VERSION, + versionProvider.getNameVersionRecord())); final ExtRequest extRequest = ExtRequest.of(extRequestPrebid); mapper.fillExtension(extRequest, nextMillenniumExt); diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java index 1673fc5114d..910896950ca 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java @@ -11,7 +11,17 @@ public class NextMillenniumExtBidder { @JsonProperty("nmmFlags") List nmmFlags; + @JsonProperty("adSlots") + List adSlots; + + @JsonProperty("allowedAds") + List allowedAds; + String nmVersion; String serverVersion; + + public static NextMillenniumExtBidder of(List nmmFlags) { + return of(nmmFlags, null, null, null, null); + } } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtImpNextMillennium.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtImpNextMillennium.java index ed67279ea9a..d262fe0bfbe 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtImpNextMillennium.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtImpNextMillennium.java @@ -1,11 +1,20 @@ package org.prebid.server.proto.openrtb.ext.request.nextmillennium; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Value; +import java.util.List; + @Value(staticConstructor = "of") public class ExtImpNextMillennium { String placementId; String groupId; + + @JsonProperty("adSlots") + List adSlots; + + @JsonProperty("allowedAds") + List allowedAds; } diff --git a/src/main/resources/static/bidder-params/nextmillennium.json b/src/main/resources/static/bidder-params/nextmillennium.json index 743d72f89ef..7b03c5087d2 100644 --- a/src/main/resources/static/bidder-params/nextmillennium.json +++ b/src/main/resources/static/bidder-params/nextmillennium.json @@ -13,6 +13,21 @@ "type": "string", "minLength": 1, "description": "An id used to identify NextMillennium placement group" + }, + "adSlots": { + "type": "array", + "minItems": 1, + "description": "IDs which identifies the ad slots", + "items": { + "type": "string" + } + }, + "allowedAds": { + "type": "array", + "description": "List of allowed ads", + "items": { + "type": "string" + } } }, "anyOf": [ 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 71dfe2a8552..84a31090509 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -23,6 +23,8 @@ import org.prebid.server.bidder.model.HttpRequest; import org.prebid.server.bidder.model.HttpResponse; import org.prebid.server.bidder.model.Result; +import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExt; +import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExtBidder; import org.prebid.server.proto.openrtb.ext.ExtPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; @@ -78,8 +80,8 @@ public void makeHttpRequestsShouldUseBidRequestIdForAllRequests() { // given final BidRequest bidRequest = givenBidRequest( request -> request.id("id"), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null)), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null))); + givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null)), + givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -97,8 +99,8 @@ public void makeHttpRequestsShouldUseBidRequestTestForAllRequests() { // given final BidRequest bidRequest = givenBidRequest( request -> request.test(1), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null)), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null))); + givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null)), + givenImpWithExt(identity(), ExtImpNextMillennium.of(null, null, null, null))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -116,8 +118,8 @@ public void makeHttpRequestsShouldUseImpExtBidderPlacementIdForStoredRequestId() // given final BidRequest bidRequest = givenBidRequest( identity(), - givenImpWithExt(identity(), ExtImpNextMillennium.of("placement1", null)), - givenImpWithExt(identity(), ExtImpNextMillennium.of("placement2", null))); + givenImpWithExt(identity(), givenExtImpWithPlacementId("placement1")), + givenImpWithExt(identity(), givenExtImpWithPlacementId("placement2"))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -138,8 +140,8 @@ public void makeHttpRequestsShouldUseImpExtBidderGroupIdForStoredRequestId() { // given final BidRequest bidRequest = givenBidRequest( identity(), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group1")), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group2"))); + givenImpWithExt(identity(), givenExtImpWithGroupId("group1")), + givenImpWithExt(identity(), givenExtImpWithGroupId("group2"))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -168,10 +170,10 @@ public void makeHttpRequestsShouldUseFirstImpBannerFirstFormatForStoredRequestId .w(5) .h(6) .build()), - ExtImpNextMillennium.of(null, "group1")), + givenExtImpWithGroupId("group1")), givenImpWithExt( imp -> imp.banner(Banner.builder().w(7).h(8).build()), - ExtImpNextMillennium.of(null, "group2"))); + givenExtImpWithGroupId("group2"))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -187,6 +189,48 @@ public void makeHttpRequestsShouldUseFirstImpBannerFirstFormatForStoredRequestId .containsExactly("ggroup1;1x2;", "ggroup2;1x2;"); } + @Test + public void makeHttpRequestsShouldIncludeAdSlotsAndAllowedAdsOnlyInRequestExt() { + // given + final List adSlots = List.of("slot1", "slot2"); + final List allowedAds = List.of("ad1", "ad2"); + + final ExtImpNextMillennium extImp = ExtImpNextMillennium.of("placement123", null, adSlots, allowedAds); + + final BidRequest bidRequest = givenBidRequest( + identity(), + givenImpWithExt(identity(), extImp)); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).hasSize(1); + + final BidRequest actualRequest = result.getValue().getFirst().getPayload(); + + final NextMillenniumExtBidder requestExt = jacksonMapper.mapper() + .convertValue( + jacksonMapper.mapper().convertValue(actualRequest + .getExt(), NextMillenniumExt.class).getNextMillennium(), + NextMillenniumExtBidder.class); + + final NextMillenniumExtBidder impExt = jacksonMapper.mapper() + .convertValue( + jacksonMapper.mapper().convertValue(actualRequest + .getImp().getFirst().getExt(), NextMillenniumExt.class).getNextMillennium(), + NextMillenniumExtBidder.class); + + assertThat(requestExt) + .extracting(NextMillenniumExtBidder::getAdSlots, NextMillenniumExtBidder::getAllowedAds) + .containsExactly(adSlots, allowedAds); + + assertThat(impExt.getAdSlots()).isNull(); + assertThat(impExt.getAllowedAds()).isNull(); + assertThat(impExt.getNmmFlags()).containsExactly("valueOne", "valueTwo"); + } + @Test public void makeHttpRequestsShouldUseFirstImpBannerSizeForStoredRequestIds() { // given @@ -194,12 +238,12 @@ public void makeHttpRequestsShouldUseFirstImpBannerSizeForStoredRequestIds() { identity(), givenImpWithExt( imp -> imp.banner(Banner.builder().w(7).h(8).build()), - ExtImpNextMillennium.of(null, "group1")), + givenExtImpWithGroupId("group1")), givenImpWithExt( imp -> imp.banner(Banner.builder() .format(singletonList(Format.builder().w(1).h(2).build())) .build()), - ExtImpNextMillennium.of(null, "group2"))); + givenExtImpWithGroupId("group2"))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -220,8 +264,8 @@ public void makeHttpRequestsShouldUseAppDomainForStoredRequestId() { // given final BidRequest bidRequest = givenBidRequest( request -> request.app(App.builder().domain("appDomain").build()), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group1")), - givenImpWithExt(identity(), ExtImpNextMillennium.of(null, "group2"))); + givenImpWithExt(identity(), givenExtImpWithGroupId("group1")), + givenImpWithExt(identity(), givenExtImpWithGroupId("group2"))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -242,8 +286,8 @@ public void makeHttpRequestsShouldUseSiteDomainForStoredRequestId() { // given final BidRequest bidRequest = givenBidRequest( request -> request.site(Site.builder().domain("siteDomain").build()), - givenImpWithExt(identity(), ExtImpNextMillennium.of("placement1", "group1")), - givenImpWithExt(identity(), ExtImpNextMillennium.of("placement2", "group2"))); + givenImpWithExt(identity(), givenExtImpWithPlacementIdAndGroupId("placement1", "group1")), + givenImpWithExt(identity(), givenExtImpWithPlacementIdAndGroupId("placement2", "group2"))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -294,7 +338,7 @@ public void makeHttpRequestsImpExtComparison() { .h(90) .build())) .build()), - ExtImpNextMillennium.of(placementId, null)); + ExtImpNextMillennium.of(placementId, null, null, null)); final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder() .schains(emptyList()) @@ -346,7 +390,7 @@ public void makeHttpRequestsImpShouldBeIdenticalExceptExt() { .tagid("custom_imp_tagid") .secure(1) .banner(banner), - ExtImpNextMillennium.of(placementId, null)); + ExtImpNextMillennium.of(placementId, null, null, null)); final BidRequest bidRequest = givenBidRequest(b -> b .id("c868fd0b-960c-4f49-a8d6-2b3e938b41f2") @@ -386,7 +430,7 @@ public void makeHttpRequestsBidRequestShouldBeIdenticalExceptImpExt() { .tagid("custom_imp_tagid") .secure(1) .banner(banner), - ExtImpNextMillennium.of(placementId, null)); + ExtImpNextMillennium.of(placementId, null, null, null)); final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder() .schains(emptyList()) @@ -432,7 +476,7 @@ public void makeHttpRequestsShouldPreserveExtPrebidServer() { .id("test-request") .imp(singletonList(givenImpWithExt( imp -> imp.banner(Banner.builder().w(300).h(250).build()), - ExtImpNextMillennium.of("placement_id", null)))) + ExtImpNextMillennium.of("placement_id", null, null, null)))) .ext(extRequest) .build(); @@ -603,4 +647,16 @@ private static Imp givenImpWithExt(UnaryOperator impCustomizer, return givenImp(impCustomizer.andThen(imp -> imp.ext(mapper.valueToTree( ExtPrebid.of(null, extImpNextMillennium))))::apply); } + + private static ExtImpNextMillennium givenExtImpWithGroupId(String groupId) { + return ExtImpNextMillennium.of(null, groupId, null, null); + } + + private static ExtImpNextMillennium givenExtImpWithPlacementId(String placementId) { + return ExtImpNextMillennium.of(placementId, null, null, null); + } + + private static ExtImpNextMillennium givenExtImpWithPlacementIdAndGroupId(String placementId, String groupId) { + return ExtImpNextMillennium.of(placementId, groupId, null, null); + } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-request.json index 8309481141e..989d0611c29 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-request.json @@ -9,7 +9,9 @@ }, "ext": { "nextmillennium" : { - "placement_id": "placement_id" + "placement_id": "placement_id", + "adSlots": ["slot-1", "slot-2"], + "allowedAds": ["banner", "native"] } } } 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 6802911a251..31715c6975d 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 @@ -61,7 +61,9 @@ }, "nextMillennium": { "nmmFlags": [ "1" ], - "nm_version": "v1.0.0", + "adSlots": ["slot-1", "slot-2"], + "allowedAds": ["banner", "native"], + "nm_version": "v1.0.1", "server_version": "${json-unit.any-string}" } }