From 3ff0c541d4815d1364074268f3ce71fd08bf5e49 Mon Sep 17 00:00:00 2001 From: zhihuiye Date: Wed, 23 Jul 2025 17:12:31 +0100 Subject: [PATCH] added integration_type field to mobkoi bidder requests --- .../server/bidder/mobkoi/MobkoiBidder.java | 17 +++++++++--- .../mobkoi/proto/MobkoiBidRequestExt.java | 22 +++++++++++++++ .../ext/request/mobkoi/ExtImpMobkoi.java | 7 +++-- .../static/bidder-params/mobkoi.json | 4 +-- .../bidder/mobkoi/MobkoiBidderTest.java | 27 +++++++++++++++++-- 5 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/prebid/server/bidder/mobkoi/proto/MobkoiBidRequestExt.java diff --git a/src/main/java/org/prebid/server/bidder/mobkoi/MobkoiBidder.java b/src/main/java/org/prebid/server/bidder/mobkoi/MobkoiBidder.java index 97cd481b235..e8556577a8d 100644 --- a/src/main/java/org/prebid/server/bidder/mobkoi/MobkoiBidder.java +++ b/src/main/java/org/prebid/server/bidder/mobkoi/MobkoiBidder.java @@ -18,9 +18,11 @@ 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.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtUser; import org.prebid.server.proto.openrtb.ext.request.mobkoi.ExtImpMobkoi; import org.prebid.server.proto.openrtb.ext.response.BidType; +import org.prebid.server.bidder.mobkoi.proto.MobkoiBidRequestExt; import org.prebid.server.util.BidderUtil; import org.prebid.server.util.HttpUtil; @@ -39,6 +41,9 @@ public class MobkoiBidder implements Bidder { new TypeReference<>() { }; + /** + * The integration endpoint that will be used to send the bid requests to. Managed by the adapter configuration. + */ private final String endpointUrl; private final JacksonMapper mapper; @@ -60,7 +65,7 @@ public Result>> makeHttpRequests(BidRequest bidRequ return Result.withError(BidderError.badInput(e.getMessage())); } - final String selectedEndpointUrl = resolveEndpoint(extImpMobkoi.getAdServerBaseUrl()); + final String selectedEndpointUrl = resolveEndpoint(extImpMobkoi.getIntegrationEndpoint()); return Result.withValue(BidderUtil.defaultRequest( modifyBidRequest(bidRequest, modifiedFirstImp), @@ -104,10 +109,16 @@ private String resolveEndpoint(String customUri) { } } - private static BidRequest modifyBidRequest(BidRequest bidRequest, Imp modifiedFirstImp) { + private BidRequest modifyBidRequest(BidRequest bidRequest, Imp modifiedFirstImp) { final User user = modifyUser(bidRequest.getUser()); final List imps = updateFirstImpWith(bidRequest.getImp(), modifiedFirstImp); - return bidRequest.toBuilder().user(user).imp(imps).build(); + final ExtRequest requestExt = modifyReqExt(bidRequest.getExt()); + return bidRequest.toBuilder().user(user).imp(imps).ext(requestExt).build(); + } + + private ExtRequest modifyReqExt(ExtRequest existingRequestExt) { + final ExtRequest target = existingRequestExt != null ? existingRequestExt : ExtRequest.empty(); + return mapper.fillExtension(target, MobkoiBidRequestExt.of()); } private static User modifyUser(User user) { diff --git a/src/main/java/org/prebid/server/bidder/mobkoi/proto/MobkoiBidRequestExt.java b/src/main/java/org/prebid/server/bidder/mobkoi/proto/MobkoiBidRequestExt.java new file mode 100644 index 00000000000..ab4b52338ef --- /dev/null +++ b/src/main/java/org/prebid/server/bidder/mobkoi/proto/MobkoiBidRequestExt.java @@ -0,0 +1,22 @@ +package org.prebid.server.bidder.mobkoi.proto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Value; + +@Value(staticConstructor = "of") +public class MobkoiBidRequestExt { + + @JsonProperty("mobkoi") + final Mobkoi mobkoi; + + public static MobkoiBidRequestExt of() { + return new MobkoiBidRequestExt(Mobkoi.of()); + } + + @Value(staticConstructor = "of") + public static class Mobkoi { + + @JsonProperty("integration_type") + final String integrationType = "pbs"; + } +} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/mobkoi/ExtImpMobkoi.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/mobkoi/ExtImpMobkoi.java index 0faa3d1efc8..aac41e7a840 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/mobkoi/ExtImpMobkoi.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/mobkoi/ExtImpMobkoi.java @@ -9,6 +9,9 @@ public class ExtImpMobkoi { @JsonProperty("placementId") String placementId; - @JsonProperty("adServerBaseUrl") - String adServerBaseUrl; + /** + * The integration endpoint that the bid requests will be sent to. For example, https://test.mobkoi.com/bid. + */ + @JsonProperty("integrationEndpoint") + String integrationEndpoint; } diff --git a/src/main/resources/static/bidder-params/mobkoi.json b/src/main/resources/static/bidder-params/mobkoi.json index 8286229b035..a4eeb89a1bf 100644 --- a/src/main/resources/static/bidder-params/mobkoi.json +++ b/src/main/resources/static/bidder-params/mobkoi.json @@ -10,8 +10,8 @@ }, "adServerBaseUrl": { "type": "string", - "description": "Mobkoi's ad server url", - "pattern": "^https?://[^.]+\\.mobkoi\\.com$" + "description": "Mobkoi's integration endpoint that will be used to send the bid requests to. For example, https://test.mobkoi.com/bid.", + "pattern": "^https?://[^.]+\\.mobkoi\\.com(/.*)?$" } } } diff --git a/src/test/java/org/prebid/server/bidder/mobkoi/MobkoiBidderTest.java b/src/test/java/org/prebid/server/bidder/mobkoi/MobkoiBidderTest.java index 1c98d21a3ca..11fb5d39b91 100644 --- a/src/test/java/org/prebid/server/bidder/mobkoi/MobkoiBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/mobkoi/MobkoiBidderTest.java @@ -160,6 +160,24 @@ public void makeHttpRequestsShouldOverrideUserExtAndSetConsent() { assertThat(result.getErrors()).isEmpty(); } + @Test + public void makeHttpRequestsShouldHasMobkoiExtSet() { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getValue()) + .extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class)) + .extracting(request -> request.getExt()) + .extracting(ext -> ext.getProperty("mobkoi")) + .extracting(mobkoi -> mobkoi.get("integration_type").asText()) + .hasSize(1).element(0) + .isEqualTo("pbs"); + } + @Test public void makeBidsShouldReturnEmptyListIfBidResponseIsNull() throws JsonProcessingException { // given @@ -238,8 +256,13 @@ private static Imp givenImp(UnaryOperator impCustomizer) { return impCustomizer.apply(Imp.builder().id("imp_id").ext(impExt("placementIdValue", null))).build(); } - private static ObjectNode impExt(String placementId, String adServerBaseUrl) { - return mapper.valueToTree(ExtPrebid.of(null, ExtImpMobkoi.of(placementId, adServerBaseUrl))); + /** + * @param placementId The placement id provided by Mobkoi. + * @param integrationEndpoint The integration endpoint that will be used to send the bid requests to. + * @return The imp ext. + */ + private static ObjectNode impExt(String placementId, String integrationEndpoint) { + return mapper.valueToTree(ExtPrebid.of(null, ExtImpMobkoi.of(placementId, integrationEndpoint))); } private static BidResponse givenBidResponse(UnaryOperator bidCustomizer) {