1212import com .iab .openrtb .response .BidResponse ;
1313import com .iab .openrtb .response .SeatBid ;
1414import io .vertx .core .MultiMap ;
15- import io .vertx .core .http .HttpMethod ;
1615import org .apache .commons .collections4 .CollectionUtils ;
1716import org .apache .commons .lang3 .ObjectUtils ;
1817import org .apache .commons .lang3 .StringUtils ;
2221import org .prebid .server .bidder .model .BidderError ;
2322import org .prebid .server .bidder .model .HttpRequest ;
2423import org .prebid .server .bidder .model .Result ;
24+ import org .prebid .server .bidder .nextmillennium .proto .NextMillenniumExt ;
25+ import org .prebid .server .bidder .nextmillennium .proto .NextMillenniumExtBidder ;
2526import org .prebid .server .exception .PreBidException ;
2627import org .prebid .server .json .DecodeException ;
2728import org .prebid .server .json .JacksonMapper ;
2829import org .prebid .server .proto .openrtb .ext .ExtPrebid ;
2930import org .prebid .server .proto .openrtb .ext .request .ExtRequest ;
3031import org .prebid .server .proto .openrtb .ext .request .ExtRequestPrebid ;
32+ import org .prebid .server .proto .openrtb .ext .request .ExtRequestPrebidServer ;
3133import org .prebid .server .proto .openrtb .ext .request .ExtStoredRequest ;
3234import org .prebid .server .proto .openrtb .ext .request .nextmillennium .ExtImpNextMillennium ;
3335import org .prebid .server .proto .openrtb .ext .response .BidType ;
36+ import org .prebid .server .util .BidderUtil ;
3437import org .prebid .server .util .HttpUtil ;
3538import org .prebid .server .util .ObjectUtil ;
39+ import org .prebid .server .version .PrebidVersionProvider ;
3640
3741import java .util .ArrayList ;
3842import java .util .Collection ;
@@ -46,15 +50,22 @@ public class NextMillenniumBidder implements Bidder<BidRequest> {
4650 new TypeReference <>() {
4751 };
4852
53+ private static final String NM_ADAPTER_VERSION = "v1.0.0" ;
54+
4955 private final String endpointUrl ;
5056 private final JacksonMapper mapper ;
5157 private final List <String > nmmFlags ;
58+ private final PrebidVersionProvider versionProvider ;
59+
60+ public NextMillenniumBidder (String endpointUrl ,
61+ JacksonMapper mapper ,
62+ List <String > nmmFlags ,
63+ PrebidVersionProvider versionProvider ) {
5264
53- public NextMillenniumBidder (String endpointUrl , JacksonMapper mapper , List <String > nmmFlags ) {
5465 this .endpointUrl = HttpUtil .validateUrl (Objects .requireNonNull (endpointUrl ));
5566 this .mapper = Objects .requireNonNull (mapper );
5667 this .nmmFlags = nmmFlags ;
57-
68+ this . versionProvider = Objects . requireNonNull ( versionProvider );
5869 }
5970
6071 @ Override
@@ -70,7 +81,12 @@ public final Result<List<HttpRequest<BidRequest>>> makeHttpRequests(BidRequest b
7081 errors .add (BidderError .badInput (e .getMessage ()));
7182 continue ;
7283 }
73- httpRequests .add (makeHttpRequest (updateBidRequest (bidRequest , extImpNextMillennium )));
84+ final BidRequest updatedRequest = updateBidRequest (bidRequest , extImpNextMillennium );
85+ httpRequests .add (BidderUtil .defaultRequest (
86+ updatedRequest ,
87+ headers (),
88+ endpointUrl ,
89+ mapper ));
7490 }
7591
7692 return errors .isEmpty () ? Result .withValues (httpRequests ) : Result .withErrors (errors );
@@ -84,31 +100,19 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) {
84100 }
85101 }
86102
87- private BidRequest updateBidRequest (BidRequest bidRequest , ExtImpNextMillennium ext ) {
88- final ExtStoredRequest storedRequest = ExtStoredRequest .of (resolveStoredRequestId (bidRequest , ext ));
89-
90- final ExtRequestPrebid createdExtRequestPrebid = ExtRequestPrebid .builder ()
91- .storedrequest (storedRequest )
92- .build ();
93-
94- final ExtRequestPrebid extRequestPrebid = Optional .of (bidRequest )
95- .map (BidRequest ::getExt )
103+ private BidRequest updateBidRequest (BidRequest bidRequest , ExtImpNextMillennium extImp ) {
104+ final String soredRequestId = resolveStoredRequestId (bidRequest , extImp );
105+ final ExtRequestPrebidServer extRequestPrebidServer = Optional .ofNullable (bidRequest .getExt ())
96106 .map (ExtRequest ::getPrebid )
97- .map (prebid -> prebid . toBuilder (). storedrequest ( storedRequest ). build () )
98- .orElse (createdExtRequestPrebid );
107+ .map (ExtRequestPrebid :: getServer )
108+ .orElse (null );
99109
100110 return bidRequest .toBuilder ()
101- .imp (updateImps (bidRequest , createdExtRequestPrebid ))
102- .ext (ExtRequest . of ( extRequestPrebid ))
111+ .imp (modifyFirstImp (bidRequest . getImp (), soredRequestId ))
112+ .ext (createExtRequest ( soredRequestId , extRequestPrebidServer ))
103113 .build ();
104114 }
105115
106- private List <Imp > updateImps (BidRequest bidRequest , ExtRequestPrebid extRequestPrebid ) {
107- return bidRequest .getImp ().stream ()
108- .map (imp -> imp .toBuilder ().ext (createImpExt (extRequestPrebid )).build ())
109- .toList ();
110- }
111-
112116 private static String resolveStoredRequestId (BidRequest bidRequest , ExtImpNextMillennium extImpNextMillennium ) {
113117 final String groupId = extImpNextMillennium .getGroupId ();
114118 if (StringUtils .isEmpty (groupId )) {
@@ -146,24 +150,38 @@ private static String formatSize(Integer w, Integer h) {
146150 : null ;
147151 }
148152
149- private ObjectNode createImpExt (ExtRequestPrebid prebid ) {
150- final ObjectNode impExt = mapper .mapper ().createObjectNode ();
151- impExt .set ("prebid" , mapper .mapper ().valueToTree (prebid ));
152- if (CollectionUtils .isNotEmpty (nmmFlags )) {
153- impExt .putObject ("nextMillennium" )
154- .set ("nmmFlags" , mapper .mapper ().valueToTree (nmmFlags ));
155- }
156- return impExt ;
153+ private List <Imp > modifyFirstImp (List <Imp > imps , String storedRequestId ) {
154+ final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid .builder ()
155+ .storedrequest (ExtStoredRequest .of (storedRequestId ))
156+ .build ();
157+
158+ final NextMillenniumExt nextMillenniumExt = NextMillenniumExt .of (
159+ NextMillenniumExtBidder .of (nmmFlags , null , null ));
160+
161+ final ExtRequest extRequest = ExtRequest .of (extRequestPrebid );
162+ mapper .fillExtension (extRequest , nextMillenniumExt );
163+
164+ final ObjectNode impExt = mapper .mapper ().valueToTree (extRequest );
165+
166+ final List <Imp > modifiedImps = new ArrayList <>(imps );
167+ modifiedImps .set (0 , imps .getFirst ().toBuilder ().ext (impExt ).build ());
168+
169+ return modifiedImps ;
157170 }
158171
159- private HttpRequest <BidRequest > makeHttpRequest (BidRequest bidRequest ) {
160- return HttpRequest .<BidRequest >builder ()
161- .method (HttpMethod .POST )
162- .uri (endpointUrl )
163- .headers (headers ())
164- .payload (bidRequest )
165- .body (mapper .encodeToBytes (bidRequest ))
172+ private ExtRequest createExtRequest (String storedRequestId , ExtRequestPrebidServer extRequestPrebidServer ) {
173+ final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid .builder ()
174+ .storedrequest (ExtStoredRequest .of (storedRequestId ))
175+ .server (extRequestPrebidServer )
166176 .build ();
177+
178+ final NextMillenniumExt nextMillenniumExt = NextMillenniumExt .of (
179+ NextMillenniumExtBidder .of (nmmFlags , NM_ADAPTER_VERSION , versionProvider .getNameVersionRecord ()));
180+
181+ final ExtRequest extRequest = ExtRequest .of (extRequestPrebid );
182+ mapper .fillExtension (extRequest , nextMillenniumExt );
183+
184+ return extRequest ;
167185 }
168186
169187 private static MultiMap headers () {
0 commit comments