Fix cookiebanner rest API for sdk version <=0.2.0
Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import (
|
|||||||
"maps"
|
"maps"
|
||||||
"net/url"
|
"net/url"
|
||||||
"slices"
|
"slices"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -1476,6 +1477,7 @@ func (s *Service) GetActiveBannerConfig(
|
|||||||
bannerID gid.GID,
|
bannerID gid.GID,
|
||||||
lang string,
|
lang string,
|
||||||
regulation Regulation,
|
regulation Regulation,
|
||||||
|
sdkVersion string,
|
||||||
) (*BannerConfig, error) {
|
) (*BannerConfig, error) {
|
||||||
var config *BannerConfig
|
var config *BannerConfig
|
||||||
|
|
||||||
@@ -1529,7 +1531,9 @@ func (s *Service) GetActiveBannerConfig(
|
|||||||
if cm := ConsentModeForRegulation(regulation); cm != "" {
|
if cm := ConsentModeForRegulation(regulation); cm != "" {
|
||||||
config.ConsentMode = cm
|
config.ConsentMode = cm
|
||||||
}
|
}
|
||||||
remapTextsForConsentMode(config.Texts, config.ConsentMode, regulation)
|
if !isLegacySDK(sdkVersion) {
|
||||||
|
remapTextsForConsentMode(config.Texts, config.ConsentMode, regulation)
|
||||||
|
}
|
||||||
|
|
||||||
return config, nil
|
return config, nil
|
||||||
}
|
}
|
||||||
@@ -1624,6 +1628,41 @@ func remapTextsForConsentMode(texts map[string]string, consentMode string, regul
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isLegacySDK returns true when the SDK version is <= 0.2.x.
|
||||||
|
// Empty or unparseable versions are treated as current.
|
||||||
|
func isLegacySDK(version string) bool {
|
||||||
|
if version == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
major, minor, ok := parseMajorMinor(version)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return major == 0 && minor <= 2
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseMajorMinor(version string) (major, minor int, ok bool) {
|
||||||
|
v := strings.TrimPrefix(version, "v")
|
||||||
|
parts := strings.SplitN(v, ".", 3)
|
||||||
|
if len(parts) < 2 {
|
||||||
|
return 0, 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
maj, err := strconv.Atoi(parts[0])
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
min, err := strconv.Atoi(parts[1])
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return maj, min, true
|
||||||
|
}
|
||||||
|
|
||||||
func remapTextKey(texts map[string]string, src, dst string) {
|
func remapTextKey(texts map[string]string, src, dst string) {
|
||||||
if v, ok := texts[src]; ok && v != "" {
|
if v, ok := texts[src]; ok && v != "" {
|
||||||
texts[dst] = v
|
texts[dst] = v
|
||||||
|
|||||||
@@ -283,3 +283,63 @@ func TestBuildSnapshot_RankInvariant(t *testing.T) {
|
|||||||
assert.Equal(t, coredata.CookieCategoryKindNecessary, snap.Categories[0].Kind)
|
assert.Equal(t, coredata.CookieCategoryKindNecessary, snap.Categories[0].Kind)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemapTextsForConsentMode(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
baseTexts := func() map[string]string {
|
||||||
|
return map[string]string{
|
||||||
|
"banner_title": "We use cookies",
|
||||||
|
"banner_description": "This site uses cookies.",
|
||||||
|
"button_accept_all": "Accept All",
|
||||||
|
"button_reject_all": "Reject All",
|
||||||
|
"button_customize": "Customize",
|
||||||
|
"button_dismiss": "Dismiss",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("no regulation clears reject and customize", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
texts := baseTexts()
|
||||||
|
remapTextsForConsentMode(texts, ConsentModeOptIn, RegulationNone)
|
||||||
|
|
||||||
|
assert.Empty(t, texts["button_reject_all"])
|
||||||
|
assert.Empty(t, texts["button_customize"])
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("opt out mode clears reject", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
texts := baseTexts()
|
||||||
|
remapTextsForConsentMode(texts, ConsentModeOptOut, RegulationCCPA)
|
||||||
|
|
||||||
|
assert.Empty(t, texts["button_reject_all"])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIsLegacySDK(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
version string
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{"0.1.0", true},
|
||||||
|
{"0.2.0", true},
|
||||||
|
{"0.2.5", true},
|
||||||
|
{"0.3.0", false},
|
||||||
|
{"1.0.0", false},
|
||||||
|
{"", false},
|
||||||
|
{"invalid", false},
|
||||||
|
{"v0.2.0", true},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.version, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert.Equal(t, tt.want, isLegacySDK(tt.version))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ func (h *Handler) handleGetConfig(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lang := r.URL.Query().Get("lang")
|
lang := r.URL.Query().Get("lang")
|
||||||
|
sdkVersion := r.Header.Get("X-SDK-Version")
|
||||||
cc := h.resolveCountryCode(r)
|
cc := h.resolveCountryCode(r)
|
||||||
|
|
||||||
var regulation cookiebanner.Regulation
|
var regulation cookiebanner.Regulation
|
||||||
@@ -78,7 +79,7 @@ func (h *Handler) handleGetConfig(w http.ResponseWriter, r *http.Request) {
|
|||||||
regulation = cookiebanner.RegulationForCountry(*cc)
|
regulation = cookiebanner.RegulationForCountry(*cc)
|
||||||
}
|
}
|
||||||
|
|
||||||
config, err := h.cookieBannerSvc.GetActiveBannerConfig(r.Context(), bannerID, lang, regulation)
|
config, err := h.cookieBannerSvc.GetActiveBannerConfig(r.Context(), bannerID, lang, regulation, sdkVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, cookiebanner.ErrBannerNotFound) {
|
if errors.Is(err, cookiebanner.ErrBannerNotFound) {
|
||||||
jsonutil.RenderNotFound(w, fmt.Errorf("banner not found"))
|
jsonutil.RenderNotFound(w, fmt.Errorf("banner not found"))
|
||||||
|
|||||||
Reference in New Issue
Block a user