Skip to content

Commit

Permalink
New Adapter: BidMyAdz (prebid#1882)
Browse files Browse the repository at this point in the history
Co-authored-by: BidMyAdz <[email protected]>
  • Loading branch information
2 people authored and jizeyopera committed Oct 13, 2021
1 parent b5cb086 commit 1b17658
Show file tree
Hide file tree
Showing 27 changed files with 1,601 additions and 0 deletions.
157 changes: 157 additions & 0 deletions adapters/bidmyadz/bidmyadz.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
package bidmyadz

import (
"encoding/json"
"fmt"
"github.com/mxmCherry/openrtb/v15/openrtb2"
"github.com/prebid/prebid-server/adapters"
"github.com/prebid/prebid-server/config"
"github.com/prebid/prebid-server/errortypes"
"github.com/prebid/prebid-server/openrtb_ext"
"net/http"
)

type adapter struct {
endpoint string
}

type bidExt struct {
MediaType string `json:"mediaType"`
}

func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) {
bidder := &adapter{
endpoint: config.Endpoint,
}
return bidder, nil
}

func (a *adapter) MakeRequests(
openRTBRequest *openrtb2.BidRequest,
reqInfo *adapters.ExtraRequestInfo,
) (
requestsToBidder []*adapters.RequestData,
errs []error,
) {

var errors []error

if len(openRTBRequest.Imp) > 1 {
errors = append(errors, &errortypes.BadInput{
Message: "Bidder does not support multi impression",
})
}

if openRTBRequest.Device.IP == "" && openRTBRequest.Device.IPv6 == "" {
errors = append(errors, &errortypes.BadInput{
Message: "IP/IPv6 is a required field",
})
}

if openRTBRequest.Device.UA == "" {
errors = append(errors, &errortypes.BadInput{
Message: "User-Agent is a required field",
})
}

if len(errors) != 0 {
return nil, errors
}

reqJSON, err := json.Marshal(openRTBRequest)
if err != nil {
return nil, []error{err}
}

headers := http.Header{}
headers.Add("Content-Type", "application/json;charset=utf-8")
headers.Add("Accept", "application/json")
headers.Add("X-Openrtb-Version", "2.5")

return []*adapters.RequestData{{
Method: http.MethodPost,
Body: reqJSON,
Uri: a.endpoint,
Headers: headers,
}}, nil
}

func (a *adapter) MakeBids(
openRTBRequest *openrtb2.BidRequest,
requestToBidder *adapters.RequestData,
bidderRawResponse *adapters.ResponseData,
) (
bidderResponse *adapters.BidderResponse,
errs []error,
) {
if bidderRawResponse.StatusCode == http.StatusNoContent {
return nil, nil
}

if bidderRawResponse.StatusCode == http.StatusBadRequest {
return nil, []error{&errortypes.BadInput{
Message: fmt.Sprintf("Bad Request. %s", string(bidderRawResponse.Body)),
}}
}

if bidderRawResponse.StatusCode == http.StatusServiceUnavailable {
return nil, []error{&errortypes.BadServerResponse{
Message: "Bidder is unavailable. Please contact your account manager.",
}}
}

if bidderRawResponse.StatusCode != http.StatusOK {
return nil, []error{&errortypes.BadServerResponse{
Message: fmt.Sprintf("Something went wrong. Status Code: [ %d ] %s", bidderRawResponse.StatusCode, string(bidderRawResponse.Body)),
}}
}

responseBody := bidderRawResponse.Body
var bidResp openrtb2.BidResponse
if err := json.Unmarshal(responseBody, &bidResp); err != nil {
return nil, []error{err}
}

if len(bidResp.SeatBid) == 0 {
return nil, []error{&errortypes.BadServerResponse{
Message: "Empty SeatBid",
}}
}

bidResponse := adapters.NewBidderResponseWithBidsCapacity(1)

bids := bidResp.SeatBid[0].Bid

if len(bids) == 0 {
return nil, []error{&errortypes.BadServerResponse{
Message: "Empty SeatBid.Bids",
}}
}

bid := bids[0]

var bidExt bidExt
var bidType openrtb_ext.BidType

if err := json.Unmarshal(bid.Ext, &bidExt); err != nil {
return nil, []error{&errortypes.BadServerResponse{
Message: fmt.Sprintf("BidExt parsing error. %s", err.Error()),
}}
}

bidType, err := getBidType(bidExt)

if err != nil {
return nil, []error{err}
}

bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
Bid: &bid,
BidType: bidType,
})
return bidResponse, nil
}

