Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.iab.openrtb.response.BidResponse;
import com.iab.openrtb.response.SeatBid;
import io.vertx.core.MultiMap;
import io.vertx.core.http.HttpMethod;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
Expand All @@ -22,17 +21,22 @@
import org.prebid.server.bidder.model.BidderError;
import org.prebid.server.bidder.model.HttpRequest;
import org.prebid.server.bidder.model.Result;
import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExt;
import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExtBidder;
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.ExtRequest;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidServer;
import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest;
import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium;
import org.prebid.server.proto.openrtb.ext.response.BidType;
import org.prebid.server.util.BidderUtil;
import org.prebid.server.util.HttpUtil;
import org.prebid.server.util.ObjectUtil;
import org.prebid.server.version.PrebidVersionProvider;

import java.util.ArrayList;
import java.util.Collection;
Expand All @@ -46,15 +50,22 @@ public class NextMillenniumBidder implements Bidder<BidRequest> {
new TypeReference<>() {
};

private static final String NM_ADAPTER_VERSION = "v1.0.0";

private final String endpointUrl;
private final JacksonMapper mapper;
private final List<String> nmmFlags;
private final PrebidVersionProvider versionProvider;

public NextMillenniumBidder(String endpointUrl,
JacksonMapper mapper,
List<String> nmmFlags,
PrebidVersionProvider versionProvider) {

public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper, List<String> nmmFlags) {
this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl));
this.mapper = Objects.requireNonNull(mapper);
this.nmmFlags = nmmFlags;

this.versionProvider = Objects.requireNonNull(versionProvider);
}

@Override
Expand All @@ -70,7 +81,12 @@ public final Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest b
errors.add(BidderError.badInput(e.getMessage()));
continue;
}
httpRequests.add(makeHttpRequest(updateBidRequest(bidRequest, extImpNextMillennium)));
final BidRequest updatedRequest = updateBidRequest(bidRequest, extImpNextMillennium);
httpRequests.add(BidderUtil.defaultRequest(
updatedRequest,
headers(),
endpointUrl,
mapper));
}

return errors.isEmpty() ? Result.withValues(httpRequests) : Result.withErrors(errors);
Expand All @@ -84,31 +100,19 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) {
}
}

private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) {
final ExtStoredRequest storedRequest = ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext));

final ExtRequestPrebid createdExtRequestPrebid = ExtRequestPrebid.builder()
.storedrequest(storedRequest)
.build();

final ExtRequestPrebid extRequestPrebid = Optional.of(bidRequest)
.map(BidRequest::getExt)
private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium extImp) {
final String soredRequestId = resolveStoredRequestId(bidRequest, extImp);
final ExtRequestPrebidServer extRequestPrebidServer = Optional.ofNullable(bidRequest.getExt())
.map(ExtRequest::getPrebid)
.map(prebid -> prebid.toBuilder().storedrequest(storedRequest).build())
.orElse(createdExtRequestPrebid);
.map(ExtRequestPrebid::getServer)
.orElse(null);

return bidRequest.toBuilder()
.imp(updateImps(bidRequest, createdExtRequestPrebid))
.ext(ExtRequest.of(extRequestPrebid))
.imp(modifyFirstImp(bidRequest.getImp(), soredRequestId))
.ext(createExtRequest(soredRequestId, extRequestPrebidServer))
.build();
}

private List<Imp> updateImps(BidRequest bidRequest, ExtRequestPrebid extRequestPrebid) {
return bidRequest.getImp().stream()
.map(imp -> imp.toBuilder().ext(createImpExt(extRequestPrebid)).build())
.toList();
}

private static String resolveStoredRequestId(BidRequest bidRequest, ExtImpNextMillennium extImpNextMillennium) {
final String groupId = extImpNextMillennium.getGroupId();
if (StringUtils.isEmpty(groupId)) {
Expand Down Expand Up @@ -146,24 +150,38 @@ private static String formatSize(Integer w, Integer h) {
: null;
}

private ObjectNode createImpExt(ExtRequestPrebid prebid) {
final ObjectNode impExt = mapper.mapper().createObjectNode();
impExt.set("prebid", mapper.mapper().valueToTree(prebid));
if (CollectionUtils.isNotEmpty(nmmFlags)) {
impExt.putObject("nextMillennium")
.set("nmmFlags", mapper.mapper().valueToTree(nmmFlags));
}
return impExt;
private List<Imp> modifyFirstImp(List<Imp> imps, String storedRequestId) {
final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder()
.storedrequest(ExtStoredRequest.of(storedRequestId))
.build();

final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of(
NextMillenniumExtBidder.of(nmmFlags, null, null));

final ExtRequest extRequest = ExtRequest.of(extRequestPrebid);
mapper.fillExtension(extRequest, nextMillenniumExt);

final ObjectNode impExt = mapper.mapper().valueToTree(extRequest);

final List<Imp> modifiedImps = new ArrayList<>(imps);
modifiedImps.set(0, imps.getFirst().toBuilder().ext(impExt).build());

return modifiedImps;
}

private HttpRequest<BidRequest> makeHttpRequest(BidRequest bidRequest) {
return HttpRequest.<BidRequest>builder()
.method(HttpMethod.POST)
.uri(endpointUrl)
.headers(headers())
.payload(bidRequest)
.body(mapper.encodeToBytes(bidRequest))
private ExtRequest createExtRequest(String storedRequestId, ExtRequestPrebidServer extRequestPrebidServer) {
final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder()
.storedrequest(ExtStoredRequest.of(storedRequestId))
.server(extRequestPrebidServer)
.build();

final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of(
NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord()));

final ExtRequest extRequest = ExtRequest.of(extRequestPrebid);
mapper.fillExtension(extRequest, nextMillenniumExt);

return extRequest;
}

private static MultiMap headers() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.prebid.server.bidder.nextmillennium.proto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Value;

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

@JsonProperty("nextMillennium")
NextMillenniumExtBidder nextMillennium;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.prebid.server.bidder.nextmillennium.proto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Value;

import java.util.List;

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

@JsonProperty("nmmFlags")
List<String> nmmFlags;

String nmVersion;

String serverVersion;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler;
import org.prebid.server.spring.config.bidder.util.UsersyncerCreator;
import org.prebid.server.spring.env.YamlPropertySourceFactory;
import org.prebid.server.version.PrebidVersionProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
Expand All @@ -34,6 +35,7 @@ NextMillenniumConfigurationProperties configurationProperties() {
@Bean
BidderDeps nextMillenniumBidderDeps(NextMillenniumConfigurationProperties nextMillenniumConfigurationProperties,
@NotBlank @Value("${external-url}") String externalUrl,
PrebidVersionProvider prebidVersionProvider,
JacksonMapper mapper) {

return BidderDepsAssembler.<NextMillenniumConfigurationProperties>forBidder(BIDDER_NAME)
Expand All @@ -42,7 +44,8 @@ BidderDeps nextMillenniumBidderDeps(NextMillenniumConfigurationProperties nextMi
.bidderCreator(config -> new NextMillenniumBidder(
config.getEndpoint(),
mapper,
config.getExtraInfo().getNmmFlags())
config.getExtraInfo().getNmmFlags(),
prebidVersionProvider)
).assemble();
}

Expand Down
Loading
Loading