github.com/prebid/prebid-server@v0.275.0/adapters/aja/aja.go (about) 1 package aja 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 8 "github.com/prebid/openrtb/v19/openrtb2" 9 "github.com/prebid/prebid-server/adapters" 10 "github.com/prebid/prebid-server/config" 11 "github.com/prebid/prebid-server/errortypes" 12 "github.com/prebid/prebid-server/openrtb_ext" 13 ) 14 15 type AJAAdapter struct { 16 endpoint string 17 } 18 19 func (a *AJAAdapter) MakeRequests(bidReq *openrtb2.BidRequest, extraInfo *adapters.ExtraRequestInfo) (adapterReqs []*adapters.RequestData, errs []error) { 20 // split imps by tagid 21 tagIDs := []string{} 22 impsByTagID := map[string][]openrtb2.Imp{} 23 for _, imp := range bidReq.Imp { 24 extAJA, err := parseExtAJA(imp) 25 if err != nil { 26 errs = append(errs, err) 27 continue 28 } 29 imp.TagID = extAJA.AdSpotID 30 imp.Ext = nil 31 if _, ok := impsByTagID[imp.TagID]; !ok { 32 tagIDs = append(tagIDs, imp.TagID) 33 } 34 impsByTagID[imp.TagID] = append(impsByTagID[imp.TagID], imp) 35 } 36 37 req := *bidReq 38 for _, tagID := range tagIDs { 39 req.Imp = impsByTagID[tagID] 40 body, err := json.Marshal(req) 41 if err != nil { 42 errs = append(errs, &errortypes.BadInput{ 43 Message: fmt.Sprintf("Failed to unmarshal bidrequest ID: %s err: %s", bidReq.ID, err), 44 }) 45 continue 46 } 47 adapterReqs = append(adapterReqs, &adapters.RequestData{ 48 Method: "POST", 49 Uri: a.endpoint, 50 Body: body, 51 }) 52 } 53 54 return 55 } 56 57 func parseExtAJA(imp openrtb2.Imp) (openrtb_ext.ExtImpAJA, error) { 58 var ( 59 extImp adapters.ExtImpBidder 60 extAJA openrtb_ext.ExtImpAJA 61 ) 62 63 if err := json.Unmarshal(imp.Ext, &extImp); err != nil { 64 return extAJA, &errortypes.BadInput{ 65 Message: fmt.Sprintf("Failed to unmarshal ext impID: %s err: %s", imp.ID, err), 66 } 67 } 68 69 if err := json.Unmarshal(extImp.Bidder, &extAJA); err != nil { 70 return extAJA, &errortypes.BadInput{ 71 Message: fmt.Sprintf("Failed to unmarshal ext.bidder impID: %s err: %s", imp.ID, err), 72 } 73 } 74 75 return extAJA, nil 76 } 77 78 func (a *AJAAdapter) MakeBids(bidReq *openrtb2.BidRequest, adapterReq *adapters.RequestData, adapterResp *adapters.ResponseData) (*adapters.BidderResponse, []error) { 79 if adapterResp.StatusCode != http.StatusOK { 80 if adapterResp.StatusCode == http.StatusNoContent { 81 return nil, nil 82 } 83 if adapterResp.StatusCode == http.StatusBadRequest { 84 return nil, []error{&errortypes.BadInput{ 85 Message: fmt.Sprintf("Unexpected status code: %d", adapterResp.StatusCode), 86 }} 87 } 88 return nil, []error{&errortypes.BadServerResponse{ 89 Message: fmt.Sprintf("Unexpected status code: %d", adapterResp.StatusCode), 90 }} 91 } 92 93 var bidResp openrtb2.BidResponse 94 if err := json.Unmarshal(adapterResp.Body, &bidResp); err != nil { 95 return nil, []error{&errortypes.BadServerResponse{ 96 Message: fmt.Sprintf("Failed to unmarshal bid response: %s", err.Error()), 97 }} 98 } 99 100 bidderResp := adapters.NewBidderResponseWithBidsCapacity(len(bidReq.Imp)) 101 var errors []error 102 103 for _, seatbid := range bidResp.SeatBid { 104 for _, bid := range seatbid.Bid { 105 for _, imp := range bidReq.Imp { 106 if imp.ID == bid.ImpID { 107 var bidType openrtb_ext.BidType 108 if imp.Banner != nil { 109 bidType = openrtb_ext.BidTypeBanner 110 } else if imp.Video != nil { 111 bidType = openrtb_ext.BidTypeVideo 112 } else { 113 errors = append(errors, &errortypes.BadServerResponse{ 114 Message: fmt.Sprintf("Response received for unexpected type of bid bidID: %s", bid.ID), 115 }) 116 continue 117 } 118 bidderResp.Bids = append(bidderResp.Bids, &adapters.TypedBid{ 119 Bid: &bid, 120 BidType: bidType, 121 }) 122 break 123 } 124 } 125 } 126 } 127 if bidResp.Cur != "" { 128 bidderResp.Currency = bidResp.Cur 129 } 130 return bidderResp, errors 131 } 132 133 // Builder builds a new instance of the AJA adapter for the given bidder with the given config. 134 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { 135 bidder := &AJAAdapter{ 136 endpoint: config.Endpoint, 137 } 138 return bidder, nil 139 }