From de1b5c2c821b263ef5f7476f1287b4628e9dad9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20DEYM=C3=88S?= <47388595+MaxSmileWanted@users.noreply.github.com> Date: Wed, 16 Jun 2021 21:33:10 +0200 Subject: [PATCH] New Adapter: Smile Wanted (#1877) * New Adapter: Smile Wanted * Implementations of changes requested by : https://github.com/prebid/prebid-server/pull/1877#pullrequestreview-676968474 * Improvement of test coverage as requested. * Implementations of changes requested by : https://github.com/prebid/prebid-server/pull/1877#pullrequestreview-683853119 --- adapters/smilewanted/params_test.go | 58 ++++++++++ adapters/smilewanted/smilewanted.go | 106 ++++++++++++++++++ adapters/smilewanted/smilewanted_test.go | 20 ++++ .../exemplary/simple-banner.json | 94 ++++++++++++++++ .../exemplary/simple-video.json | 87 ++++++++++++++ .../smilewantedtest/params/race/banner.json | 3 + .../smilewantedtest/params/race/video.json | 3 + .../supplemental/bad-server-response.json | 63 +++++++++++ .../supplemental/status-code-204.json | 59 ++++++++++ .../supplemental/status-code-400.json | 64 +++++++++++ .../supplemental/unexpected-status-code.json | 64 +++++++++++ adapters/smilewanted/usersync.go | 12 ++ adapters/smilewanted/usersync_test.go | 34 ++++++ config/config.go | 2 + exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + static/bidder-info/smilewanted.yaml | 12 ++ static/bidder-params/smilewanted.json | 14 +++ usersync/usersyncers/syncer.go | 2 + usersync/usersyncers/syncer_test.go | 1 + 20 files changed, 702 insertions(+) create mode 100644 adapters/smilewanted/params_test.go create mode 100644 adapters/smilewanted/smilewanted.go create mode 100644 adapters/smilewanted/smilewanted_test.go create mode 100644 adapters/smilewanted/smilewantedtest/exemplary/simple-banner.json create mode 100644 adapters/smilewanted/smilewantedtest/exemplary/simple-video.json create mode 100644 adapters/smilewanted/smilewantedtest/params/race/banner.json create mode 100644 adapters/smilewanted/smilewantedtest/params/race/video.json create mode 100644 adapters/smilewanted/smilewantedtest/supplemental/bad-server-response.json create mode 100644 adapters/smilewanted/smilewantedtest/supplemental/status-code-204.json create mode 100644 adapters/smilewanted/smilewantedtest/supplemental/status-code-400.json create mode 100644 adapters/smilewanted/smilewantedtest/supplemental/unexpected-status-code.json create mode 100644 adapters/smilewanted/usersync.go create mode 100644 adapters/smilewanted/usersync_test.go create mode 100644 static/bidder-info/smilewanted.yaml create mode 100644 static/bidder-params/smilewanted.json diff --git a/adapters/smilewanted/params_test.go b/adapters/smilewanted/params_test.go new file mode 100644 index 00000000000..2ea032d6ff3 --- /dev/null +++ b/adapters/smilewanted/params_test.go @@ -0,0 +1,58 @@ +package smilewanted + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/openrtb_ext" +) + +// This file actually intends to test static/bidder-params/smilewanted.json +// +// These also validate the format of the external API: request.imp[i].ext.smilewanted + +// TestValidParams makes sure that the smilewanted schema accepts all imp.ext fields which we intend to support. +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.BidderSmileWanted, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected SmileWanted params: %s", validParam) + } + } +} + +// TestInvalidParams makes sure that the SmileWanted 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.BidderSmileWanted, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{"zoneId": "zone_code"}`, +} + +var invalidParams = []string{ + `{"zoneId": 100}`, + `{"zoneId": true}`, + `{"zoneId": 123}`, + `{"zoneID": "1"}`, + ``, + `null`, + `true`, + `9`, + `1.2`, + `[]`, + `{}`, +} diff --git a/adapters/smilewanted/smilewanted.go b/adapters/smilewanted/smilewanted.go new file mode 100644 index 00000000000..376389df787 --- /dev/null +++ b/adapters/smilewanted/smilewanted.go @@ -0,0 +1,106 @@ +package smilewanted + +import ( + "encoding/json" + "fmt" + "net/http" + + "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" +) + +type adapter struct { + URI string +} + +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + + request.AT = 1 //Defaulting to first price auction for all prebid requests + + reqJSON, err := json.Marshal(request) + if err != nil { + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("Json not encoded. err: %s", 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") + headers.Add("sw-integration-type", "prebid_server") + + return []*adapters.RequestData{{ + Method: "POST", + Uri: a.URI, + Body: reqJSON, + Headers: headers, + }}, []error{} +} + +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. Run with request.debug = 1 for more info.", response.StatusCode), + }} + } + + var bidResp openrtb2.BidResponse + if err := json.Unmarshal(response.Body, &bidResp); err != nil { + return nil, []error{&errortypes.BadServerResponse{ + Message: fmt.Sprintf("Bad server response: %s.", err), + }} + } + + var bidReq openrtb2.BidRequest + if err := json.Unmarshal(externalRequest.Body, &bidReq); err != nil { + return nil, []error{err} + } + + bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid)) + sb := bidResp.SeatBid[0] + for i := 0; i < len(sb.Bid); i++ { + bid := sb.Bid[i] + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &bid, + BidType: getMediaTypeForImp(bid.ImpID, internalRequest.Imp), + }) + } + return bidResponse, nil +} + +// getMediaTypeForImp figures out which media type this bid is for. +func getMediaTypeForImp(impId string, imps []openrtb2.Imp) openrtb_ext.BidType { + mediaType := openrtb_ext.BidTypeBanner //default type + for _, imp := range imps { + if imp.ID == impId { + if imp.Video != nil { + mediaType = openrtb_ext.BidTypeVideo + } + return mediaType + } + } + return mediaType +} + +// Builder builds a new instance of the SmileWanted adapter for the given bidder with the given config. +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { + bidder := &adapter{ + URI: config.Endpoint, + } + return bidder, nil +} diff --git a/adapters/smilewanted/smilewanted_test.go b/adapters/smilewanted/smilewanted_test.go new file mode 100644 index 00000000000..75e7849e750 --- /dev/null +++ b/adapters/smilewanted/smilewanted_test.go @@ -0,0 +1,20 @@ +package smilewanted + +import ( + "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.BidderSmileWanted, config.Adapter{ + Endpoint: "http://example.com"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "smilewantedtest", bidder) +} diff --git a/adapters/smilewanted/smilewantedtest/exemplary/simple-banner.json b/adapters/smilewanted/smilewantedtest/exemplary/simple-banner.json new file mode 100644 index 00000000000..0c68d74c588 --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/exemplary/simple-banner.json @@ -0,0 +1,94 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "at" : 1, + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "test-request-id", + "at" : 1, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "smilewanted", + "bid": [{ + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "crid_10", + "h": 250, + "w": 300 + }] + } + ], + "cur": "USD" + } + } + } + ], + + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "crid_10", + "h": 250, + "w": 300 + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/smilewanted/smilewantedtest/exemplary/simple-video.json b/adapters/smilewanted/smilewantedtest/exemplary/simple-video.json new file mode 100644 index 00000000000..b3ff9ba9edd --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/exemplary/simple-video.json @@ -0,0 +1,87 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": ["video/mp4"], + "protocols": [2, 5], + "w": 1024, + "h": 576 + }, + "ext":{ + "bidder":{ + "zoneId": "zone_code_test_video" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "test-request-id", + "at": 1, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": ["video/mp4"], + "protocols": [2, 5], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_video" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "smilewanted", + "bid": [{ + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "crid_10", + "w": 1024, + "h": 576 + }] + } + ] + } + } + } + ], + + "expectedBidResponses": [ + { + "bids": [{ + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "crid_10", + "w": 1024, + "h": 576 + }, + "type": "video" + }] + } + ] +} diff --git a/adapters/smilewanted/smilewantedtest/params/race/banner.json b/adapters/smilewanted/smilewantedtest/params/race/banner.json new file mode 100644 index 00000000000..42dddd702a0 --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/params/race/banner.json @@ -0,0 +1,3 @@ +{ + "zoneId": "zone_code_test_display" +} diff --git a/adapters/smilewanted/smilewantedtest/params/race/video.json b/adapters/smilewanted/smilewantedtest/params/race/video.json new file mode 100644 index 00000000000..64ac780ecde --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/params/race/video.json @@ -0,0 +1,3 @@ +{ + "zoneId": "zone_code_test_video" +} diff --git a/adapters/smilewanted/smilewantedtest/supplemental/bad-server-response.json b/adapters/smilewanted/smilewantedtest/supplemental/bad-server-response.json new file mode 100644 index 00000000000..461ad9327a9 --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/supplemental/bad-server-response.json @@ -0,0 +1,63 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "at" : 1, + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "test-request-id", + "at" : 1, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + } + }, + "mockResponse": { + "status": 200, + "body": "bad_json" + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Bad server response: json: cannot unmarshal string into Go value of type openrtb2.BidResponse.", + "comparison": "literal" + } + ] +} diff --git a/adapters/smilewanted/smilewantedtest/supplemental/status-code-204.json b/adapters/smilewanted/smilewantedtest/supplemental/status-code-204.json new file mode 100644 index 00000000000..0d8a432e26d --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/supplemental/status-code-204.json @@ -0,0 +1,59 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "at" : 1, + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "test-request-id", + "at" : 1, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + } + }, + "mockResponse": { + "status": 204 + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [] +} diff --git a/adapters/smilewanted/smilewantedtest/supplemental/status-code-400.json b/adapters/smilewanted/smilewantedtest/supplemental/status-code-400.json new file mode 100644 index 00000000000..bdf2caa3c01 --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/supplemental/status-code-400.json @@ -0,0 +1,64 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "at" : 1, + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "test-request-id", + "at" : 1, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + } + }, + "mockResponse": { + "status": 400 + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 400.", + "comparison": "literal" + } + ] +} diff --git a/adapters/smilewanted/smilewantedtest/supplemental/unexpected-status-code.json b/adapters/smilewanted/smilewantedtest/supplemental/unexpected-status-code.json new file mode 100644 index 00000000000..49a11e3ead3 --- /dev/null +++ b/adapters/smilewanted/smilewantedtest/supplemental/unexpected-status-code.json @@ -0,0 +1,64 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "at" : 1, + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://example.com", + "body": { + "id": "test-request-id", + "at" : 1, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "zoneId": "zone_code_test_display" + } + } + } + ] + } + }, + "mockResponse": { + "status": 500 + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 500. Run with request.debug = 1 for more info.", + "comparison": "literal" + } + ] +} diff --git a/adapters/smilewanted/usersync.go b/adapters/smilewanted/usersync.go new file mode 100644 index 00000000000..8f29cb845d8 --- /dev/null +++ b/adapters/smilewanted/usersync.go @@ -0,0 +1,12 @@ +package smilewanted + +import ( + "text/template" + + "github.com/prebid/prebid-server/adapters" + "github.com/prebid/prebid-server/usersync" +) + +func NewSmileWantedSyncer(temp *template.Template) usersync.Usersyncer { + return adapters.NewSyncer("smilewanted", temp, adapters.SyncTypeRedirect) +} diff --git a/adapters/smilewanted/usersync_test.go b/adapters/smilewanted/usersync_test.go new file mode 100644 index 00000000000..497e5061554 --- /dev/null +++ b/adapters/smilewanted/usersync_test.go @@ -0,0 +1,34 @@ +package smilewanted + +import ( + "testing" + "text/template" + + "github.com/prebid/prebid-server/privacy" + "github.com/prebid/prebid-server/privacy/ccpa" + "github.com/prebid/prebid-server/privacy/gdpr" + "github.com/stretchr/testify/assert" +) + +func TestSmileWantedSyncer(t *testing.T) { + syncURL := "//csync.smilewanted.com/getuid?source=prebid-server&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect=https%3A%2F%2Flocalhost%2Fsetuid%3Fbidder%3Dsmilewanted%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID" + syncURLTemplate := template.Must( + template.New("sync-template").Parse(syncURL), + ) + + syncer := NewSmileWantedSyncer(syncURLTemplate) + syncInfo, err := syncer.GetUsersyncInfo(privacy.Policies{ + GDPR: gdpr.Policy{ + Signal: "1", + Consent: "COyASAoOyASAoAfAAAENAfCAAAAAAAAAAAAAAAAAAAAA", + }, + CCPA: ccpa.Policy{ + Consent: "1YNN", + }, + }) + + assert.NoError(t, err) + assert.Equal(t, "//csync.smilewanted.com/getuid?source=prebid-server&gdpr=1&gdpr_consent=COyASAoOyASAoAfAAAENAfCAAAAAAAAAAAAAAAAAAAAA&us_privacy=1YNN&redirect=https%3A%2F%2Flocalhost%2Fsetuid%3Fbidder%3Dsmilewanted%26gdpr%3D1%26gdpr_consent%3DCOyASAoOyASAoAfAAAENAfCAAAAAAAAAAAAAAAAAAAAA%26uid%3D%24UID", syncInfo.URL) + assert.Equal(t, "redirect", syncInfo.Type) + assert.Equal(t, false, syncInfo.SupportCORS) +} diff --git a/config/config.go b/config/config.go index 5621c2ec416..58bb40a592c 100644 --- a/config/config.go +++ b/config/config.go @@ -636,6 +636,7 @@ func (cfg *Configuration) setDerivedDefaults() { setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSmartAdserver, "https://ssbsync-global.smartadserver.com/api/sync?callerId=5&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirectUri="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dsmartadserver%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%5Bssb_sync_pid%5D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSmartRTB, "https://market-global.smrtb.com/sync/all?nid=smartrtb&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&rr="+url.QueryEscape(externalURL)+"%252Fsetuid%253Fbidder%253Dsmartrtb%2526gdpr%253D{{.GDPR}}%2526gdpr_consent%253D{{.GDPRConsent}}%2526uid%253D%257BXID%257D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSmartyAds, "https://as.ck-ie.com/prebid.gif?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redir="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dsmartyads%26uid%3D%5BUID%5D") + setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSmileWanted, "https://csync.smilewanted.com/getuid?source=prebid-server&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dsmilewanted%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSomoaudience, "https://publisher-east.mobileadtrading.com/usersync?ru="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dsomoaudience%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24%7BUID%7D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSonobi, "https://sync.go.sonobi.com/us.gif?loc="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dsonobi%26consent_string%3D{{.GDPR}}%26gdpr%3D{{.GDPRConsent}}%26uid%3D%5BUID%5D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderSovrn, "https://ap.lijit.com/pixel?redir="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dsovrn%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID") @@ -906,6 +907,7 @@ func SetupViper(v *viper.Viper, filename string) { v.SetDefault("adapters.smartadserver.endpoint", "https://ssb-global.smartadserver.com") v.SetDefault("adapters.smartrtb.endpoint", "http://market-east.smrtb.com/json/publisher/rtb?pubid={{.PublisherID}}") v.SetDefault("adapters.smartyads.endpoint", "http://{{.Host}}.smartyads.com/bid?rtb_seat_id={{.SourceId}}&secret_key={{.AccountID}}") + v.SetDefault("adapters.smilewanted.endpoint", "http://prebid-server.smilewanted.com") v.SetDefault("adapters.somoaudience.endpoint", "http://publisher-east.mobileadtrading.com/rtb/bid") v.SetDefault("adapters.sonobi.endpoint", "https://apex.go.sonobi.com/prebid?partnerid=71d9d3d8af") v.SetDefault("adapters.sovrn.endpoint", "http://ap.lijit.com/rtb/bid?src=prebid_server") diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index a773d268604..1fdb7c2489d 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -94,6 +94,7 @@ import ( "github.com/prebid/prebid-server/adapters/smartadserver" "github.com/prebid/prebid-server/adapters/smartrtb" "github.com/prebid/prebid-server/adapters/smartyads" + "github.com/prebid/prebid-server/adapters/smilewanted" "github.com/prebid/prebid-server/adapters/somoaudience" "github.com/prebid/prebid-server/adapters/sonobi" "github.com/prebid/prebid-server/adapters/sovrn" @@ -215,6 +216,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderSmartAdserver: smartadserver.Builder, openrtb_ext.BidderSmartRTB: smartrtb.Builder, openrtb_ext.BidderSmartyAds: smartyads.Builder, + openrtb_ext.BidderSmileWanted: smilewanted.Builder, openrtb_ext.BidderSomoaudience: somoaudience.Builder, openrtb_ext.BidderSonobi: sonobi.Builder, openrtb_ext.BidderSovrn: sovrn.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index ea6c809fd9b..91ce9f0d27f 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -166,6 +166,7 @@ const ( BidderSmartAdserver BidderName = "smartadserver" BidderSmartRTB BidderName = "smartrtb" BidderSmartyAds BidderName = "smartyads" + BidderSmileWanted BidderName = "smilewanted" BidderSomoaudience BidderName = "somoaudience" BidderSonobi BidderName = "sonobi" BidderSovrn BidderName = "sovrn" @@ -286,6 +287,7 @@ func CoreBidderNames() []BidderName { BidderSmartAdserver, BidderSmartRTB, BidderSmartyAds, + BidderSmileWanted, BidderSomoaudience, BidderSonobi, BidderSovrn, diff --git a/static/bidder-info/smilewanted.yaml b/static/bidder-info/smilewanted.yaml new file mode 100644 index 00000000000..81b0585bb5e --- /dev/null +++ b/static/bidder-info/smilewanted.yaml @@ -0,0 +1,12 @@ +maintainer: + email: "tech@smilewanted.com" +gvlVendorID: 639 +capabilities: + app: + mediaTypes: + - banner + - video + site: + mediaTypes: + - banner + - video diff --git a/static/bidder-params/smilewanted.json b/static/bidder-params/smilewanted.json new file mode 100644 index 00000000000..be4f9bc142d --- /dev/null +++ b/static/bidder-params/smilewanted.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "SmileWanted Adapter Params", + "description": "A schema which validates params accepted by the SmileWanted adapter", + "type": "object", + "properties": { + "zoneId": { + "type": "string", + "description": "An ID which identifies the SmileWanted zone code", + "minLength": 1 + } + }, + "required": ["zoneId"] +} diff --git a/usersync/usersyncers/syncer.go b/usersync/usersyncers/syncer.go index 88752f4d7d7..169417e07e8 100644 --- a/usersync/usersyncers/syncer.go +++ b/usersync/usersyncers/syncer.go @@ -73,6 +73,7 @@ import ( "github.com/prebid/prebid-server/adapters/smartadserver" "github.com/prebid/prebid-server/adapters/smartrtb" "github.com/prebid/prebid-server/adapters/smartyads" + "github.com/prebid/prebid-server/adapters/smilewanted" "github.com/prebid/prebid-server/adapters/somoaudience" "github.com/prebid/prebid-server/adapters/sonobi" "github.com/prebid/prebid-server/adapters/sovrn" @@ -174,6 +175,7 @@ func NewSyncerMap(cfg *config.Configuration) map[openrtb_ext.BidderName]usersync insertIntoMap(cfg, syncers, openrtb_ext.BidderSmartAdserver, smartadserver.NewSmartadserverSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderSmartRTB, smartrtb.NewSmartRTBSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderSmartyAds, smartyads.NewSmartyAdsSyncer) + insertIntoMap(cfg, syncers, openrtb_ext.BidderSmileWanted, smilewanted.NewSmileWantedSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderSynacormedia, synacormedia.NewSynacorMediaSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderTappx, tappx.NewTappxSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderTelaria, telaria.NewTelariaSyncer) diff --git a/usersync/usersyncers/syncer_test.go b/usersync/usersyncers/syncer_test.go index 2ebd541d015..0cea346e423 100644 --- a/usersync/usersyncers/syncer_test.go +++ b/usersync/usersyncers/syncer_test.go @@ -82,6 +82,7 @@ func TestNewSyncerMap(t *testing.T) { string(openrtb_ext.BidderSmartAdserver): syncConfig, string(openrtb_ext.BidderSmartRTB): syncConfig, string(openrtb_ext.BidderSmartyAds): syncConfig, + string(openrtb_ext.BidderSmileWanted): syncConfig, string(openrtb_ext.BidderSomoaudience): syncConfig, string(openrtb_ext.BidderSonobi): syncConfig, string(openrtb_ext.BidderSovrn): syncConfig,