11package org .prebid .server .auction .requestfactory ;
22
3+ import com .fasterxml .jackson .databind .JsonNode ;
4+ import com .fasterxml .jackson .databind .node .ArrayNode ;
5+ import com .fasterxml .jackson .databind .node .ObjectNode ;
36import com .iab .openrtb .request .App ;
47import com .iab .openrtb .request .Audio ;
58import com .iab .openrtb .request .Banner ;
1720import io .vertx .core .Future ;
1821import io .vertx .ext .web .RoutingContext ;
1922import lombok .Value ;
23+ import org .apache .commons .collections4 .CollectionUtils ;
24+ import org .apache .commons .lang3 .ObjectUtils ;
2025import org .apache .commons .lang3 .StringUtils ;
2126import org .prebid .server .auction .DebugResolver ;
2227import org .prebid .server .auction .GeoLocationServiceWrapper ;
2732import org .prebid .server .auction .externalortb .StoredRequestProcessor ;
2833import org .prebid .server .auction .gpp .AuctionGppService ;
2934import org .prebid .server .auction .model .AuctionContext ;
30- import org .prebid .server .auction .model .AuctionStoredResult ;
3135import org .prebid .server .auction .model .ConsentType ;
3236import org .prebid .server .auction .model .IpAddress ;
3337import org .prebid .server .auction .privacy .contextfactory .AuctionPrivacyContextFactory ;
4145import org .prebid .server .model .HttpRequestContext ;
4246import org .prebid .server .proto .openrtb .ext .request .ConsentedProvidersSettings ;
4347import org .prebid .server .proto .openrtb .ext .request .ExtDevice ;
44- import org .prebid .server .proto .openrtb .ext .request .ExtImpPrebid ;
4548import org .prebid .server .proto .openrtb .ext .request .ExtRegs ;
4649import org .prebid .server .proto .openrtb .ext .request .ExtRequest ;
4750import org .prebid .server .proto .openrtb .ext .request .ExtRequestPrebid ;
@@ -125,37 +128,35 @@ public Future<AuctionContext> fromRequest(RoutingContext routingContext, long st
125128 initialBidRequest (httpRequest ),
126129 startTime ))
127130
131+ .recover (ortb2RequestFactory ::restoreResultFromRejection );
132+ }
133+
134+ public Future <AuctionContext > enrichAuctionContext (AuctionContext initialContext ) {
135+ if (initialContext .isRequestRejected ()) {
136+ return Future .succeededFuture (initialContext );
137+ }
138+
139+ return Future .succeededFuture (addTmpPublisher (initialContext ))
140+
128141 .compose (auctionContext -> ortb2RequestFactory .fetchAccount (auctionContext )
129142 .map (auctionContext ::with ))
130143
131144 .map (auctionContext -> auctionContext .with (removeTmpPublisher (auctionContext .getBidRequest ())))
132145
133146 .map (auctionContext -> auctionContext .with (debugResolver .debugContextFrom (auctionContext )))
134147
135- .compose (auctionContext -> storedRequestProcessor .processAuctionRequest (
136- auctionContext .getAccount ().getId (), auctionContext .getBidRequest ())
137- .map (AuctionStoredResult ::bidRequest )
138- .map (auctionContext ::with ))
139-
140- .compose (auctionContext -> profilesProcessor .process (auctionContext , auctionContext .getBidRequest ())
148+ .compose (auctionContext -> storedRequestProcessor .processAmpRequest (
149+ auctionContext .getAccount ().getId (),
150+ storedRequestId (auctionContext .getBidRequest ()),
151+ auctionContext .getBidRequest ())
141152 .map (auctionContext ::with ))
142153
143- .map (auctionContext -> auctionContext .with (completeBidRequest (
144- auctionContext .getBidRequest (),
145- auctionContext .getHttpRequest (),
146- auctionContext .getAccount ())))
154+ .map (auctionContext -> auctionContext .with (completeBidRequest (auctionContext )))
147155
148156 .map (auctionContext -> auctionContext .with (requestTypeMetric (auctionContext .getBidRequest ())))
149157
150- .recover (ortb2RequestFactory ::restoreResultFromRejection );
151- }
152-
153- public Future <AuctionContext > enrichAuctionContext (AuctionContext initialContext ) {
154- if (initialContext .isRequestRejected ()) {
155- return Future .succeededFuture (initialContext );
156- }
157-
158- return Future .succeededFuture (initialContext )
158+ .compose (auctionContext -> profilesProcessor .process (auctionContext , auctionContext .getBidRequest ())
159+ .map (auctionContext ::with ))
159160
160161 .compose (auctionContext -> geoLocationServiceWrapper .lookup (auctionContext )
161162 .map (auctionContext ::with ))
@@ -193,8 +194,6 @@ private BidRequest initialBidRequest(HttpRequestContext httpRequest) {
193194 final Consent consent = params .consent ();
194195
195196 return BidRequest .builder ()
196- .imp (Collections .singletonList (initialImp (params )))
197- .site (tmpSite (params )) // Temporarily add to fetch account
198197 .device (initialDevice (params ))
199198 .user (initialUser (params , consent ))
200199 .tmax (params .tmax ())
@@ -205,21 +204,6 @@ private BidRequest initialBidRequest(HttpRequestContext httpRequest) {
205204 .build ();
206205 }
207206
208- private Imp initialImp (GetInterfaceParams params ) {
209- return Imp .builder ()
210- .tagid (params .tagId ())
211- .ext (mapper .mapper ().valueToTree (ExtImpPrebid .builder ()
212- .profiles (params .impProfiles ())
213- .build ()))
214- .build ();
215- }
216-
217- private static Site tmpSite (GetInterfaceParams params ) {
218- return Site .builder ()
219- .publisher (Publisher .builder ().id (params .accountId ()).build ())
220- .build ();
221- }
222-
223207 private static Device initialDevice (GetInterfaceParams params ) {
224208 final IpAddress ipAddress = params .ip ();
225209 return Device .builder ()
@@ -259,37 +243,80 @@ private static ExtRequest initialExtRequest(GetInterfaceParams params) {
259243 .debug (params .debug ())
260244 .storedrequest (ExtStoredRequest .of (params .storedRequestId ()))
261245 .profiles (params .requestProfiles ())
262- .storedAuctionResponse (ExtStoredAuctionResponse .of (
263- params .storedAuctionResponseId (), null , null ))
246+ .storedAuctionResponse (ExtStoredAuctionResponse .of (params .storedAuctionResponseId (), null , null ))
264247 .outputFormat (params .outputFormat ())
265248 .outputModule (params .outputModule ())
266249 .build ());
267250 }
268251
252+ private AuctionContext addTmpPublisher (AuctionContext auctionContext ) {
253+ final GetInterfaceParams params = new GetInterfaceParams (auctionContext .getHttpRequest ());
254+ final BidRequest bidRequestWithTmpPublisher = auctionContext .getBidRequest ().toBuilder ()
255+ .site (Site .builder ()
256+ .publisher (Publisher .builder ().id (params .accountId ()).build ())
257+ .build ())
258+ .build ();
259+
260+ return auctionContext .with (bidRequestWithTmpPublisher );
261+ }
262+
269263 private static BidRequest removeTmpPublisher (BidRequest bidRequest ) {
270264 return bidRequest .toBuilder ().site (null ).build ();
271265 }
272266
273- private BidRequest completeBidRequest (BidRequest bidRequest ,
274- HttpRequestContext httpRequest ,
275- Account account ) {
267+ private static String storedRequestId (BidRequest bidRequest ) {
268+ return bidRequest . getExt (). getPrebid (). getStoredrequest (). getId ();
269+ }
276270
277- final GetInterfaceParams params = new GetInterfaceParams (httpRequest );
271+ private BidRequest completeBidRequest (AuctionContext auctionContext ) {
272+ final Account account = auctionContext .getAccount ();
273+ final GetInterfaceParams params = new GetInterfaceParams (auctionContext .getHttpRequest ());
278274
279- final Imp imp = bidRequest .getImp ().getFirst ();
275+ final BidRequest bidRequest = auctionContext .getBidRequest ();
276+ final Imp imp = Optional .ofNullable (bidRequest .getImp ())
277+ .filter (CollectionUtils ::isNotEmpty )
278+ .map (List ::getFirst )
279+ .orElse (null );
280280
281281 return bidRequest .toBuilder ()
282- .imp (Collections .singletonList (imp .toBuilder ()
283- .banner (completeBanner (imp .getBanner (), params ))
284- .video (completeVideo (imp .getVideo (), params ))
285- .audio (completeAudio (imp .getAudio (), params ))
286- .build ()))
282+ .imp (Collections .singletonList (completeImp (imp , params )))
287283 .site (completeSite (bidRequest .getSite (), params , account ))
288284 .app (completeApp (bidRequest .getApp (), params , account ))
289285 .dooh (completeDooh (bidRequest .getDooh (), params , account ))
290286 .build ();
291287 }
292288
289+ private Imp completeImp (Imp imp , GetInterfaceParams params ) {
290+ if (imp == null ) {
291+ return null ;
292+ }
293+
294+ return imp .toBuilder ()
295+ .banner (completeBanner (imp .getBanner (), params ))
296+ .video (completeVideo (imp .getVideo (), params ))
297+ .audio (completeAudio (imp .getAudio (), params ))
298+ .tagid (ObjectUtils .defaultIfNull (params .tagId (), imp .getTagid ()))
299+ .ext (completeImpExt (imp .getExt (), params ))
300+ .build ();
301+ }
302+
303+ private ObjectNode completeImpExt (ObjectNode ext , GetInterfaceParams params ) {
304+ final List <String > impProfiles = params .impProfiles ();
305+ if (CollectionUtils .isEmpty (impProfiles )) {
306+ return ext ;
307+ }
308+
309+ final ObjectNode modifiedExt = ext != null ? ext : mapper .mapper ().createObjectNode ();
310+ final ObjectNode extPrebid = Optional .ofNullable (modifiedExt .get ("prebid" ))
311+ .filter (JsonNode ::isObject )
312+ .map (ObjectNode .class ::cast )
313+ .orElseGet (() -> modifiedExt .putObject ("prebid" ));
314+ final ArrayNode profiles = extPrebid .putArray ("profiles" );
315+ impProfiles .forEach (profiles ::add );
316+
317+ return modifiedExt ;
318+ }
319+
293320 private static Banner completeBanner (Banner banner , GetInterfaceParams params ) {
294321 if (banner == null ) {
295322 return null ;
@@ -482,7 +509,8 @@ private class GetInterfaceParams {
482509
483510 public String storedRequestId () {
484511 return Optional .ofNullable (getString ("srid" ))
485- .orElseGet (() -> getString ("tag_id" ));
512+ .or (() -> Optional .ofNullable (getString ("tag_id" )))
513+ .orElseThrow (() -> new InvalidRequestException ("Request require the stored request id." ));
486514 }
487515
488516 public String accountId () {
@@ -846,7 +874,7 @@ public Integer liveStream() {
846874 public IpAddress ip () {
847875 return Optional .ofNullable (getString ("ip" ))
848876 .map (ipAddressHelper ::toIpAddress )
849- .orElse (null );
877+ .orElse (IpAddress . of ( null , null ) );
850878 }
851879
852880 public String ua () {
0 commit comments