diff --git a/adapters/algorix/algorix.go b/adapters/algorix/algorix.go new file mode 100644 index 00000000000..7c0a6787c7b --- /dev/null +++ b/adapters/algorix/algorix.go @@ -0,0 +1,166 @@ +package algorix + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "text/template" + + "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/macros" + "github.com/prebid/prebid-server/openrtb_ext" +) + +type adapter struct { + EndpointTemplate template.Template +} + +// Builder builds a new instance of the AlgoriX adapter for the given bidder with the given config. +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { + endpoint, err := template.New("endpointTemplate").Parse(config.Endpoint) + if err != nil { + return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) + } + bidder := &adapter{ + EndpointTemplate: *endpoint, + } + return bidder, nil +} + +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + var adapterRequests []*adapters.RequestData + var errs []error + + adapterRequest, err := a.makeRequest(request) + if err == nil { + adapterRequests = append(adapterRequests, adapterRequest) + } else { + errs = append(errs, err) + } + return adapterRequests, errs +} + +func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) { + algorixExt, err := getImpAlgoriXExt(&request.Imp[0]) + + if err != nil { + return nil, &errortypes.BadInput{Message: "Invalid ExtImpAlgoriX value"} + } + + endPoint, err := a.getEndPoint(algorixExt) + if err != nil { + return nil, err + } + + preProcess(request) + reqBody, err := json.Marshal(request) + if err != nil { + return nil, 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: "POST", + Uri: endPoint, + Body: reqBody, + Headers: headers, + }, nil +} + +// get ImpAlgoriXExt From First Imp. Only check and get first Imp.Ext.Bidder to ExtImpAlgorix +func getImpAlgoriXExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpAlgorix, error) { + var extImpAlgoriX openrtb_ext.ExtImpAlgorix + var extBidder adapters.ExtImpBidder + err := json.Unmarshal(imp.Ext, &extBidder) + if err != nil { + return nil, err + } + err = json.Unmarshal(extBidder.Bidder, &extImpAlgoriX) + if err != nil { + return nil, err + } + return &extImpAlgoriX, nil +} + +func (a *adapter) getEndPoint(ext *openrtb_ext.ExtImpAlgorix) (string, error) { + endPointParams := macros.EndpointTemplateParams{ + SourceId: url.PathEscape(ext.Sid), + AccountID: url.PathEscape(ext.Token), + } + return macros.ResolveMacros(a.EndpointTemplate, endPointParams) +} + +func preProcess(request *openrtb2.BidRequest) { + for i := range request.Imp { + if request.Imp[i].Banner != nil { + banner := *request.Imp[i].Banner + if (banner.W == nil || banner.H == nil || *banner.W == 0 || *banner.H == 0) && len(banner.Format) > 0 { + firstFormat := banner.Format[0] + banner.W = &firstFormat.W + banner.H = &firstFormat.H + request.Imp[i].Banner = &banner + } + } + } +} + +func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { + if response.StatusCode == http.StatusNoContent { + return nil, nil + } + + if response.StatusCode == http.StatusBadRequest { + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("Unexpected status code: %d.", response.StatusCode), + }} + } + + if response.StatusCode != http.StatusOK { + return nil, []error{&errortypes.BadServerResponse{ + Message: fmt.Sprintf("Unexpected status code: %d.", response.StatusCode), + }} + } + + var bidResp openrtb2.BidResponse + if err := json.Unmarshal(response.Body, &bidResp); err != nil { + return nil, []error{err} + } + + bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) + + for _, seatBid := range bidResp.SeatBid { + for idx := range seatBid.Bid { + mediaType := getBidType(seatBid.Bid[idx].ImpID, internalRequest.Imp) + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &seatBid.Bid[idx], + BidType: mediaType, + }) + } + } + return bidResponse, nil +} + +func getBidType(impId string, imps []openrtb2.Imp) openrtb_ext.BidType { + for _, imp := range imps { + if imp.ID == impId { + if imp.Banner != nil { + break + } + if imp.Native != nil { + return openrtb_ext.BidTypeNative + } + if imp.Video != nil { + return openrtb_ext.BidTypeVideo + } + } + } + return openrtb_ext.BidTypeBanner +} diff --git a/adapters/algorix/algorix_test.go b/adapters/algorix/algorix_test.go new file mode 100644 index 00000000000..55c8b9ef58e --- /dev/null +++ b/adapters/algorix/algorix_test.go @@ -0,0 +1,27 @@ +package algorix + +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.BidderAlgorix, config.Adapter{ + Endpoint: "https://test.com?sid={{.SourceId}}&token={{.AccountID}}"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "algorixtest", bidder) +} + +func TestEndpointTemplateMalformed(t *testing.T) { + _, buildErr := Builder(openrtb_ext.BidderAlgorix, config.Adapter{Endpoint: "{{Malformed}}"}) + + assert.Error(t, buildErr) +} diff --git a/adapters/algorix/algorixtest/exemplary/sample-banner.json b/adapters/algorix/algorixtest/exemplary/sample-banner.json new file mode 100644 index 00000000000..118f89c1b3d --- /dev/null +++ b/adapters/algorix/algorixtest/exemplary/sample-banner.json @@ -0,0 +1,83 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id":"test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "ttx", + "bid": [{ + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }] + } + ], + "cur": "USD" + } + } + } + ], + + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/algorix/algorixtest/exemplary/sample-native.json b/adapters/algorix/algorixtest/exemplary/sample-native.json new file mode 100644 index 00000000000..283e6a2bfb4 --- /dev/null +++ b/adapters/algorix/algorixtest/exemplary/sample-native.json @@ -0,0 +1,82 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + "httpcalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":4,\"plcmtcnt\":1,\"assets\":[{\"id\":2,\"required\":1,\"title\":{\"len\":90}},{\"id\":6,\"required\":1,\"img\":{\"type\":3,\"wmin\":128,\"hmin\":128,\"mimes\":[\"image/jpg\",\"image/jpeg\",\"image/png\"]}},{\"id\":7,\"required\":1,\"data\":{\"type\":2,\"len\":120}}]}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "8400d766-58b3-47d4-80d7-6658b337d403", + "impid": "test-imp-id", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid" + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8400d766-58b3-47d4-80d7-6658b337d403", + "impid": "test-imp-id", + "price": 1.2, + "adm": "some ads", + "crid": "crid_testid" + + }, + "type": "native" + } + ] + } + ] +} diff --git a/adapters/algorix/algorixtest/exemplary/sample-nobid.json b/adapters/algorix/algorixtest/exemplary/sample-nobid.json new file mode 100644 index 00000000000..4ea2e61e5d2 --- /dev/null +++ b/adapters/algorix/algorixtest/exemplary/sample-nobid.json @@ -0,0 +1,53 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id":"test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 204, + "body": {} + } + } + ], + + "expectedBidResponses": [] + +} diff --git a/adapters/algorix/algorixtest/exemplary/sample-video.json b/adapters/algorix/algorixtest/exemplary/sample-video.json new file mode 100644 index 00000000000..5507e6a9d38 --- /dev/null +++ b/adapters/algorix/algorixtest/exemplary/sample-video.json @@ -0,0 +1,89 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "w": 320, + "h": 480, + "mimes": [ + "video/mp4" + ] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id":"test-imp-id", + "video": { + "w": 320, + "h": 480, + "mimes": [ + "video/mp4" + ] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "ttx", + "bid": [{ + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 1.2, + "adm": "some-ads", + "crid": "crid_testid" + }] + } + ], + "cur": "USD" + } + } + } + ], + + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 1.2, + "adm": "some-ads", + "crid": "crid_testid" + }, + "type": "video" + } + ] + } + ] +} diff --git a/adapters/algorix/algorixtest/supplemental/bad_imp_ext.json b/adapters/algorix/algorixtest/supplemental/bad_imp_ext.json new file mode 100644 index 00000000000..38abadb2d34 --- /dev/null +++ b/adapters/algorix/algorixtest/supplemental/bad_imp_ext.json @@ -0,0 +1,21 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": "badExt" + } + ] + }, + + "expectedMakeRequestsErrors": [ + { + "value": "Invalid ExtImpAlgoriX value", + "comparison": "literal" + } + ] +} diff --git a/adapters/algorix/algorixtest/supplemental/bad_impext_bidder.json b/adapters/algorix/algorixtest/supplemental/bad_impext_bidder.json new file mode 100644 index 00000000000..669e22b081a --- /dev/null +++ b/adapters/algorix/algorixtest/supplemental/bad_impext_bidder.json @@ -0,0 +1,23 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": { + "bidder": "badBidder" + } + } + ] + }, + + "expectedMakeRequestsErrors": [ + { + "value": "Invalid ExtImpAlgoriX value", + "comparison": "literal" + } + ] +} diff --git a/adapters/algorix/algorixtest/supplemental/bad_response.json b/adapters/algorix/algorixtest/supplemental/bad_response.json new file mode 100644 index 00000000000..17d846733db --- /dev/null +++ b/adapters/algorix/algorixtest/supplemental/bad_response.json @@ -0,0 +1,57 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id":"test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": "{\"id\":test-request-id" + } + } + ], + + "expectedMakeBidsErrors": [ + { + "comparison": "literal", + "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse" + } + ] +} diff --git a/adapters/algorix/algorixtest/supplemental/status_400.json b/adapters/algorix/algorixtest/supplemental/status_400.json new file mode 100644 index 00000000000..f384c3b9446 --- /dev/null +++ b/adapters/algorix/algorixtest/supplemental/status_400.json @@ -0,0 +1,57 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id":"test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 400, + "body": {} + } + } + ], + + "expectedMakeBidsErrors": [ + { + "comparison": "literal", + "value": "Unexpected status code: 400." + } + ] +} diff --git a/adapters/algorix/algorixtest/supplemental/status_500.json b/adapters/algorix/algorixtest/supplemental/status_500.json new file mode 100644 index 00000000000..ca6cf14ba84 --- /dev/null +++ b/adapters/algorix/algorixtest/supplemental/status_500.json @@ -0,0 +1,57 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}] + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://test.com?sid=testSid&token=testToken", + "body": { + "id": "test-request-id", + "imp": [ + { + "id":"test-imp-id", + "banner": { + "format": [{"w": 320, "h": 50}], + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "sid": "testSid", + "token": "testToken" + } + } + } + ] + } + }, + "mockResponse": { + "status": 500, + "body": {} + } + } + ], + + "expectedMakeBidsErrors": [ + { + "comparison": "literal", + "value": "Unexpected status code: 500." + } + ] +} diff --git a/adapters/algorix/params_test.go b/adapters/algorix/params_test.go new file mode 100644 index 00000000000..18a2779fe4a --- /dev/null +++ b/adapters/algorix/params_test.go @@ -0,0 +1,47 @@ +package algorix + +import ( + "encoding/json" + "github.com/prebid/prebid-server/openrtb_ext" + "testing" +) + +func TestValidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, validParam := range validParams { + if err := validator.Validate(openrtb_ext.BidderAlgorix, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected algoirx params: %s", validParam) + } + } +} + +// TestInvalidParams makes sure that the algorix schema rejects all the imp.ext fields we don't support. +func TestInvalidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, invalidParam := range invalidParams { + if err := validator.Validate(openrtb_ext.BidderAlgorix, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{"sid": "11233", "token": "sin"}`, + `{"sid": "11244", "token": "iad"}`, +} + +var invalidParams = []string{ + `{"sid": "11233"}`, + `{"token": "aaa"}`, + `{"sid": 123, "token": "sin"}`, + `{"sid": "", "token": "iad"}`, + `{"sid": "11233", "token": ""}`, +} diff --git a/config/config.go b/config/config.go index 27e917e4333..bbe1b619b3c 100644 --- a/config/config.go +++ b/config/config.go @@ -831,6 +831,7 @@ func SetupViper(v *viper.Viper, filename string) { v.SetDefault("adapters.adxcg.disabled", true) v.SetDefault("adapters.adyoulike.endpoint", "https://broker.omnitagjs.com/broker/bid?partnerId=19340f4f097d16f41f34fc0274981ca4") v.SetDefault("adapters.aja.endpoint", "https://ad.as.amanad.adtdp.com/v1/bid/4") + v.SetDefault("adapters.algorix.endpoint", "https://xyz.svr-algorix.com/rtb/sa?sid={{.SourceId}}&token={{.AccountID}}") v.SetDefault("adapters.amx.endpoint", "http://pbs.amxrtb.com/auction/openrtb") v.SetDefault("adapters.applogy.endpoint", "http://rtb.applogy.com/v1/prebid") v.SetDefault("adapters.appnexus.endpoint", "http://ib.adnxs.com/openrtb2") // Docs: https://wiki.appnexus.com/display/supply/Incoming+Bid+Request+from+SSPs diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 8cee98429d8..39292ef9c0c 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -23,6 +23,7 @@ import ( "github.com/prebid/prebid-server/adapters/adxcg" "github.com/prebid/prebid-server/adapters/adyoulike" "github.com/prebid/prebid-server/adapters/aja" + "github.com/prebid/prebid-server/adapters/algorix" "github.com/prebid/prebid-server/adapters/amx" "github.com/prebid/prebid-server/adapters/applogy" "github.com/prebid/prebid-server/adapters/appnexus" @@ -140,6 +141,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderAdxcg: adxcg.Builder, openrtb_ext.BidderAdyoulike: adyoulike.Builder, openrtb_ext.BidderAJA: aja.Builder, + openrtb_ext.BidderAlgorix: algorix.Builder, openrtb_ext.BidderAMX: amx.Builder, openrtb_ext.BidderApplogy: applogy.Builder, openrtb_ext.BidderAppnexus: appnexus.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index 1bc75d5f63e..ea10428f723 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -94,6 +94,7 @@ const ( BidderAdxcg BidderName = "adxcg" BidderAdyoulike BidderName = "adyoulike" BidderAJA BidderName = "aja" + BidderAlgorix BidderName = "algorix" BidderAMX BidderName = "amx" BidderApplogy BidderName = "applogy" BidderAppnexus BidderName = "appnexus" @@ -212,6 +213,7 @@ func CoreBidderNames() []BidderName { BidderAdxcg, BidderAdyoulike, BidderAJA, + BidderAlgorix, BidderAMX, BidderApplogy, BidderAppnexus, diff --git a/openrtb_ext/imp_algorix.go b/openrtb_ext/imp_algorix.go new file mode 100644 index 00000000000..e63a45ee11e --- /dev/null +++ b/openrtb_ext/imp_algorix.go @@ -0,0 +1,7 @@ +package openrtb_ext + +// ExtImpAlgoriX defines the contract for bidrequest.imp[i].ext.algorix +type ExtImpAlgorix struct { + Sid string `json:"sid"` + Token string `json:"token"` +} diff --git a/static/bidder-info/algorix.yaml b/static/bidder-info/algorix.yaml new file mode 100644 index 00000000000..b8301d6cb79 --- /dev/null +++ b/static/bidder-info/algorix.yaml @@ -0,0 +1,8 @@ +maintainer: + email: "xunyunbo@algorix.co" +capabilities: + app: + mediaTypes: + - banner + - video + - native \ No newline at end of file diff --git a/static/bidder-params/algorix.json b/static/bidder-params/algorix.json new file mode 100644 index 00000000000..732625f4549 --- /dev/null +++ b/static/bidder-params/algorix.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "AlgoriX Adapter Params", + "description": "A schema which validates params accepted by the AlgoriX adapter", + "type": "object", + "properties": { + "sid": { + "type": "string", + "description": "Your Sid", + "minLength": 1 + }, + "token": { + "type": "string", + "description": "Your Token", + "minLength": 1 + } + }, + "required": ["sid", "token"] +} \ No newline at end of file diff --git a/usersync/usersyncers/syncer_test.go b/usersync/usersyncers/syncer_test.go index 07e09695beb..dff43835e51 100644 --- a/usersync/usersyncers/syncer_test.go +++ b/usersync/usersyncers/syncer_test.go @@ -110,6 +110,7 @@ func TestNewSyncerMap(t *testing.T) { openrtb_ext.BidderAdoppler: true, openrtb_ext.BidderAdot: true, openrtb_ext.BidderAdprime: true, + openrtb_ext.BidderAlgorix: true, openrtb_ext.BidderApplogy: true, openrtb_ext.BidderBidmachine: true, openrtb_ext.BidderBidsCube: true,