Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
7a83524
added initila Pixfuture adapter files and codesd
pixfuture-media Dec 5, 2024
fc1d61a
Miodified vendors timewait
pixfuture-media Dec 5, 2024
34cd2d7
Adding test file
pixfuture-media Dec 9, 2024
c4b7a14
Added prams_test.go
pixfuture-media Dec 9, 2024
59255a5
Changing pix endpoint to srv-adapter.pixfuture.com
pixfuture-media Dec 9, 2024
f30cbc3
Made changes in test.go
pixfuture-media Dec 10, 2024
b14b4fd
Addede changes to pixfuture_test.go
pixfuture-media Dec 10, 2024
88036bb
update coverage.out
pixfuture-media Dec 13, 2024
aac8de6
added doc
pixfuture-media Dec 13, 2024
aeb716d
fixing bags
pixfuture-media Dec 18, 2024
41fb281
Fixed naming convention issue for Pixfuture adapter to align with bes…
pixfuture-media Dec 19, 2024
df6eb36
Made changes regarding github-actions
pixfuture-media Jan 13, 2025
aca9ec1
Made changes regarding github-actions
pixfuture-media Jan 13, 2025
723b28b
Made changes regarding go test
pixfuture-media Jan 15, 2025
6db0f45
Made changes regarding go test
pixfuture-media Jan 17, 2025
c6c6a19
Update adapters/pixfuture/pixfuture.go
pixfuture-media Jan 30, 2025
82bec02
Update adapters/pixfuture/pixfuture.go
pixfuture-media Jan 30, 2025
f85084e
Update adapters/pixfuture/pixfuture.go
pixfuture-media Jan 30, 2025
3330238
Update adapters/pixfuture/pixfuture.go
pixfuture-media Jan 30, 2025
c355b44
Made changes in Pixfuture.go
pixfuture-media Jan 30, 2025
ee438fd
Made changes regarding GitHub reviews
pixfuture-media Jan 31, 2025
2dad857
Made changes regarding GitHub reviews
pixfuture-media Jan 31, 2025
f7a72ea
Made changes regarding GitHub reviews
pixfuture-media Jan 31, 2025
43a3034
Made changes regarding GitHub reviews
pixfuture-media Jan 31, 2025
1535a27
Made changes regarding GitHub reviews
pixfuture-media Jan 31, 2025
a4c7c88
Made changes regarding GitHub reviews
pixfuture-media Feb 3, 2025
e35700d
Made changes regarding GitHub reviews
pixfuture-media Feb 14, 2025
404d5ca
Made changes regarding GitHub reviews
Feb 20, 2025
4041965
Made changes regarding GitHub reviews
pixfuture-media Feb 24, 2025
5f2cb3b
Made changes regarding GitHub reviews
pixfuture-media Mar 14, 2025
e01dde8
Made changes regarding GitHub reviews
pixfuture-media Mar 17, 2025
97516e4
Update adapters/pixfuture/pixfuture.go
pixfuture-media Mar 17, 2025
32669fc
Made changes regarding GitHub reviews
pixfuture-media Mar 17, 2025
c33d08d
Made changes regarding GitHub reviews
pixfuture-media Mar 17, 2025
0a4a004
Made changes regarding GitHub reviews
pixfuture-media Mar 17, 2025
40f5f29
Made changes regarding GitHub reviews
pixfuture-media Apr 2, 2025
af4cf67
Made changes regarding GitHub reviews
pixfuture-media Apr 10, 2025
cb13d25
Made changes regarding GitHub reviews
pixfuture-media Apr 17, 2025
783141a
Made changes regarding GitHub reviews
pixfuture-media Apr 21, 2025
7e89e56
Made changes regarding GitHub reviews
pixfuture-media Apr 24, 2025
9dd0ccc
Made changes regarding GitHub reviews
pixfuture-media Jul 21, 2025
9acc184
Made changes regarding GitHub reviews
pixfuture-media Jul 21, 2025
d4ad885
Made changes regarding GitHub reviews
pixfuture-media Jul 25, 2025
5a0a0e8
Update code based on feedback received from Prebid team
pixfuture-media Nov 14, 2025
821430d
Fix validation issues and clean code
pixfuture-media Nov 17, 2025
d5aaaa4
Enhance bid response processing and error handling
pixfuture-media Feb 13, 2026
09db5ea
Add GPP and GPP SID to userSync URL
pixfuture-media Feb 13, 2026
0049984
Remove BidderPixfuture from bidders list
pixfuture-media Feb 13, 2026
deb041f
Add BidderPixfuture to the list of bidders
pixfuture-media Feb 13, 2026
9fc523d
Update import paths to v4 in pixfuture.go
pixfuture-media Mar 10, 2026
9526c76
Update import path for openrtb_ext to v4
pixfuture-media Mar 10, 2026
ef8cb5e
Update params_test.go
pixfuture-media Mar 10, 2026
131920a
Update import paths to use v4 version
pixfuture-media Mar 10, 2026
1b465ab
Merge branch 'prebid:master' into master
pixfuture-media Apr 15, 2026
b08b0c5
Refactor getMediaTypeForBid function
pixfuture-media Apr 15, 2026
2cd1a77
Add 'mtype' field to banner-site.json
pixfuture-media Apr 15, 2026
e4956f8
Add 'mtype' field to video JSON entries
pixfuture-media Apr 15, 2026
c72597d
Add 'mtype' field to video ad objects
pixfuture-media Apr 15, 2026
c369aa6
Add 'mtype' field to bid objects in native.json
pixfuture-media Apr 15, 2026
57184c4
Merge branch 'master' into master
pixfuture-media Apr 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions adapters/pixfuture/params_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package pixfuture

