github.com/prebid/prebid-server@v0.275.0/adapters/seedingAlliance/seedingAlliance.go (about) 1 package seedingAlliance 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "strconv" 8 "strings" 9 10 "github.com/prebid/openrtb/v19/openrtb2" 11 "github.com/prebid/prebid-server/adapters" 12 "github.com/prebid/prebid-server/config" 13 "github.com/prebid/prebid-server/errortypes" 14 "github.com/prebid/prebid-server/openrtb_ext" 15 ) 16 17 type adapter struct { 18 endpoint string 19 } 20 21 func Builder(_ openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 22 bidder := &adapter{ 23 endpoint: config.Endpoint, 24 } 25 return bidder, nil 26 } 27 28 func (a *adapter) MakeRequests(request *openrtb2.BidRequest, extraRequestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { 29 for i := range request.Imp { 30 if err := addTagID(&request.Imp[i]); err != nil { 31 return nil, []error{err} 32 } 33 } 34 35 if !curExists(request.Cur, "EUR") { 36 request.Cur = append(request.Cur, "EUR") 37 } 38 39 requestJSON, err := json.Marshal(request) 40 if err != nil { 41 return nil, []error{err} 42 } 43 44 requestData := &adapters.RequestData{ 45 Method: http.MethodPost, 46 Uri: a.endpoint, 47 Body: requestJSON, 48 } 49 50 return []*adapters.RequestData{requestData}, nil 51 } 52 53 func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { 54 if responseData.StatusCode == http.StatusNoContent { 55 return nil, nil 56 } 57 58 if responseData.StatusCode == http.StatusBadRequest { 59 err := &errortypes.BadInput{ 60 Message: "Unexpected status code: 400. Bad request from publisher. Run with request.debug = 1 for more info.", 61 } 62 return nil, []error{err} 63 } 64 65 if responseData.StatusCode != http.StatusOK { 66 err := &errortypes.BadServerResponse{ 67 Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode), 68 } 69 return nil, []error{err} 70 } 71 72 var response openrtb2.BidResponse 73 if err := json.Unmarshal(responseData.Body, &response); err != nil { 74 return nil, []error{err} 75 } 76 77 bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) 78 bidResponse.Currency = response.Cur 79 80 var errs []error 81 82 for _, seatBid := range response.SeatBid { 83 for i := range seatBid.Bid { 84 resolvePriceMacro(&seatBid.Bid[i]) 85 86 bidType, err := getMediaTypeForBid(seatBid.Bid[i].Ext) 87 if err != nil { 88 errs = append(errs, err) 89 continue 90 } 91 92 bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ 93 Bid: &seatBid.Bid[i], 94 BidType: bidType, 95 }) 96 } 97 } 98 99 return bidResponse, errs 100 } 101 102 func resolvePriceMacro(bid *openrtb2.Bid) { 103 price := strconv.FormatFloat(bid.Price, 'f', -1, 64) 104 bid.AdM = strings.Replace(bid.AdM, "${AUCTION_PRICE}", price, -1) 105 } 106 107 func getMediaTypeForBid(ext json.RawMessage) (openrtb_ext.BidType, error) { 108 var bidExt openrtb_ext.ExtBid 109 110 if err := json.Unmarshal(ext, &bidExt); err != nil { 111 return "", fmt.Errorf("could not unmarshal openrtb_ext.ExtBid: %w", err) 112 } 113 114 if bidExt.Prebid == nil { 115 return "", fmt.Errorf("bid.Ext.Prebid is empty") 116 } 117 118 return openrtb_ext.ParseBidType(string(bidExt.Prebid.Type)) 119 } 120 121 func curExists(allowedCurrencies []string, newCurrency string) bool { 122 for i := range allowedCurrencies { 123 if allowedCurrencies[i] == newCurrency { 124 return true 125 } 126 } 127 return false 128 } 129 130 func addTagID(imp *openrtb2.Imp) error { 131 var ext adapters.ExtImpBidder 132 var extSA openrtb_ext.ImpExtSeedingAlliance 133 134 if err := json.Unmarshal(imp.Ext, &ext); err != nil { 135 return fmt.Errorf("could not unmarshal adapters.ExtImpBidder: %w", err) 136 } 137 138 if err := json.Unmarshal(ext.Bidder, &extSA); err != nil { 139 return fmt.Errorf("could not unmarshal openrtb_ext.ImpExtSeedingAlliance: %w", err) 140 } 141 142 imp.TagID = extSA.AdUnitID 143 144 return nil 145 }