1717import org .prebid .server .bidder .model .HttpRequest ;
1818import org .prebid .server .bidder .model .Result ;
1919import org .prebid .server .bidder .openx .model .OpenxImpType ;
20+ import org .prebid .server .bidder .openx .proto .OpenxBidExt ;
2021import org .prebid .server .bidder .openx .proto .OpenxBidResponse ;
2122import org .prebid .server .bidder .openx .proto .OpenxBidResponseExt ;
2223import org .prebid .server .bidder .openx .proto .OpenxRequestExt ;
2930import org .prebid .server .proto .openrtb .ext .request .ExtRequest ;
3031import org .prebid .server .proto .openrtb .ext .request .openx .ExtImpOpenx ;
3132import org .prebid .server .proto .openrtb .ext .response .BidType ;
33+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebid ;
34+ import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebidMeta ;
3235import org .prebid .server .proto .openrtb .ext .response .ExtBidPrebidVideo ;
3336import org .prebid .server .proto .openrtb .ext .response .ExtIgi ;
3437import org .prebid .server .proto .openrtb .ext .response .ExtIgiIgs ;
@@ -59,6 +62,9 @@ public class OpenxBidder implements Bidder<BidRequest> {
5962 private static final TypeReference <ExtPrebid <ExtImpPrebid , ExtImpOpenx >> OPENX_EXT_TYPE_REFERENCE =
6063 new TypeReference <>() {
6164 };
65+ private static final TypeReference <ExtPrebid <ExtBidPrebid , ObjectNode >> EXT_PREBID_TYPE_REFERENCE =
66+ new TypeReference <>() {
67+ };
6268
6369 private final String endpointUrl ;
6470 private final JacksonMapper mapper ;
@@ -270,13 +276,13 @@ private ObjectNode makeImpExt(ObjectNode impExt, boolean addCustomParams) {
270276 return openxImpExt ;
271277 }
272278
273- private static List <BidderBid > extractBids (BidRequest bidRequest , OpenxBidResponse bidResponse ) {
279+ private List <BidderBid > extractBids (BidRequest bidRequest , OpenxBidResponse bidResponse ) {
274280 return bidResponse == null || CollectionUtils .isEmpty (bidResponse .getSeatbid ())
275281 ? Collections .emptyList ()
276282 : bidsFromResponse (bidRequest , bidResponse );
277283 }
278284
279- private static List <BidderBid > bidsFromResponse (BidRequest bidRequest , OpenxBidResponse bidResponse ) {
285+ private List <BidderBid > bidsFromResponse (BidRequest bidRequest , OpenxBidResponse bidResponse ) {
280286 final Map <String , BidType > impIdToBidType = impIdToBidType (bidRequest );
281287
282288 final String bidCurrency = StringUtils .isNotBlank (bidResponse .getCur ())
@@ -288,6 +294,7 @@ private static List<BidderBid> bidsFromResponse(BidRequest bidRequest, OpenxBidR
288294 .map (SeatBid ::getBid )
289295 .filter (Objects ::nonNull )
290296 .flatMap (Collection ::stream )
297+ .map (bid -> bid .toBuilder ().ext (updateBidMeta (bid )).build ())
291298 .map (bid -> toBidderBid (bid , impIdToBidType , bidCurrency ))
292299 .toList ();
293300 }
@@ -334,4 +341,60 @@ private static List<ExtIgi> extractIgi(OpenxBidResponse bidResponse) {
334341
335342 return igs .isEmpty () ? null : Collections .singletonList (ExtIgi .builder ().igs (igs ).build ());
336343 }
344+
345+ private ObjectNode updateBidMeta (Bid bid ) {
346+ final var ext = bid .getExt ();
347+ if (ext == null ) {
348+ return null ;
349+ }
350+
351+ final var openxBidExt = parseOpenxBidExt (ext );
352+ final int buyerId = parseStringToInt (openxBidExt .getBuyerId ());
353+ final int dspId = parseStringToInt (openxBidExt .getDspId ());
354+ final int brandId = parseStringToInt (openxBidExt .getBrandId ());
355+
356+ if (buyerId == 0 && dspId == 0 && brandId == 0 ) {
357+ return ext ;
358+ }
359+
360+ final var extPrebid = getExtPrebid (ext , bid .getId ());
361+ final var updatedMeta = ExtBidPrebidMeta .builder ()
362+ .networkId (dspId )
363+ .advertiserId (buyerId )
364+ .brandId (brandId )
365+ .build ();
366+
367+ final var modifiedExtBidPrebid = Optional .ofNullable (extPrebid .getPrebid ())
368+ .map (p -> p .toBuilder ().meta (updatedMeta ).build ())
369+ .orElse (ExtBidPrebid .builder ().meta (updatedMeta ).build ());
370+
371+ final var updatedExt = ext .deepCopy ();
372+ updatedExt .set (PREBID_EXT , mapper .mapper ().valueToTree (modifiedExtBidPrebid ));
373+
374+ return updatedExt ;
375+ }
376+
377+ private OpenxBidExt parseOpenxBidExt (ObjectNode ext ) {
378+ try {
379+ return mapper .mapper ().convertValue (ext , OpenxBidExt .class );
380+ } catch (IllegalArgumentException e ) {
381+ return new OpenxBidExt ();
382+ }
383+ }
384+
385+ private ExtPrebid <ExtBidPrebid , ObjectNode > getExtPrebid (ObjectNode bidExt , String bidId ) {
386+ try {
387+ return mapper .mapper ().convertValue (bidExt , EXT_PREBID_TYPE_REFERENCE );
388+ } catch (IllegalArgumentException e ) {
389+ throw new PreBidException ("Invalid ext in bid with id: " + bidId , e );
390+ }
391+ }
392+
393+ private int parseStringToInt (String value ) {
394+ try {
395+ return value != null ? Integer .parseInt (value ) : 0 ;
396+ } catch (NumberFormatException e ) {
397+ return 0 ;
398+ }
399+ }
337400}
0 commit comments