github.com/prebid/prebid-server@v0.275.0/adapters/mabidder/mabidder.go (about)

     1  package mabidder
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	"github.com/prebid/openrtb/v19/openrtb2"
     7  	"github.com/prebid/prebid-server/adapters"
     8  	"github.com/prebid/prebid-server/config"
     9  	"github.com/prebid/prebid-server/openrtb_ext"
    10  )
    11  
    12  type serverResponse struct {
    13  	Responses       []bidResponse
    14  	PrivateIdStatus string `json:"-"`
    15  }
    16  
    17  type bidResponse struct {
    18  	RequestID         string  `json:"requestId"`
    19  	Currency          string  `json:"currency"`
    20  	Width             int32   `json:"width"`
    21  	Height            int32   `json:"height"`
    22  	PlacementId       string  `json:"creativeId"`
    23  	Deal              string  `json:"dealId,omitempty"`
    24  	NetRevenue        bool    `json:"netRevenue"`
    25  	TimeToLiveSeconds int32   `json:"ttl"`
    26  	AdTag             string  `json:"ad"`
    27  	MediaType         string  `json:"mediaType"`
    28  	Meta              meta    `json:"meta"`
    29  	CPM               float32 `json:"cpm"`
    30  }
    31  
    32  type meta struct {
    33  	AdDomain []string `json:"advertiserDomains"`
    34  }
    35  
    36  type adapter struct {
    37  	endpoint string
    38  }
    39  
    40  // Builder builds a new instance of the Mabidder adapter for the given bidder with the given config.
    41  func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
    42  	bidder := &adapter{
    43  		endpoint: config.Endpoint,
    44  	}
    45  	return bidder, nil
    46  }
    47  
    48  func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
    49  	requestJSON, err := json.Marshal(request)
    50  	if err != nil {
    51  		return nil, []error{err}
    52  	}
    53  
    54  	requestData := &adapters.RequestData{
    55  		Method: "POST",
    56  		Uri:    a.endpoint,
    57  		Body:   requestJSON,
    58  	}
    59  
    60  	return []*adapters.RequestData{requestData}, nil
    61  }
    62  
    63  func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
    64  	if adapters.IsResponseStatusCodeNoContent(responseData) {
    65  		return nil, nil
    66  	}
    67  
    68  	if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil {
    69  		return nil, []error{err}
    70  	}
    71  
    72  	var response serverResponse
    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  	for _, maBidResp := range response.Responses {
    79  		b := &adapters.TypedBid{
    80  			Bid: &openrtb2.Bid{
    81  				ID:      maBidResp.RequestID,
    82  				ImpID:   maBidResp.RequestID,
    83  				Price:   float64(maBidResp.CPM),
    84  				AdM:     maBidResp.AdTag,
    85  				W:       int64(maBidResp.Width),
    86  				H:       int64(maBidResp.Height),
    87  				CrID:    maBidResp.PlacementId,
    88  				DealID:  maBidResp.Deal,
    89  				ADomain: maBidResp.Meta.AdDomain,
    90  			},
    91  			BidType: openrtb_ext.BidType(maBidResp.MediaType),
    92  		}
    93  		bidResponse.Bids = append(bidResponse.Bids, b)
    94  		if maBidResp.Currency != "" {
    95  			bidResponse.Currency = maBidResp.Currency
    96  		}
    97  	}
    98  	return bidResponse, nil
    99  }