import (
"encoding/json"
"testing"

"github.com/prebid/prebid-server/v4/openrtb_ext"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestValidParams(t *testing.T) {
validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
require.NoError(t, err, "Failed to fetch the json schema.")

tests := []struct {
name string
json string
}{
{
name: "Minimum length satisfied",
json: `{"pix_id": "123"}`,
},
{
name: "Longer valid string",
json: `{"pix_id": "abcdef"}`,
},
}

for _, tt := range tests {
tt := tt // capture range variable
t.Run(tt.name, func(t *testing.T) {
assert.NoErrorf(t, validator.Validate(openrtb_ext.BidderPixfuture, json.RawMessage(tt.json)), "Schema rejected valid params: %s", tt.json)
})
}
}

func TestInvalidParams(t *testing.T) {
validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params")
require.NoError(t, err, "Failed to fetch the json schema.")

tests := []struct {
name string
json string
}{
{
name: "Wrong type (integer)",
json: `{"pix_id": 123}`,
},
{
name: "Too short (minLength: 3)",
json: `{"pix_id": "ab"}`,
},
{
name: "Missing required pix_id",
json: `{}`,
},
{
name: "Empty string (violates minLength)",
json: `{"pix_id": ""}`,
},
}

for _, tt := range tests {
tt := tt // capture range variable
t.Run(tt.name, func(t *testing.T) {
err := validator.Validate(openrtb_ext.BidderPixfuture, json.RawMessage(tt.json))
assert.Errorf(t, err, "Schema allowed invalid params: %s", tt.json)
})
}
}
150 changes: 150 additions & 0 deletions adapters/pixfuture/pixfuture.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
// Package pixfuture implements the Pixfuture adapter for Prebid Server.
// It provides functionality to handle bid requests and responses according to Pixfuture's specifications
package pixfuture

import (
"fmt"
"net/http"

"github.com/prebid/openrtb/v20/openrtb2"
"github.com/prebid/prebid-server/v4/adapters"
"github.com/prebid/prebid-server/v4/config"
"github.com/prebid/prebid-server/v4/errortypes"
"github.com/prebid/prebid-server/v4/openrtb_ext"
"github.com/prebid/prebid-server/v4/util/iterutil"
"github.com/prebid/prebid-server/v4/util/jsonutil"
)

type adapter struct {
endpoint string
}

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

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

var errs []error
var adapterRequests []*adapters.RequestData
headers := http.Header{}
headers.Set("Content-Type", "application/json")
headers.Set("Accept", "application/json")

for imp := range iterutil.SlicePointerValues(request.Imp) {

var bidderExt adapters.ExtImpBidder
var pixfutureExt openrtb_ext.ImpExtPixfuture

if err := jsonutil.Unmarshal(imp.Ext, &bidderExt); err != nil {
errs = append(errs, err)
continue
}
if err := jsonutil.Unmarshal(bidderExt.Bidder, &pixfutureExt); err != nil {
errs = append(errs, err)
continue
}
if pixfutureExt.PixID == "" {
errs = append(errs, &errortypes.BadInput{Message: "Missing required parameter pix_id"})
continue
}

requestCopy := *request
requestCopy.Imp = []openrtb2.Imp{*imp} // slice notation with dereferencing

reqJSON, err := jsonutil.Marshal(requestCopy)
if err != nil {
errs = append(errs, err)
continue
}

adapterRequests = append(adapterRequests, &adapters.RequestData{
Method: http.MethodPost,
Uri: a.endpoint,
Body: reqJSON,
Headers: headers,
ImpIDs: []string{imp.ID},
})
}

if len(adapterRequests) == 0 && len(errs) > 0 {
return nil, errs
}
return adapterRequests, errs
}

