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

     1  package iqzone
     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 adapter struct {
    16  	endpoint string
    17  }
    18  
    19  func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
    20  	bidder := &adapter{
    21  		endpoint: config.Endpoint,
    22  	}
    23  	return bidder, nil
    24  }
    25  
    26  func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
    27  	var errs []error
    28  	var err error
    29  	var adapterRequests []*adapters.RequestData
    30  
    31  	reqCopy := *request
    32  	for _, imp := range request.Imp {
    33  		reqCopy.Imp = []openrtb2.Imp{imp}
    34  
    35  		var bidderExt adapters.ExtImpBidder
    36  		var iqzoneExt openrtb_ext.ImpExtIQZone
    37  
    38  		if err = json.Unmarshal(reqCopy.Imp[0].Ext, &bidderExt); err != nil {
    39  			return nil, append(errs, err)
    40  		}
    41  		if err = json.Unmarshal(bidderExt.Bidder, &iqzoneExt); err != nil {
    42  			return nil, append(errs, err)
    43  		}
    44  
    45  		finalyImpExt := reqCopy.Imp[0].Ext
    46  		if iqzoneExt.PlacementID != "" {
    47  			finalyImpExt, _ = json.Marshal(map[string]interface{}{
    48  				"bidder": map[string]interface{}{
    49  					"placementId": iqzoneExt.PlacementID,
    50  					"type":        "publisher",
    51  				},
    52  			})
    53  		} else if iqzoneExt.EndpointID != "" {
    54  			finalyImpExt, _ = json.Marshal(map[string]interface{}{
    55  				"bidder": map[string]interface{}{
    56  					"endpointId": iqzoneExt.EndpointID,
    57  					"type":       "network",
    58  				},
    59  			})
    60  		}
    61  
    62  		reqCopy.Imp[0].Ext = finalyImpExt
    63  
    64  		adapterReq, errors := a.makeRequest(&reqCopy)
    65  		if adapterReq != nil {
    66  			adapterRequests = append(adapterRequests, adapterReq)
    67  		}
    68  		errs = append(errs, errors...)
    69  	}
    70  	return adapterRequests, errs
    71  }
    72  
    73  func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, []error) {
    74  	var errs []error
    75  
    76  	reqJSON, err := json.Marshal(request)
    77  	if err != nil {
    78  		errs = append(errs, err)
    79  		return nil, errs
    80  	}
    81  
    82  	headers := http.Header{}
    83  	headers.Add("Content-Type", "application/json;charset=utf-8")
    84  	headers.Add("Accept", "application/json")
    85  	return &adapters.RequestData{
    86  		Method:  "POST",
    87  		Uri:     a.endpoint,
    88  		Body:    reqJSON,
    89  		Headers: headers,
    90  	}, errs
    91  }
    92  
    93  func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) {
    94  	if responseData.StatusCode == http.StatusNoContent {
    95  		return nil, nil
    96  	}
    97  
    98  	if responseData.StatusCode != http.StatusOK {
    99  		err := &errortypes.BadServerResponse{
   100  			Message: fmt.Sprintf("Unexpected status code: %d. Run with request.debug = 1 for more info.", responseData.StatusCode),
   101  		}
   102  		return nil, []error{err}
   103  	}
   104  
   105  	var response openrtb2.BidResponse
   106  	if err := json.Unmarshal(responseData.Body, &response); err != nil {
   107  		return nil, []error{err}
   108  	}
   109  
   110  	bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp))
   111  	bidResponse.Currency = response.Cur
   112  	for _, seatBid := range response.SeatBid {
   113  		for i := range seatBid.Bid {
   114  			bidType, err := getMediaTypeForImp(seatBid.Bid[i].ImpID, request.Imp)
   115  			if err != nil {
   116  				return nil, []error{err}
   117  			}
   118  
   119  			b := &adapters.TypedBid{
   120  				Bid:     &seatBid.Bid[i],
   121  				BidType: bidType,
   122  			}
   123  			bidResponse.Bids = append(bidResponse.Bids, b)
   124  		}
   125  	}
   126  	return bidResponse, nil
   127  }
   128  
   129  func getMediaTypeForImp(impID string, imps []openrtb2.Imp) (openrtb_ext.BidType, error) {
   130  	for _, imp := range imps {
   131  		if imp.ID == impID {
   132  			if imp.Banner != nil {
   133  				return openrtb_ext.BidTypeBanner, nil
   134  			}
   135  			if imp.Banner == nil && imp.Video != nil {
   136  				return openrtb_ext.BidTypeVideo, nil
   137  			}
   138  			if imp.Banner == nil && imp.Video == nil && imp.Native != nil {
   139  				return openrtb_ext.BidTypeNative, nil
   140  			}
   141  		}
   142  	}
   143  
   144  	return "", &errortypes.BadInput{
   145  		Message: fmt.Sprintf("Failed to find impression \"%s\"", impID),
   146  	}
   147  }