Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Medianet/fledge support #3129

Merged
merged 3 commits into from
May 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 40 additions & 10 deletions src/main/java/org/prebid/server/bidder/medianet/MedianetBidder.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,23 @@
import com.iab.openrtb.request.BidRequest;
import com.iab.openrtb.request.Imp;
import com.iab.openrtb.response.Bid;
import com.iab.openrtb.response.BidResponse;
import com.iab.openrtb.response.SeatBid;
import org.apache.commons.collections4.CollectionUtils;
import org.prebid.server.bidder.Bidder;
import org.prebid.server.bidder.medianet.model.response.InterestGroupAuctionIntent;
import org.prebid.server.bidder.medianet.model.response.MedianetBidResponse;
import org.prebid.server.bidder.medianet.model.response.MedianetBidResponseExt;
import org.prebid.server.bidder.model.BidderBid;
import org.prebid.server.bidder.model.BidderCall;
import org.prebid.server.bidder.model.BidderError;
import org.prebid.server.bidder.model.CompositeBidderResponse;
import org.prebid.server.bidder.model.HttpRequest;
import org.prebid.server.bidder.model.Result;
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.response.BidType;
import org.prebid.server.proto.openrtb.ext.response.FledgeAuctionConfig;
import org.prebid.server.util.BidderUtil;
import org.prebid.server.util.HttpUtil;

Expand All @@ -24,6 +28,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class MedianetBidder implements Bidder<BidRequest> {

Expand All @@ -40,22 +45,36 @@ public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequ
return Result.withValue(BidderUtil.defaultRequest(bidRequest, endpointUrl, mapper));
}

/**
* @deprecated for this bidder in favor of @link{makeBidderResponse} which supports additional response data
*/
@Override
public final Result<List<BidderBid>> makeBids(BidderCall<BidRequest> httpCall, BidRequest bidRequest) {
final BidResponse bidResponse;
@Deprecated(forRemoval = true)
public Result<List<BidderBid>> makeBids(BidderCall<BidRequest> httpCall, BidRequest bidRequest) {
return Result.withError(BidderError.generic("Deprecated adapter method invoked"));
}

@Override
public final CompositeBidderResponse makeBidderResponse(BidderCall<BidRequest> httpCall, BidRequest bidRequest) {
final MedianetBidResponse bidResponse;
try {
bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), BidResponse.class);
bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), MedianetBidResponse.class);
} catch (DecodeException e) {
return Result.withError(BidderError.badServerResponse(e.getMessage()));
return CompositeBidderResponse.withError(BidderError.badServerResponse(e.getMessage()));
}

final List<BidderError> errors = new ArrayList<>();
final List<BidderBid> bids = extractBids(httpCall.getRequest().getPayload(), bidResponse, errors);
final List<FledgeAuctionConfig> fledgeAuctionConfigs = extractFledge(bidResponse);

return Result.of(bids, errors);
return CompositeBidderResponse.builder()
.bids(bids)
.fledgeAuctionConfigs(fledgeAuctionConfigs)
.errors(errors)
.build();
}

private static List<BidderBid> extractBids(BidRequest bidRequest, BidResponse bidResponse,
private static List<BidderBid> extractBids(BidRequest bidRequest, MedianetBidResponse bidResponse,
List<BidderError> errors) {
if (bidResponse == null || CollectionUtils.isEmpty(bidResponse.getSeatbid())) {
return Collections.emptyList();
Expand Down Expand Up @@ -84,9 +103,8 @@ private static BidType resolveBidType(Bid bid, List<Imp> imps) {
case 2 -> BidType.video;
case 3 -> BidType.audio;
case 4 -> BidType.xNative;
default ->
throw new PreBidException("Unable to fetch mediaType: %s"
.formatted(bid.getImpid()));
default -> throw new PreBidException("Unable to fetch mediaType: %s"
.formatted(bid.getImpid()));
};
}

Expand Down Expand Up @@ -119,4 +137,16 @@ private static BidType resolveBidTypeFromImpId(String impId, List<Imp> imps) {

return BidType.banner;
}

private static List<FledgeAuctionConfig> extractFledge(MedianetBidResponse bidResponse) {
return Optional.ofNullable(bidResponse)
.map(MedianetBidResponse::getExt)
.map(MedianetBidResponseExt::getIgi)
.orElse(Collections.emptyList())
.stream()
.map(InterestGroupAuctionIntent::getIgs)
.flatMap(Collection::stream)
.map(e -> FledgeAuctionConfig.builder().impId(e.getImpId()).config(e.getConfig()).build())
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.prebid.server.bidder.medianet.model.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.Value;

@Value
public class InterestGroupAuctionBuyer {

String origin;

@JsonProperty("maxbid")
Double maxBid;

@JsonProperty("cur")
String currency;

@JsonProperty("pbs")
String buyerSignals;

@JsonProperty("ps")
ObjectNode prioritySignals;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.prebid.server.bidder.medianet.model.response;

import lombok.Builder;
import lombok.Value;

import java.util.List;

@Builder
@Value
public class InterestGroupAuctionIntent {

List<InterestGroupAuctionBuyer> igb;

List<InterestGroupAuctionSeller> igs;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.prebid.server.bidder.medianet.model.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.Builder;
import lombok.Value;

@Builder
@Value
public class InterestGroupAuctionSeller {

@JsonProperty(value = "impid")
String impId;

ObjectNode config;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.prebid.server.bidder.medianet.model.response;

import com.iab.openrtb.response.SeatBid;
import lombok.Builder;
import lombok.Value;

import java.util.List;

@Value
@Builder
public class MedianetBidResponse {

String id;

List<SeatBid> seatbid;

String bidid;

String cur;

String customdata;

Integer nbr;

MedianetBidResponseExt ext;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.prebid.server.bidder.medianet.model.response;

import lombok.Value;

import java.util.List;

@Value(staticConstructor = "of")
public class MedianetBidResponseExt {

List<InterestGroupAuctionIntent> igi;
}
Loading
Loading