diff --git a/openrtb_ext/convert_up.go b/openrtb_ext/convert_up.go index cfc9259b20..e918e9bfbe 100644 --- a/openrtb_ext/convert_up.go +++ b/openrtb_ext/convert_up.go @@ -147,17 +147,50 @@ func moveUSPrivacyFrom25To26(r *RequestWrapper) { // moveEIDFrom25To26 modifies the request to move the OpenRTB 2.5 external identifiers // (req.user.ext.eids) to the OpenRTB 2.6 location (req.user.eids). If the OpenRTB 2.6 -// location is already present the OpenRTB 2.5 external identifiers is dropped. +// location is already present the OpenRTB 2.5 external identifiers are appended for +// sources not already in the eids array func moveEIDFrom25To26(r *RequestWrapper) { - // read and clear 2.5 location + // Read 2.5 location userExt, _ := r.GetUserExt() - eid25 := userExt.GetEid() + eids25 := userExt.GetEid() + + // Clear 2.5 location userExt.SetEid(nil) - // move to 2.6 location - if eid25 != nil && r.User.EIDs == nil { - r.User.EIDs = *eid25 + // If there's no eids25, there's nothing to move or merge + if eids25 == nil || len(*eids25) == 0 { + return + } + + // If there's no 2.6 location, simply set eids + if r.User.EIDs == nil { + r.User.EIDs = *eids25 + return + } + + // If 2.6 location is present, append only new eids based on 'source'. + existingEIDs := r.User.EIDs + for _, eid25 := range *eids25 { + // If source is empty, append + if eid25.Source == "" { + existingEIDs = append(existingEIDs, eid25) + continue + } + + found := false + for _, eid26 := range existingEIDs { + // Compare strings directly + if eid25.Source == eid26.Source { + found = true + break + } + } + + if !found { + existingEIDs = append(existingEIDs, eid25) + } } + r.User.EIDs = existingEIDs } // moveRewardedFromPrebidExtTo26 modifies the impression to move the Prebid specific diff --git a/openrtb_ext/convert_up_test.go b/openrtb_ext/convert_up_test.go index 2b5c230389..eaf22e536c 100644 --- a/openrtb_ext/convert_up_test.go +++ b/openrtb_ext/convert_up_test.go @@ -374,9 +374,32 @@ func TestMoveEIDFrom25To26(t *testing.T) { expectedRequest: openrtb2.BidRequest{User: &openrtb2.User{EIDs: eid1}}, }, { - description: "2.5 Dropped", - givenRequest: openrtb2.BidRequest{User: &openrtb2.User{EIDs: eid1, Ext: eid2Json}}, - expectedRequest: openrtb2.BidRequest{User: &openrtb2.User{EIDs: eid1}}, + description: "2.5 Appended Because Different Source from all 2.6 eids", + givenRequest: openrtb2.BidRequest{ + User: &openrtb2.User{ + EIDs: []openrtb2.EID{{Source: "1"}}, + Ext: eid2Json, + }, + }, + expectedRequest: openrtb2.BidRequest{ + User: &openrtb2.User{ + EIDs: []openrtb2.EID{{Source: "1"}, {Source: "2"}}, + }, + }, + }, + { + description: "2.5 Not Appended Because Same Source exists IN 2.6", + givenRequest: openrtb2.BidRequest{ + User: &openrtb2.User{ + EIDs: []openrtb2.EID{{Source: "1"}}, + Ext: eid1Json, + }, + }, + expectedRequest: openrtb2.BidRequest{ + User: &openrtb2.User{ + EIDs: []openrtb2.EID{{Source: "1"}}, + }, + }, }, { description: "2.6 Left Alone",