Skip to content

Commit 02bc1de

Browse files
authored
Rid Yieldmo bidder of OpenrtbBidder. (prebid#1616)
1 parent 1be1b6b commit 02bc1de

File tree

2 files changed

+102
-20
lines changed

2 files changed

+102
-20
lines changed

src/main/java/org/prebid/server/bidder/yieldmo/YieldmoBidder.java

Lines changed: 101 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,134 @@
11
package org.prebid.server.bidder.yieldmo;
22

3+
import com.fasterxml.jackson.core.JsonPointer;
4+
import com.fasterxml.jackson.core.type.TypeReference;
35
import com.fasterxml.jackson.databind.JsonNode;
6+
import com.iab.openrtb.request.BidRequest;
47
import com.iab.openrtb.request.Imp;
58
import com.iab.openrtb.response.Bid;
9+
import com.iab.openrtb.response.BidResponse;
10+
import com.iab.openrtb.response.SeatBid;
11+
import io.vertx.core.http.HttpMethod;
12+
import org.apache.commons.collections4.CollectionUtils;
613
import org.apache.commons.lang3.StringUtils;
7-
import org.prebid.server.bidder.OpenrtbBidder;
14+
import org.prebid.server.bidder.Bidder;
15+
import org.prebid.server.bidder.model.BidderBid;
16+
import org.prebid.server.bidder.model.BidderError;
17+
import org.prebid.server.bidder.model.HttpCall;
18+
import org.prebid.server.bidder.model.HttpRequest;
19+
import org.prebid.server.bidder.model.Result;
820
import org.prebid.server.bidder.yieldmo.proto.YieldmoImpExt;
921
import org.prebid.server.exception.PreBidException;
22+
import org.prebid.server.json.DecodeException;
1023
import org.prebid.server.json.JacksonMapper;
24+
import org.prebid.server.proto.openrtb.ext.ExtPrebid;
1125
import org.prebid.server.proto.openrtb.ext.request.yieldmo.ExtImpYieldmo;
1226
import org.prebid.server.proto.openrtb.ext.response.BidType;
27+
import org.prebid.server.util.HttpUtil;
1328

29+
import java.util.ArrayList;
30+
import java.util.Collection;
31+
import java.util.Collections;
1432
import java.util.List;
33+
import java.util.Objects;
34+
import java.util.stream.Collectors;
1535

16-
public class YieldmoBidder extends OpenrtbBidder<ExtImpYieldmo> {
36+
public class YieldmoBidder implements Bidder<BidRequest> {
37+
38+
private static final JsonPointer PBADSLOT_POINTER = JsonPointer.valueOf("/data/pbadslot");
39+
private static final TypeReference<ExtPrebid<?, ExtImpYieldmo>> YIELDMO_EXT_TYPE_REFERENCE =
40+
new TypeReference<>() {
41+
};
42+
43+
private final String endpointUrl;
44+
private final JacksonMapper mapper;
1745

1846
public YieldmoBidder(String endpointUrl, JacksonMapper mapper) {
19-
super(endpointUrl, RequestCreationStrategy.SINGLE_REQUEST, ExtImpYieldmo.class, mapper);
47+
this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl));
48+
this.mapper = Objects.requireNonNull(mapper);
2049
}
2150

2251
@Override
23-
protected Imp modifyImp(Imp imp, ExtImpYieldmo impExt) throws PreBidException {
24-
final Imp.ImpBuilder modifiedImp = imp.toBuilder();
52+
public Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest bidRequest) {
53+
final List<Imp> modifiedImps = new ArrayList<>();
54+
final List<BidderError> errors = new ArrayList<>();
2555

26-
final JsonNode pbadslotNode = imp.getExt().at("/data/pbadslot");
27-
final String gpid = !pbadslotNode.isMissingNode()
28-
? StringUtils.defaultIfEmpty(pbadslotNode.asText(), null)
29-
: null;
56+
for (Imp imp : bidRequest.getImp()) {
57+
try {
58+
final ExtImpYieldmo impExt = parseImpExt(imp);
59+
modifiedImps.add(modifyImp(imp, impExt));
60+
} catch (PreBidException e) {
61+
errors.add(BidderError.badInput(e.getMessage()));
62+
}
63+
}
3064

65+
if (modifiedImps.isEmpty()) {
66+
return Result.withErrors(errors);
67+
}
68+
69+
final BidRequest modifiedRequest = bidRequest.toBuilder().imp(modifiedImps).build();
70+
return Result.of(Collections.singletonList(makeRequest(modifiedRequest)), errors);
71+
}
72+
73+
private ExtImpYieldmo parseImpExt(Imp imp) throws PreBidException {
3174
try {
32-
modifiedImp.ext(mapper.mapper().valueToTree(YieldmoImpExt.of(impExt.getPlacementId(), gpid)));
75+
return mapper.mapper().convertValue(imp.getExt(), YIELDMO_EXT_TYPE_REFERENCE).getBidder();
3376
} catch (IllegalArgumentException e) {
3477
throw new PreBidException(e.getMessage(), e);
3578
}
79+
}
3680

37-
return modifiedImp.build();
81+
private Imp modifyImp(Imp imp, ExtImpYieldmo ext) {
82+
final YieldmoImpExt modifiedExt = YieldmoImpExt.of(ext.getPlacementId(), extractGpid(imp));
83+
return imp.toBuilder().ext(mapper.mapper().valueToTree(modifiedExt)).build();
84+
}
85+
86+
private static String extractGpid(Imp imp) {
87+
final JsonNode pbadslotNode = imp.getExt().at(PBADSLOT_POINTER);
88+
return pbadslotNode.isTextual()
89+
? StringUtils.defaultIfEmpty(pbadslotNode.asText(), null)
90+
: null;
91+
}
92+
93+
private HttpRequest<BidRequest> makeRequest(BidRequest bidRequest) {
94+
return HttpRequest.<BidRequest>builder()
95+
.method(HttpMethod.POST)
96+
.headers(HttpUtil.headers())
97+
.uri(endpointUrl)
98+
.body(mapper.encodeToBytes(bidRequest))
99+
.payload(bidRequest)
100+
.build();
38101
}
39102

40103
@Override
41-
protected BidType getBidType(Bid bid, List<Imp> imps) {
42-
final String impId = bid.getImpid();
104+
public Result<List<BidderBid>> makeBids(HttpCall<BidRequest> httpCall, BidRequest bidRequest) {
105+
try {
106+
final BidResponse bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), BidResponse.class);
107+
return Result.withValues(extractBids(httpCall.getRequest().getPayload(), bidResponse));
108+
} catch (DecodeException e) {
109+
return Result.withError(BidderError.badServerResponse(e.getMessage()));
110+
}
111+
}
112+
113+
private static List<BidderBid> extractBids(BidRequest bidRequest, BidResponse bidResponse) {
114+
if (bidResponse == null || CollectionUtils.isEmpty(bidResponse.getSeatbid())) {
115+
return Collections.emptyList();
116+
}
117+
118+
return bidResponse.getSeatbid().stream()
119+
.filter(Objects::nonNull)
120+
.map(SeatBid::getBid)
121+
.filter(Objects::nonNull)
122+
.flatMap(Collection::stream)
123+
.filter(Objects::nonNull)
124+
.map(bid -> BidderBid.of(bid, resolveBidType(bid, bidRequest.getImp()), bidResponse.getCur()))
125+
.collect(Collectors.toList());
126+
}
127+
128+
private static BidType resolveBidType(Bid bid, List<Imp> imps) {
43129
for (Imp imp : imps) {
44-
if (imp.getId().equals(impId)) {
45-
if (imp.getBanner() != null) {
46-
return BidType.banner;
47-
}
130+
if (Objects.equals(imp.getId(), bid.getImpid())) {
131+
return imp.getBanner() != null ? BidType.banner : BidType.video;
48132
}
49133
}
50134
return BidType.video;

src/main/java/org/prebid/server/bidder/yieldmo/proto/YieldmoImpExt.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package org.prebid.server.bidder.yieldmo.proto;
22

3-
import lombok.AllArgsConstructor;
43
import lombok.Value;
54

6-
@AllArgsConstructor(staticName = "of")
7-
@Value
5+
@Value(staticConstructor = "of")
86
public class YieldmoImpExt {
97

108
String placementId;

0 commit comments

Comments
 (0)