func getBidType(ext bidExt) (openrtb_ext.BidType, error) {
return openrtb_ext.ParseBidType(ext.MediaType)
}
18 changes: 18 additions & 0 deletions adapters/bidmyadz/bidmyadz_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package bidmyadz

import (
"github.com/stretchr/testify/assert"
"testing"

"github.com/prebid/prebid-server/adapters/adapterstest"
"github.com/prebid/prebid-server/config"
"github.com/prebid/prebid-server/openrtb_ext"
)

func TestJsonSamples(t *testing.T) {
bidder, buildErr := Builder(openrtb_ext.BidderBidmyadz, config.Adapter{
Endpoint: "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc"})

assert.NoError(t, buildErr)
adapterstest.RunJSONBidderTest(t, "bidmyadztest", bidder)
}
146 changes: 146 additions & 0 deletions adapters/bidmyadz/bidmyadztest/exemplary/banner.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
{
"mockBidRequest": {
"id": "12345",
"imp": [{
"id": "1",
"secure": 1,
"bidfloor": 0.31,
"bidfloorcur": "USD",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"bidder": {
"placementId": "tbanner"
}
}
}],
"device": {
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
"geo": {
"country": "USA",
"lat": 47.627500,
"lon": -122.346200
},
"ip": "18.146.18.241",
"devicetype": 2
},
"user": {
"id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5"
},
"site": {
"id": "banner",
"domain": "test.com",
"cat": ["IAB1"],
"page": "https://test.com",
"publisher": {
"id": "1"
}
}
},

"httpCalls": [
{
"expectedRequest": {
"uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc",
"body": {
"id": "12345",
"imp": [{
"id": "1",
"secure": 1,
"bidfloor": 0.31,
"bidfloorcur": "USD",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"bidder": {
"placementId": "tbanner"
}
}
}],
"device": {
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
"geo": {
"country": "USA",
"lat": 47.627500,
"lon": -122.346200
},
"ip": "18.146.18.241",
"devicetype": 2
},
"user": {
"id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5"
},
"site": {
"id": "banner",
"domain": "test.com",
"cat": ["IAB1"],
"page": "https://test.com",
"publisher": {
"id": "1"
}
}
}
},
"mockResponse": {
"status": 200,
"body": {
"id": "d910ceef496ff2d746176506e296f4b3_z53356_a126365",
"bidid": "880184da7ec02b1f42802acb46b63b3c",
"seatbid": [{
"bid": [{
"id": "6ca51ef38eb42820d27503ee96b634b5",
"impid": "126365",
"price": 0.1,
"nurl": "http://test.com/nurl",
"burl": "http://test.com/burl",
"adm": "<ADM>",
"adomain": ["test.com"],
"cat": ["IAB1"],
"cid": "1",
"crid": "1",
"w": 300,
"h": 250,
"ext": {
"mediaType": "banner"
}
}],
"seat": "1"
}],
"cur": "USD"
}
}
}
],

"expectedBidResponses": [
{
"currency": "USD",
"bids": [
{
"bid": {
"id": "6ca51ef38eb42820d27503ee96b634b5",
"impid": "126365",
"price": 0.1,
"nurl": "http://test.com/nurl",
"burl": "http://test.com/burl",
"adm": "<ADM>",
"adomain": ["test.com"],
"cat": ["IAB1"],
"cid": "1",
"crid": "1",
"w": 300,
"h": 250,
"ext": {
"mediaType": "banner"
}
},
"type": "banner"
}
]
}
]
}
Loading

0 comments on commit 1b17658

Please sign in to comment.