From 26f4f7cb169de5990448b52b4f5ae639b7a6ba9d Mon Sep 17 00:00:00 2001 From: osulzhenko <125548596+osulzhenko@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:59:03 +0200 Subject: [PATCH 1/5] Optidigital adapter: Add GPP support (#4333) --- src/main/resources/bidder-config/optidigital.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/bidder-config/optidigital.yaml b/src/main/resources/bidder-config/optidigital.yaml index 9e48244221b..756e0d71b2e 100644 --- a/src/main/resources/bidder-config/optidigital.yaml +++ b/src/main/resources/bidder-config/optidigital.yaml @@ -17,6 +17,6 @@ adapters: usersync: cookie-family-name: optidigital iframe: - url: https://scripts.opti-digital.com/js/presyncs2s.html?endpoint=optidigital&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&redir={{redirect_url}} + url: https://scripts.opti-digital.com/js/presyncs2s.html?endpoint=optidigital&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&gpp={{gpp}}&gpp_sid={{gpp_sid}}&redir={{redirect_url}} support-cors: false uid-macro: '$UID' From 9d6dfb9bfbf0f34d22d69bf2b2cc13db95e018a8 Mon Sep 17 00:00:00 2001 From: przemkaczmarek <167743744+przemkaczmarek@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:02:47 +0100 Subject: [PATCH 2/5] Adagio: Enable site capability (#4320) --- src/main/resources/static/bidder-params/adagio.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/static/bidder-params/adagio.json b/src/main/resources/static/bidder-params/adagio.json index d0cbf17d8fc..af6a6bc4465 100644 --- a/src/main/resources/static/bidder-params/adagio.json +++ b/src/main/resources/static/bidder-params/adagio.json @@ -10,7 +10,7 @@ }, "placement": { "type": "string", - "description": "Refers to the placement of an adunit in a page. Must not contain any information about the type of device." + "description": "Refers to the placement of an adunit in a page. See Adagio recommended values: https://prebid.org/dev-docs/bidders/adagio.html#recommended-placement-param-values." }, "site": { "type": "string", From 7ff2b106c783e4b4ff5c0a7e629a1b3c8657e2ff Mon Sep 17 00:00:00 2001 From: przemkaczmarek <167743744+przemkaczmarek@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:02:55 +0100 Subject: [PATCH 3/5] Adagio: Remove hardcoded seat name (#4319) --- .../java/org/prebid/server/bidder/adagio/AdagioBidder.java | 5 ++--- .../org/prebid/server/bidder/adagio/AdagioBidderTest.java | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/adagio/AdagioBidder.java b/src/main/java/org/prebid/server/bidder/adagio/AdagioBidder.java index 460d6ac2e4e..a211f6267b4 100644 --- a/src/main/java/org/prebid/server/bidder/adagio/AdagioBidder.java +++ b/src/main/java/org/prebid/server/bidder/adagio/AdagioBidder.java @@ -59,12 +59,12 @@ private List extractBids(BidResponse bidResponse, List e .filter(Objects::nonNull) .flatMap(seatBid -> seatBid.getBid().stream() .filter(Objects::nonNull) - .map(bid -> makeBid(bid, bidResponse.getCur(), seatBid.getSeat(), errors))) + .map(bid -> makeBid(bid, bidResponse.getCur(), errors))) .filter(Objects::nonNull) .toList(); } - private BidderBid makeBid(Bid bid, String currency, String seat, List errors) { + private BidderBid makeBid(Bid bid, String currency, List errors) { try { final ExtBidPrebid extBidPrebid = parseBidExt(bid); return BidderBid.builder() @@ -72,7 +72,6 @@ private BidderBid makeBid(Bid bid, String currency, String seat, List Date: Mon, 12 Jan 2026 14:15:34 +0100 Subject: [PATCH 4/5] New adapter: Rename adoppler bidder adapter to elementaltv add adoppler as alias (#4326) --- .../model/AdopplerResponseAdsExt.java | 9 ---- .../adoppler/model/AdopplerResponseExt.java | 9 ---- .../model/AdopplerResponseVideoAdsExt.java | 9 ---- .../ElementalTVBidder.java} | 50 ++++++++----------- .../model/ElementalTVResponseAdsExt.java | 9 ++++ .../model/ElementalTVResponseExt.java | 9 ++++ .../model/ElementalTVResponseVideoAdsExt.java | 9 ++++ .../ext/request/adoppler/ExtImpAdoppler.java | 10 ---- .../elementaltv/ExtImpElementalTV.java | 9 ++++ ...ion.java => ElementalTVConfiguration.java} | 22 ++++---- .../resources/bidder-config/adoppler.yaml | 13 ----- .../resources/bidder-config/elementaltv.yaml | 18 +++++++ .../{adoppler.json => elementaltv.json} | 8 +-- .../ElementalTVBidderTest.java} | 30 +++++------ ...AdopplerTest.java => ElementalTVTest.java} | 17 ++++--- .../test-auction-elementaltv-request.json} | 5 +- .../test-auction-elementaltv-response.json} | 6 +-- .../test-elementaltv-bid-request-1.json} | 7 +-- .../test-elementaltv-bid-response-1.json} | 0 .../server/it/test-application.properties | 4 +- 20 files changed, 121 insertions(+), 132 deletions(-) delete mode 100644 src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseAdsExt.java delete mode 100644 src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseExt.java delete mode 100644 src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseVideoAdsExt.java rename src/main/java/org/prebid/server/bidder/{adoppler/AdopplerBidder.java => elementaltv/ElementalTVBidder.java} (77%) create mode 100644 src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseAdsExt.java create mode 100644 src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseExt.java create mode 100644 src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseVideoAdsExt.java delete mode 100644 src/main/java/org/prebid/server/proto/openrtb/ext/request/adoppler/ExtImpAdoppler.java create mode 100644 src/main/java/org/prebid/server/proto/openrtb/ext/request/elementaltv/ExtImpElementalTV.java rename src/main/java/org/prebid/server/spring/config/bidder/{AdopplerConfiguration.java => ElementalTVConfiguration.java} (58%) delete mode 100644 src/main/resources/bidder-config/adoppler.yaml create mode 100644 src/main/resources/bidder-config/elementaltv.yaml rename src/main/resources/static/bidder-params/{adoppler.json => elementaltv.json} (66%) rename src/test/java/org/prebid/server/bidder/{adoppler/AdopplerBidderTest.java => elementaltv/ElementalTVBidderTest.java} (87%) rename src/test/java/org/prebid/server/it/{AdopplerTest.java => ElementalTVTest.java} (51%) rename src/test/resources/org/prebid/server/it/openrtb2/{adoppler/test-auction-adoppler-request.json => elementaltv/test-auction-elementaltv-request.json} (73%) rename src/test/resources/org/prebid/server/it/openrtb2/{adoppler/test-auction-adoppler-response.json => elementaltv/test-auction-elementaltv-response.json} (86%) rename src/test/resources/org/prebid/server/it/openrtb2/{adoppler/test-adoppler-bid-request-1.json => elementaltv/test-elementaltv-bid-request-1.json} (89%) rename src/test/resources/org/prebid/server/it/openrtb2/{adoppler/test-adoppler-bid-response-1.json => elementaltv/test-elementaltv-bid-response-1.json} (100%) diff --git a/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseAdsExt.java b/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseAdsExt.java deleted file mode 100644 index d773617f068..00000000000 --- a/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseAdsExt.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.prebid.server.bidder.adoppler.model; - -import lombok.Value; - -@Value(staticConstructor = "of") -public class AdopplerResponseAdsExt { - - AdopplerResponseVideoAdsExt video; -} diff --git a/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseExt.java b/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseExt.java deleted file mode 100644 index 090ad5faaed..00000000000 --- a/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseExt.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.prebid.server.bidder.adoppler.model; - -import lombok.Value; - -@Value(staticConstructor = "of") -public class AdopplerResponseExt { - - AdopplerResponseAdsExt ads; -} diff --git a/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseVideoAdsExt.java b/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseVideoAdsExt.java deleted file mode 100644 index db64e1447e4..00000000000 --- a/src/main/java/org/prebid/server/bidder/adoppler/model/AdopplerResponseVideoAdsExt.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.prebid.server.bidder.adoppler.model; - -import lombok.Value; - -@Value(staticConstructor = "of") -public class AdopplerResponseVideoAdsExt { - - Integer duration; -} diff --git a/src/main/java/org/prebid/server/bidder/adoppler/AdopplerBidder.java b/src/main/java/org/prebid/server/bidder/elementaltv/ElementalTVBidder.java similarity index 77% rename from src/main/java/org/prebid/server/bidder/adoppler/AdopplerBidder.java rename to src/main/java/org/prebid/server/bidder/elementaltv/ElementalTVBidder.java index 761a2e21bc4..17cd2950b7a 100644 --- a/src/main/java/org/prebid/server/bidder/adoppler/AdopplerBidder.java +++ b/src/main/java/org/prebid/server/bidder/elementaltv/ElementalTVBidder.java @@ -1,4 +1,4 @@ -package org.prebid.server.bidder.adoppler; +package org.prebid.server.bidder.elementaltv; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -12,9 +12,9 @@ import io.vertx.core.http.HttpMethod; import org.apache.commons.lang3.StringUtils; import org.prebid.server.bidder.Bidder; -import org.prebid.server.bidder.adoppler.model.AdopplerResponseAdsExt; -import org.prebid.server.bidder.adoppler.model.AdopplerResponseExt; -import org.prebid.server.bidder.adoppler.model.AdopplerResponseVideoAdsExt; +import org.prebid.server.bidder.elementaltv.model.ElementalTVResponseAdsExt; +import org.prebid.server.bidder.elementaltv.model.ElementalTVResponseExt; +import org.prebid.server.bidder.elementaltv.model.ElementalTVResponseVideoAdsExt; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; import org.prebid.server.bidder.model.BidderError; @@ -24,7 +24,7 @@ import org.prebid.server.json.DecodeException; import org.prebid.server.json.JacksonMapper; import org.prebid.server.proto.openrtb.ext.ExtPrebid; -import org.prebid.server.proto.openrtb.ext.request.adoppler.ExtImpAdoppler; +import org.prebid.server.proto.openrtb.ext.request.elementaltv.ExtImpElementalTV; import org.prebid.server.proto.openrtb.ext.response.BidType; import org.prebid.server.util.HttpUtil; @@ -36,17 +36,16 @@ import java.util.Map; import java.util.Objects; -public class AdopplerBidder implements Bidder { +public class ElementalTVBidder implements Bidder { - private static final TypeReference> ADOPPLER_EXT_TYPE_REFERENCE = + private static final TypeReference> ELEMENTALTV_EXT_TYPE_REFERENCE = new TypeReference<>() { }; - private static final String DEFAULT_CLIENT = "app"; private final String endpointTemplate; private final JacksonMapper mapper; - public AdopplerBidder(String endpointTemplate, JacksonMapper mapper) { + public ElementalTVBidder(String endpointTemplate, JacksonMapper mapper) { this.endpointTemplate = HttpUtil.validateUrl(Objects.requireNonNull(endpointTemplate)); this.mapper = Objects.requireNonNull(mapper); } @@ -58,7 +57,7 @@ public Result>> makeHttpRequests(BidRequest request for (Imp imp : request.getImp()) { try { - final ExtImpAdoppler validExtImp = parseAndValidateImpExt(imp); + final ExtImpElementalTV validExtImp = parseAndValidateImpExt(imp); final String updateRequestId = request.getId() + "-" + validExtImp.getAdunit(); final BidRequest updateRequest = request.toBuilder().id(updateRequestId).build(); final String url = resolveUrl(validExtImp); @@ -71,29 +70,22 @@ public Result>> makeHttpRequests(BidRequest request return Result.of(result, errors); } - private ExtImpAdoppler parseAndValidateImpExt(Imp imp) { - final ExtImpAdoppler extImpAdoppler; + private ExtImpElementalTV parseAndValidateImpExt(Imp imp) { + final ExtImpElementalTV extImpElementalTV; try { - extImpAdoppler = mapper.mapper().convertValue(imp.getExt(), ADOPPLER_EXT_TYPE_REFERENCE).getBidder(); + extImpElementalTV = mapper.mapper().convertValue(imp.getExt(), ELEMENTALTV_EXT_TYPE_REFERENCE).getBidder(); } catch (IllegalArgumentException e) { throw new PreBidException(e.getMessage()); } - if (StringUtils.isBlank(extImpAdoppler.getAdunit())) { - throw new PreBidException("adunit parameter is required for adoppler bidder"); + if (StringUtils.isBlank(extImpElementalTV.getAdunit())) { + throw new PreBidException("adunit parameter is required for elementaltv bidder"); } - return extImpAdoppler; + return extImpElementalTV; } - private String resolveUrl(ExtImpAdoppler extImp) { - final String client = extImp.getClient(); - + private String resolveUrl(ExtImpElementalTV extImp) { try { - final String accountIdMacro = StringUtils.isBlank(client) - ? DEFAULT_CLIENT - : HttpUtil.encodeUrl(client); - return endpointTemplate - .replace("{{AccountID}}", accountIdMacro) .replace("{{AdUnit}}", HttpUtil.encodeUrl(extImp.getAdunit())); } catch (Exception e) { throw new PreBidException(e.getMessage()); @@ -171,17 +163,17 @@ private BidderBid createBid(Bid bid, Map impTypes, String curre private void validateVideoBidExt(Bid bid) { final ObjectNode extNode = bid.getExt(); - final AdopplerResponseExt ext = extNode != null ? parseResponseExt(extNode) : null; - final AdopplerResponseAdsExt adsExt = ext != null ? ext.getAds() : null; - final AdopplerResponseVideoAdsExt videoAdsExt = adsExt != null ? adsExt.getVideo() : null; + final ElementalTVResponseExt ext = extNode != null ? parseResponseExt(extNode) : null; + final ElementalTVResponseAdsExt adsExt = ext != null ? ext.getAds() : null; + final ElementalTVResponseVideoAdsExt videoAdsExt = adsExt != null ? adsExt.getVideo() : null; if (videoAdsExt == null) { throw new PreBidException("$.seatbid.bid.ext.ads.video required"); } } - private AdopplerResponseExt parseResponseExt(ObjectNode ext) { + private ElementalTVResponseExt parseResponseExt(ObjectNode ext) { try { - return mapper.mapper().treeToValue(ext, AdopplerResponseExt.class); + return mapper.mapper().treeToValue(ext, ElementalTVResponseExt.class); } catch (JsonProcessingException e) { throw new PreBidException(e.getMessage(), e); } diff --git a/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseAdsExt.java b/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseAdsExt.java new file mode 100644 index 00000000000..1a23b70eaa9 --- /dev/null +++ b/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseAdsExt.java @@ -0,0 +1,9 @@ +package org.prebid.server.bidder.elementaltv.model; + +import lombok.Value; + +@Value(staticConstructor = "of") +public class ElementalTVResponseAdsExt { + + ElementalTVResponseVideoAdsExt video; +} diff --git a/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseExt.java b/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseExt.java new file mode 100644 index 00000000000..935d32e01b6 --- /dev/null +++ b/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseExt.java @@ -0,0 +1,9 @@ +package org.prebid.server.bidder.elementaltv.model; + +import lombok.Value; + +@Value(staticConstructor = "of") +public class ElementalTVResponseExt { + + ElementalTVResponseAdsExt ads; +} diff --git a/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseVideoAdsExt.java b/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseVideoAdsExt.java new file mode 100644 index 00000000000..76e3457b453 --- /dev/null +++ b/src/main/java/org/prebid/server/bidder/elementaltv/model/ElementalTVResponseVideoAdsExt.java @@ -0,0 +1,9 @@ +package org.prebid.server.bidder.elementaltv.model; + +import lombok.Value; + +@Value(staticConstructor = "of") +public class ElementalTVResponseVideoAdsExt { + + Integer duration; +} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/adoppler/ExtImpAdoppler.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/adoppler/ExtImpAdoppler.java deleted file mode 100644 index a727c59b34b..00000000000 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/adoppler/ExtImpAdoppler.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.prebid.server.proto.openrtb.ext.request.adoppler; - -import lombok.Value; - -@Value(staticConstructor = "of") -public class ExtImpAdoppler { - - String adunit; - String client; -} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/elementaltv/ExtImpElementalTV.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/elementaltv/ExtImpElementalTV.java new file mode 100644 index 00000000000..bdd594996b4 --- /dev/null +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/elementaltv/ExtImpElementalTV.java @@ -0,0 +1,9 @@ +package org.prebid.server.proto.openrtb.ext.request.elementaltv; + +import lombok.Value; + +@Value(staticConstructor = "of") +public class ExtImpElementalTV { + + String adunit; +} diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AdopplerConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/ElementalTVConfiguration.java similarity index 58% rename from src/main/java/org/prebid/server/spring/config/bidder/AdopplerConfiguration.java rename to src/main/java/org/prebid/server/spring/config/bidder/ElementalTVConfiguration.java index 89163bceeab..8cece283dd5 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/AdopplerConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/ElementalTVConfiguration.java @@ -1,7 +1,7 @@ package org.prebid.server.spring.config.bidder; import org.prebid.server.bidder.BidderDeps; -import org.prebid.server.bidder.adoppler.AdopplerBidder; +import org.prebid.server.bidder.elementaltv.ElementalTVBidder; import org.prebid.server.json.JacksonMapper; import org.prebid.server.spring.config.bidder.model.BidderConfigurationProperties; import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler; @@ -16,26 +16,26 @@ import jakarta.validation.constraints.NotBlank; @Configuration -@PropertySource(value = "classpath:/bidder-config/adoppler.yaml", factory = YamlPropertySourceFactory.class) -public class AdopplerConfiguration { +@PropertySource(value = "classpath:/bidder-config/elementaltv.yaml", factory = YamlPropertySourceFactory.class) +public class ElementalTVConfiguration { - private static final String BIDDER_NAME = "adoppler"; + private static final String BIDDER_NAME = "elementaltv"; - @Bean("adopplerConfigurationProperties") - @ConfigurationProperties("adapters.adoppler") + @Bean("elementalTVConfigurationProperties") + @ConfigurationProperties("adapters.elementaltv") BidderConfigurationProperties configurationProperties() { return new BidderConfigurationProperties(); } @Bean - BidderDeps adopplerBidderDeps(BidderConfigurationProperties adopplerConfigurationProperties, - @NotBlank @Value("${external-url}") String externalUrl, - JacksonMapper mapper) { + BidderDeps elementaltvBidderDeps(BidderConfigurationProperties elementalTVConfigurationProperties, + @NotBlank @Value("${external-url}") String externalUrl, + JacksonMapper mapper) { return BidderDepsAssembler.forBidder(BIDDER_NAME) - .withConfig(adopplerConfigurationProperties) + .withConfig(elementalTVConfigurationProperties) .usersyncerCreator(UsersyncerCreator.create(externalUrl)) - .bidderCreator(config -> new AdopplerBidder(config.getEndpoint(), mapper)) + .bidderCreator(config -> new ElementalTVBidder(config.getEndpoint(), mapper)) .assemble(); } } diff --git a/src/main/resources/bidder-config/adoppler.yaml b/src/main/resources/bidder-config/adoppler.yaml deleted file mode 100644 index 1f66b131d83..00000000000 --- a/src/main/resources/bidder-config/adoppler.yaml +++ /dev/null @@ -1,13 +0,0 @@ -adapters: - adoppler: - endpoint: http://{{AccountID}}.trustedmarketplace.io/ads/processHeaderBid/{{AdUnit}} - meta-info: - maintainer-email: info@adoppler.com - app-media-types: - - banner - - video - site-media-types: - - banner - - video - supported-vendors: - vendor-id: 0 diff --git a/src/main/resources/bidder-config/elementaltv.yaml b/src/main/resources/bidder-config/elementaltv.yaml new file mode 100644 index 00000000000..198b887ea4b --- /dev/null +++ b/src/main/resources/bidder-config/elementaltv.yaml @@ -0,0 +1,18 @@ +adapters: + elementaltv: + endpoint: https://pbs.elementaltv.io/ads/processHeaderBid/{{AdUnit}} + ortb-version: "2.6" + aliases: + adoppler: ~ + meta-info: + maintainer-email: support@elementaltv.com + app-media-types: + - banner + - video + - native + site-media-types: + - banner + - video + - native + supported-vendors: + vendor-id: 0 diff --git a/src/main/resources/static/bidder-params/adoppler.json b/src/main/resources/static/bidder-params/elementaltv.json similarity index 66% rename from src/main/resources/static/bidder-params/adoppler.json rename to src/main/resources/static/bidder-params/elementaltv.json index eaa4e6df80e..f80e6c4f0d7 100644 --- a/src/main/resources/static/bidder-params/adoppler.json +++ b/src/main/resources/static/bidder-params/elementaltv.json @@ -1,16 +1,12 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Adoppler Adapter Params", - "description": "A schema which validates params accepted by the Adoppler adapter", + "title": "ElementalTV Adapter Params", + "description": "A schema which validates params accepted by the ElementalTV adapter", "type": "object", "properties": { "adunit": { "type": "string", "description": "AdUnit to bid against to." - }, - "client": { - "type": "string", - "description": "Client name." } }, "required": ["adunit"] diff --git a/src/test/java/org/prebid/server/bidder/adoppler/AdopplerBidderTest.java b/src/test/java/org/prebid/server/bidder/elementaltv/ElementalTVBidderTest.java similarity index 87% rename from src/test/java/org/prebid/server/bidder/adoppler/AdopplerBidderTest.java rename to src/test/java/org/prebid/server/bidder/elementaltv/ElementalTVBidderTest.java index 2004ce97118..b06bf5f4fd5 100644 --- a/src/test/java/org/prebid/server/bidder/adoppler/AdopplerBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/elementaltv/ElementalTVBidderTest.java @@ -1,4 +1,4 @@ -package org.prebid.server.bidder.adoppler; +package org.prebid.server.bidder.elementaltv; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -12,8 +12,8 @@ import io.netty.handler.codec.http.HttpHeaderValues; import org.junit.jupiter.api.Test; import org.prebid.server.VertxTest; -import org.prebid.server.bidder.adoppler.model.AdopplerResponseAdsExt; -import org.prebid.server.bidder.adoppler.model.AdopplerResponseExt; +import org.prebid.server.bidder.elementaltv.model.ElementalTVResponseAdsExt; +import org.prebid.server.bidder.elementaltv.model.ElementalTVResponseExt; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; import org.prebid.server.bidder.model.BidderError; @@ -21,7 +21,7 @@ import org.prebid.server.bidder.model.HttpResponse; import org.prebid.server.bidder.model.Result; import org.prebid.server.proto.openrtb.ext.ExtPrebid; -import org.prebid.server.proto.openrtb.ext.request.adoppler.ExtImpAdoppler; +import org.prebid.server.proto.openrtb.ext.request.elementaltv.ExtImpElementalTV; import org.prebid.server.util.HttpUtil; import java.util.Collections; @@ -35,15 +35,15 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.tuple; -public class AdopplerBidderTest extends VertxTest { +public class ElementalTVBidderTest extends VertxTest { - private static final String ENDPOINT_URL = "http://{{AccountID}}.test.com/some/path/{{AdUnit}}"; + private static final String ENDPOINT_URL = "https://pbs.test.com/some/path/{{AdUnit}}"; - private final AdopplerBidder target = new AdopplerBidder(ENDPOINT_URL, jacksonMapper); + private final ElementalTVBidder target = new ElementalTVBidder(ENDPOINT_URL, jacksonMapper); @Test public void creationShouldFailOnInvalidEndpointUrl() { - assertThatIllegalArgumentException().isThrownBy(() -> new AdopplerBidder("invalid_url", jacksonMapper)); + assertThatIllegalArgumentException().isThrownBy(() -> new ElementalTVBidder("invalid_url", jacksonMapper)); } @Test @@ -51,13 +51,13 @@ public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() { // given final BidRequest bidRequest = givenBidRequest( impBuilder -> impBuilder - .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpAdoppler.of(null, null))))); + .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpElementalTV.of(null))))); // when final Result>> result = target.makeHttpRequests(bidRequest); // then assertThat(result.getErrors()) - .containsExactly(BidderError.badInput("adunit parameter is required for adoppler bidder")); + .containsExactly(BidderError.badInput("adunit parameter is required for elementaltv bidder")); } @Test @@ -71,7 +71,7 @@ public void makeHttpRequestsShouldCreateCorrectURL() { // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()).hasSize(1); - assertThat(result.getValue().getFirst().getUri()).isEqualTo("http://clientId.test.com/some/path/adUnit"); + assertThat(result.getValue().getFirst().getUri()).isEqualTo("https://pbs.test.com/some/path/adUnit"); } @Test @@ -79,7 +79,7 @@ public void makeHttpRequestsShouldCreateUrlWithDefaultAppParamIfClientIsMissing( // given final BidRequest bidRequest = givenBidRequest( impBuilder -> impBuilder - .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpAdoppler.of("adUnit", ""))))); + .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpElementalTV.of("adUnit"))))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -87,7 +87,7 @@ public void makeHttpRequestsShouldCreateUrlWithDefaultAppParamIfClientIsMissing( // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()).hasSize(1); - assertThat(result.getValue().getFirst().getUri()).isEqualTo("http://app.test.com/some/path/adUnit"); + assertThat(result.getValue().getFirst().getUri()).isEqualTo("https://pbs.test.com/some/path/adUnit"); } @Test @@ -133,7 +133,7 @@ public void makeBidsShouldReturnErrorIfExtEmpty() throws JsonProcessingException // given final Imp imp = Imp.builder().id("impId").video(Video.builder().build()).build(); final BidRequest bidRequest = BidRequest.builder().imp(Collections.singletonList(imp)).build(); - final ObjectNode ext = mapper.valueToTree(AdopplerResponseExt.of(AdopplerResponseAdsExt.of(null))); + final ObjectNode ext = mapper.valueToTree(ElementalTVResponseExt.of(ElementalTVResponseAdsExt.of(null))); final BidderCall httpCall = givenHttpCall(bidRequest, mapper.writeValueAsString( givenBidResponse(bidBuilder -> bidBuilder .id("321") @@ -166,7 +166,7 @@ private static Imp givenImp(Function impCustomiz return impCustomizer.apply(Imp.builder() .id("123") .banner(Banner.builder().id("banner_id").build()) - .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpAdoppler.of("adUnit", "clientId"))))) + .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpElementalTV.of("adUnit"))))) .build(); } diff --git a/src/test/java/org/prebid/server/it/AdopplerTest.java b/src/test/java/org/prebid/server/it/ElementalTVTest.java similarity index 51% rename from src/test/java/org/prebid/server/it/AdopplerTest.java rename to src/test/java/org/prebid/server/it/ElementalTVTest.java index 6e3e9960502..106a800edb4 100644 --- a/src/test/java/org/prebid/server/it/AdopplerTest.java +++ b/src/test/java/org/prebid/server/it/ElementalTVTest.java @@ -13,21 +13,22 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; import static java.util.Collections.singletonList; -public class AdopplerTest extends IntegrationTest { +public class ElementalTVTest extends IntegrationTest { @Test - public void openrtb2AuctionShouldRespondWithBidsFromAdoppler() throws IOException, JSONException { + public void openrtb2AuctionShouldRespondWithBidsFromElementalTV() throws IOException, JSONException { // given - WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/adoppler-exchange")) - .withRequestBody(equalToJson(jsonFrom("openrtb2/adoppler/test-adoppler-bid-request-1.json"))) - .willReturn(aResponse().withBody(jsonFrom("openrtb2/adoppler/test-adoppler-bid-response-1.json")))); + WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/elementaltv-exchange")) + .withRequestBody(equalToJson(jsonFrom("openrtb2/elementaltv/test-elementaltv-bid-request-1.json"))) + .willReturn(aResponse() + .withBody(jsonFrom("openrtb2/elementaltv/test-elementaltv-bid-response-1.json")))); // when - final Response response = responseFor("openrtb2/adoppler/test-auction-adoppler-request.json", + final Response response = responseFor("openrtb2/elementaltv/test-auction-elementaltv-request.json", Endpoint.openrtb2_auction); // then - assertJsonEquals("openrtb2/adoppler/test-auction-adoppler-response.json", response, - singletonList("adoppler")); + assertJsonEquals("openrtb2/elementaltv/test-auction-elementaltv-response.json", response, + singletonList("elementaltv")); } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-request.json b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-auction-elementaltv-request.json similarity index 73% rename from src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-request.json rename to src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-auction-elementaltv-request.json index 671adea62e9..c9c065751d4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-auction-elementaltv-request.json @@ -8,9 +8,8 @@ "h": 200 }, "ext": { - "adoppler": { - "adunit": "adunit", - "client": "testClient" + "elementaltv": { + "adunit": "adunit" } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-auction-elementaltv-response.json similarity index 86% rename from src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json rename to src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-auction-elementaltv-response.json index cbfeaa10b25..5045d4c4a02 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-auction-elementaltv-response.json @@ -20,7 +20,7 @@ "prebid": { "type": "banner", "meta": { - "adaptercode": "adoppler" + "adaptercode": "elementaltv" } }, "origbidcpm": 3.33, @@ -32,14 +32,14 @@ } } ], - "seat": "adoppler", + "seat": "elementaltv", "group": 0 } ], "cur": "USD", "ext": { "responsetimemillis": { - "adoppler": "{{ adoppler.response_time_ms }}" + "elementaltv": "{{ elementaltv.response_time_ms }}" }, "prebid": { "auctiontimestamp": 0 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-adoppler-bid-request-1.json b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-elementaltv-bid-request-1.json similarity index 89% rename from src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-adoppler-bid-request-1.json rename to src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-elementaltv-bid-request-1.json index 85ca49d2c95..c21c21f4f2f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-adoppler-bid-request-1.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-elementaltv-bid-request-1.json @@ -11,8 +11,7 @@ "ext": { "tid": "${json-unit.any-string}", "bidder": { - "adunit": "adunit", - "client": "testClient" + "adunit": "adunit" } } } @@ -40,9 +39,7 @@ "USD" ], "regs": { - "ext": { - "gdpr": 0 - } + "gdpr" : 0 }, "ext": { "prebid": { diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-adoppler-bid-response-1.json b/src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-elementaltv-bid-response-1.json similarity index 100% rename from src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-adoppler-bid-response-1.json rename to src/test/resources/org/prebid/server/it/openrtb2/elementaltv/test-elementaltv-bid-response-1.json 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 1a073dcda06..2a3ffe37083 100644 --- a/src/test/resources/org/prebid/server/it/test-application.properties +++ b/src/test/resources/org/prebid/server/it/test-application.properties @@ -64,8 +64,8 @@ adapters.adnuntius.endpoint=http://localhost:8090/adnuntius-exchange adapters.adnuntius.eu-endpoint=http://localhost:8090/adnuntius-exchange-eu adapters.adocean.enabled=true adapters.adocean.endpoint=http://localhost:8090/adocean-exchange -adapters.adoppler.enabled=true -adapters.adoppler.endpoint=http://localhost:8090/adoppler-exchange +adapters.elementaltv.enabled=true +adapters.elementaltv.endpoint=http://localhost:8090/elementaltv-exchange adapters.adpone.enabled=true adapters.adpone.endpoint=http://localhost:8090/adpone-exchange adapters.adot.enabled=true From 18899b89f4c6b67a0f3e23b42f7b9454f2014fff Mon Sep 17 00:00:00 2001 From: Philip Watson Date: Tue, 13 Jan 2026 02:44:32 +1300 Subject: [PATCH 5/5] StroeerCore: Use bid.ext as-is from the response (#4317) --- .../bidder/stroeercore/StroeerCoreBidder.java | 18 +++-- .../stroeercore/model/StroeerCoreBid.java | 6 ++ .../stroeercore/StroeerCoreBidderTest.java | 66 ++++++++++++++++++- 3 files changed, 82 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java index cff5866d027..fea452f059d 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidder.java @@ -106,10 +106,6 @@ private BidderBid toBidderBid(StroeerCoreBid stroeercoreBid, List e return null; } - final ObjectNode bidExt = stroeercoreBid.getDsa() != null - ? mapper.mapper().createObjectNode().set("dsa", stroeercoreBid.getDsa()) - : null; - return BidderBid.of( Bid.builder() .id(stroeercoreBid.getId()) @@ -121,12 +117,24 @@ private BidderBid toBidderBid(StroeerCoreBid stroeercoreBid, List e .crid(stroeercoreBid.getCreativeId()) .adomain(stroeercoreBid.getAdomain()) .mtype(bidType.ordinal() + 1) - .ext(bidExt) + .ext(getBidExt(stroeercoreBid)) .build(), bidType, BIDDER_CURRENCY); } + private ObjectNode getBidExt(StroeerCoreBid stroeercoreBid) { + final ObjectNode dsa = stroeercoreBid.getDsa(); + ObjectNode ext = stroeercoreBid.getExt(); + if (dsa == null) { + return ext; + } + if (ext == null) { + ext = mapper.mapper().createObjectNode(); + } + return ext.set("dsa", dsa); + } + private static BidType getBidType(String mtype) { return switch (mtype) { case "banner" -> BidType.banner; diff --git a/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java b/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java index 2c665a27ce5..980db6d1891 100644 --- a/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java +++ b/src/main/java/org/prebid/server/bidder/stroeercore/model/StroeerCoreBid.java @@ -29,9 +29,15 @@ public class StroeerCoreBid { @JsonProperty("crid") String creativeId; + /** + * @deprecated The dsa will move to the bid's ext. + */ + @Deprecated(forRemoval = true) ObjectNode dsa; String mtype; List adomain; + + ObjectNode ext; } diff --git a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java index aa918224d29..ecee159f8bd 100644 --- a/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/stroeercore/StroeerCoreBidderTest.java @@ -152,7 +152,9 @@ public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() { @Test public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingException { // given - final ObjectNode dsaResponse = createDsaResponse(); + final ObjectNode bidExt = mapper.createObjectNode(); + bidExt.put("something", "else"); + bidExt.set("dsa", createDsaResponse()); final StroeerCoreBid bannerBid = StroeerCoreBid.builder() .id("1") @@ -163,7 +165,7 @@ public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingExcepti .width(300) .height(600) .mtype("banner") - .dsa(dsaResponse.deepCopy()) + .ext(bidExt.deepCopy()) .adomain(List.of("domain1.com", "domain2.com")) .build(); @@ -184,13 +186,71 @@ public void makeBidsShouldReturnExpectedBannerBid() throws JsonProcessingExcepti .h(600) .adomain(List.of("domain1.com", "domain2.com")) .mtype(1) - .ext(mapper.createObjectNode().set("dsa", dsaResponse)) + .ext(bidExt) .build(); assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()).containsOnly(BidderBid.of(expectedBannerBid, BidType.banner, "EUR")); } + @Test + public void makeBidsShouldSupportDeprecatedDsaPath() throws JsonProcessingException { + // given + final ObjectNode dsa = createDsaResponse(); + + final StroeerCoreBid.StroeerCoreBidBuilder stroeerBidBuilder = StroeerCoreBid.builder() + .id("1") + .bidId("banner-imp-id") + .adMarkup("
") + .cpm(BigDecimal.valueOf(0.3)) + .creativeId("foo") + .width(300) + .height(600) + .mtype("banner") + .adomain(List.of("domain1.com", "domain2.com")) + .dsa(dsa.deepCopy()); + + final StroeerCoreBid bannerBidWithoutExt = stroeerBidBuilder + .ext(null) + .build(); + + final StroeerCoreBid bannerBidWithExt = stroeerBidBuilder + .ext(mapper.createObjectNode().put("xyz", true)) + .build(); + + final StroeerCoreBidResponse response = StroeerCoreBidResponse.of( + List.of(bannerBidWithoutExt, bannerBidWithExt)); + final BidderCall httpCall = createHttpCall(response); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + final Bid.BidBuilder expectedBannerBidBuilder = Bid.builder() + .id("1") + .impid("banner-imp-id") + .adm("
") + .price(BigDecimal.valueOf(0.3)) + .crid("foo") + .w(300) + .h(600) + .adomain(List.of("domain1.com", "domain2.com")) + .mtype(1); + + final Bid expectedBid1 = expectedBannerBidBuilder + .ext(mapper.createObjectNode().set("dsa", dsa)) + .build(); + + final Bid expectedBid2 = expectedBannerBidBuilder + .ext(mapper.createObjectNode().put("xyz", true).set("dsa", dsa)) + .build(); + + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).containsOnly( + BidderBid.of(expectedBid1, BidType.banner, "EUR"), + BidderBid.of(expectedBid2, BidType.banner, "EUR")); + } + @Test public void makeBidsShouldReturnExpectedBidderBids() throws JsonProcessingException { // given