func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) {
if adapters.IsResponseStatusCodeNoContent(response) {
return nil, nil
}

if err := adapters.CheckResponseStatusCodeForErrors(response); err != nil {
return nil, []error{err}
}

var bidResp openrtb2.BidResponse
// Step 1: Check if body is empty to avoid unnecessary unmarshal overhead
if len(response.Body) == 0 {
return nil, nil // Or return a specific error if Pixfuture always expects a body
}

// Step 2: The Unmarshal call (Lines 88-92)
if err := jsonutil.Unmarshal(response.Body, &bidResp); err != nil {
return nil, []error{&errortypes.BadServerResponse{
Message: fmt.Sprintf("Invalid response format: %s", err.Error()),
}}
}

// Pre-calculate total number of bids
expectedBids := 0
for i := range bidResp.SeatBid {
expectedBids += len(bidResp.SeatBid[i].Bid)
}

bidResponse := adapters.NewBidderResponseWithBidsCapacity(expectedBids)
bidResponse.Currency = bidResp.Cur

var errs []error
for i := range bidResp.SeatBid {
// Use index j to avoid copying the large openrtb2.Bid struct
for j := range bidResp.SeatBid[i].Bid {
bid := &bidResp.SeatBid[i].Bid[j]

bidType, err := getMediaTypeForBid(bid)
if err != nil {
errs = append(errs, &errortypes.BadServerResponse{
Message: "Failed to parse impression \"" + bid.ImpID + "\" mediatype",
})
continue
}

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

if len(bidResponse.Bids) == 0 {
return nil, errs
}

return bidResponse, errs
}

func getMediaTypeForBid(bid *openrtb2.Bid) (openrtb_ext.BidType, error) {
switch bid.MType {
case openrtb2.MarkupBanner:
return openrtb_ext.BidTypeBanner, nil
case openrtb2.MarkupVideo:
return openrtb_ext.BidTypeVideo, nil
case openrtb2.MarkupNative:
return openrtb_ext.BidTypeNative, nil
default:
return "", &errortypes.BadServerResponse{
Message: fmt.Sprintf("Failed to parse bid mediatype for impression %s from MType", bid.ImpID),
}
}
}
19 changes: 19 additions & 0 deletions adapters/pixfuture/pixfuture_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package pixfuture

import (
"testing"

"github.com/prebid/prebid-server/v4/adapters/adapterstest"
"github.com/prebid/prebid-server/v4/config"
"github.com/prebid/prebid-server/v4/openrtb_ext"
"github.com/stretchr/testify/require"
)

func TestJsonSamples(t *testing.T) {
bidder, buildErr := Builder(openrtb_ext.BidderPixfuture, config.Adapter{
Endpoint: "http://any.url",
}, config.Server{})
require.NoError(t, buildErr, "Builder returned unexpected error")

adapterstest.RunJSONBidderTest(t, "pixfuturetest", bidder)
}
113 changes: 113 additions & 0 deletions adapters/pixfuture/pixfuturetest/exemplary/banner-site.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
{
"mockBidRequest": {
"id": "test-request-id",
"site": {
"page": "test.com",
"publisher": {
"id": "123456789"
}
},
"imp": [
{
"id": "imp1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"bidder": {
"pix_id": "55463"
}
}
}
]
},
"httpCalls": [
{
"expectedRequest": {
"uri": "http://any.url",
"headers": {
"Content-Type": [
"application/json"
],
"Accept": [
"application/json"
]
},
"body": {
"id": "test-request-id",
"site": {
"page": "test.com",
"publisher": {
"id": "123456789"
}
},
"imp": [
{
"id": "imp1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"bidder": {
"pix_id": "55463"
}
}
}
]
},
"impIDs": [
"imp1"
]
},
"mockResponse": {
"status": 200,
"body": {
"id": "test-response-id",
"cur": "USD",
"seatbid": [
{
"bid": [
{
"id": "bid1",
"impid": "imp1",
"price": 1.23,
"adm": "<div>Banner Ad</div>",
"mtype": 1,
"ext": {
"prebid": {
"type": "banner"
}
}
}
]
}
]
}
}
}
],
"expectedBidResponses": [
{
"bids": [
{
"bid": {
"id": "bid1",
"impid": "imp1",
"price": 1.23,
"adm": "<div>Banner Ad</div>",
"mtype": 1,
"ext": {
"prebid": {
"type": "banner"
}
}
},
"type": "banner"
}
],
"currency": "USD"
}
]
}
Loading
Loading