diff --git a/src/main/java/org/prebid/server/bidder/aidem/AidemBidder.java b/src/main/java/org/prebid/server/bidder/aidem/AidemBidder.java index 4591cb7bb3b..f78e7ebeffc 100644 --- a/src/main/java/org/prebid/server/bidder/aidem/AidemBidder.java +++ b/src/main/java/org/prebid/server/bidder/aidem/AidemBidder.java @@ -1,5 +1,6 @@ package org.prebid.server.bidder.aidem; +import com.fasterxml.jackson.core.type.TypeReference; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; @@ -15,6 +16,8 @@ import org.prebid.server.exception.PreBidException; 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.aidem.ExtImpAidem; import org.prebid.server.proto.openrtb.ext.response.BidType; import org.prebid.server.util.BidderUtil; import org.prebid.server.util.HttpUtil; @@ -27,6 +30,11 @@ public class AidemBidder implements Bidder { + private static final TypeReference> AIDEM_EXT_TYPE_REFERENCE = + new TypeReference<>() { + }; + private static final String PUBLISHER_ID_MACRO = "{{PublisherId}}"; + private final String endpointUrl; private final JacksonMapper mapper; @@ -37,7 +45,24 @@ public AidemBidder(String endpointUrl, JacksonMapper mapper) { @Override public final Result>> makeHttpRequests(BidRequest bidRequest) { - return Result.withValue(BidderUtil.defaultRequest(bidRequest, endpointUrl, mapper)); + try { + final ExtImpAidem impExt = parseImpExt(bidRequest.getImp().get(0)); + return Result.withValue(BidderUtil.defaultRequest(bidRequest, makeUrl(impExt), mapper)); + } catch (PreBidException e) { + return Result.withError(BidderError.badInput(e.getMessage())); + } + } + + private ExtImpAidem parseImpExt(Imp imp) { + try { + return mapper.mapper().convertValue(imp.getExt(), AIDEM_EXT_TYPE_REFERENCE).getBidder(); + } catch (IllegalArgumentException e) { + throw new PreBidException("Missing bidder ext in impression with id: " + imp.getId()); + } + } + + private String makeUrl(ExtImpAidem extImpAidem) { + return endpointUrl.replace(PUBLISHER_ID_MACRO, extImpAidem.getPublisherId()); } @Override @@ -93,9 +118,8 @@ private static BidType resolveBidType(Bid bid) throws PreBidException { case 2 -> BidType.video; case 3 -> BidType.audio; case 4 -> BidType.xNative; - default -> - throw new PreBidException("Unable to fetch mediaType in multi-format: %s" - .formatted(bid.getImpid())); + default -> throw new PreBidException("Unable to fetch mediaType in multi-format: %s" + .formatted(bid.getImpid())); }; } } diff --git a/src/main/resources/bidder-config/aidem.yaml b/src/main/resources/bidder-config/aidem.yaml index 89568509b24..cd8b37239ab 100644 --- a/src/main/resources/bidder-config/aidem.yaml +++ b/src/main/resources/bidder-config/aidem.yaml @@ -1,6 +1,6 @@ adapters: aidem: - endpoint: https://zero.aidemsrv.com/ortb/v2.6/bid/request + endpoint: https://zero.aidemsrv.com/ortb/v2.6/bid/request?billing_id={{PublisherId}} modifyingVastXmlAllowed: true meta-info: maintainer-email: prebid@aidem.com diff --git a/src/test/java/org/prebid/server/bidder/aidem/AidemBidderTest.java b/src/test/java/org/prebid/server/bidder/aidem/AidemBidderTest.java index 43bb785d449..9e68a8b9fb4 100644 --- a/src/test/java/org/prebid/server/bidder/aidem/AidemBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/aidem/AidemBidderTest.java @@ -34,7 +34,7 @@ public class AidemBidderTest extends VertxTest { - private static final String ENDPOINT_URL = "https://randomurl.com"; + private static final String ENDPOINT_URL = "https://randomurl.com?param={{PublisherId}}"; private final AidemBidder target = new AidemBidder(ENDPOINT_URL, jacksonMapper); @@ -46,7 +46,9 @@ public void creationShouldFailOnInvalidEndpointUrl() { @Test public void makeHttpRequestsShouldCreateExpectedUrl() { // given - final BidRequest bidRequest = givenBidRequest(identity()); + final ExtImpAidem impExt = ExtImpAidem.of(null, "publisherId", null, null); + final BidRequest bidRequest = givenBidRequest(impBuilder -> + impBuilder.ext(mapper.valueToTree(ExtPrebid.of(null, impExt)))); // when final Result>> result = target.makeHttpRequests(bidRequest); @@ -55,7 +57,7 @@ public void makeHttpRequestsShouldCreateExpectedUrl() { assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()).hasSize(1) .extracting(HttpRequest::getUri) - .containsExactly("https://randomurl.com"); + .containsExactly("https://randomurl.com?param=publisherId"); } @Test @@ -210,13 +212,6 @@ private static BidRequest givenBidRequest( .build(); } - private static BidResponse givenBidResponse(Function bidCustomizer) { - return BidResponse.builder() - .seatbid(singletonList(SeatBid.builder().bid(singletonList(bidCustomizer.apply(Bid.builder()).build())) - .build())) - .build(); - } - private static BidResponse givenBidResponse(Bid... bids) { return BidResponse.builder() .cur("USD") @@ -235,10 +230,6 @@ private static Imp givenImp(Function impCustomiz .build(); } - private static Bid givenBid() { - return Bid.builder().impid("123").build(); - } - private static BidderCall givenHttpCall(BidRequest bidRequest, String body) { return BidderCall.succeededHttp( HttpRequest.builder().payload(bidRequest).build(),