Add country code to consent records

Store the visitor's resolved country code alongside regulation in
cookie_consent_records so downstream surfaces can expose it.

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-05-07 14:05:52 +04:00
parent dd6db7ca21
commit b4d8bd8de2
4 changed files with 36 additions and 9 deletions

View File

@@ -104,6 +104,7 @@ type (
Action coredata.CookieConsentAction Action coredata.CookieConsentAction
SdkVersion string SdkVersion string
Regulation Regulation Regulation Regulation
CountryCode coredata.CountryCode
} }
DetectedCookie struct { DetectedCookie struct {
@@ -1842,6 +1843,7 @@ func (s *Service) RecordConsent(
Action: req.Action, Action: req.Action,
SdkVersion: req.SdkVersion, SdkVersion: req.SdkVersion,
Regulation: req.Regulation, Regulation: req.Regulation,
CountryCode: req.CountryCode,
CreatedAt: time.Now(), CreatedAt: time.Now(),
} }

View File

@@ -41,6 +41,7 @@ type (
Action CookieConsentAction `db:"action"` Action CookieConsentAction `db:"action"`
SdkVersion string `db:"sdk_version"` SdkVersion string `db:"sdk_version"`
Regulation Regulation `db:"regulation"` Regulation Regulation `db:"regulation"`
CountryCode CountryCode `db:"country_code"`
CreatedAt time.Time `db:"created_at"` CreatedAt time.Time `db:"created_at"`
} }
@@ -92,6 +93,7 @@ SELECT
action, action,
sdk_version, sdk_version,
regulation, regulation,
country_code,
created_at created_at
FROM FROM
cookie_consent_records cookie_consent_records
@@ -177,6 +179,7 @@ INSERT INTO cookie_consent_records (
action, action,
sdk_version, sdk_version,
regulation, regulation,
country_code,
created_at created_at
) VALUES ( ) VALUES (
@id, @id,
@@ -191,6 +194,7 @@ INSERT INTO cookie_consent_records (
@action, @action,
@sdk_version, @sdk_version,
@regulation, @regulation,
@country_code,
@created_at @created_at
) )
` `
@@ -208,6 +212,7 @@ INSERT INTO cookie_consent_records (
"action": r.Action, "action": r.Action,
"sdk_version": r.SdkVersion, "sdk_version": r.SdkVersion,
"regulation": r.Regulation, "regulation": r.Regulation,
"country_code": r.CountryCode,
"created_at": r.CreatedAt, "created_at": r.CreatedAt,
} }
@@ -238,6 +243,7 @@ SELECT
action, action,
sdk_version, sdk_version,
regulation, regulation,
country_code,
created_at created_at
FROM FROM
cookie_consent_records cookie_consent_records
@@ -290,6 +296,7 @@ SELECT
action, action,
sdk_version, sdk_version,
regulation, regulation,
country_code,
created_at created_at
FROM FROM
cookie_consent_records cookie_consent_records

View File

@@ -0,0 +1,19 @@
-- Copyright (c) 2026 Probo Inc <hello@getprobo.com>.
--
-- Permission to use, copy, modify, and/or distribute this software for any
-- purpose with or without fee is hereby granted, provided that the above
-- copyright notice and this permission notice appear in all copies.
--
-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-- PERFORMANCE OF THIS SOFTWARE.
ALTER TABLE cookie_consent_records
ADD COLUMN country_code TEXT NOT NULL DEFAULT '';
ALTER TABLE cookie_consent_records
ALTER COLUMN country_code DROP DEFAULT;

View File

@@ -71,7 +71,8 @@ func (h *Handler) handleGetConfig(w http.ResponseWriter, r *http.Request) {
} }
lang := r.URL.Query().Get("lang") lang := r.URL.Query().Get("lang")
regulation := h.resolveRegulation(r) cc := h.resolveCountryCode(r)
regulation := cookiebanner.RegulationForCountry(cc)
config, err := h.cookieBannerSvc.GetActiveBannerConfig(r.Context(), bannerID, lang, regulation) config, err := h.cookieBannerSvc.GetActiveBannerConfig(r.Context(), bannerID, lang, regulation)
if err != nil { if err != nil {
@@ -91,20 +92,16 @@ func (h *Handler) handleGetConfig(w http.ResponseWriter, r *http.Request) {
httpserver.RenderJSON(w, http.StatusOK, config) httpserver.RenderJSON(w, http.StatusOK, config)
} }
func (h *Handler) resolveRegulation(r *http.Request) cookiebanner.Regulation { func (h *Handler) resolveCountryCode(r *http.Request) coredata.CountryCode {
ip := clientip.Extract(r) ip := clientip.Extract(r)
cc, err := h.geolocSvc.LookupCountry(r.Context(), ip) cc, err := h.geolocSvc.LookupCountry(r.Context(), ip)
if err != nil { if err != nil {
h.logger.ErrorCtx(r.Context(), "cannot resolve country for IP", log.Error(err)) h.logger.ErrorCtx(r.Context(), "cannot resolve country for IP", log.Error(err))
return cookiebanner.RegulationNone return ""
} }
if cc == "" { return cc
return cookiebanner.RegulationNone
}
return cookiebanner.RegulationForCountry(cc)
} }
func (h *Handler) handleGetConsent(w http.ResponseWriter, r *http.Request) { func (h *Handler) handleGetConsent(w http.ResponseWriter, r *http.Request) {
@@ -170,6 +167,7 @@ func (h *Handler) handlePostConsent(w http.ResponseWriter, r *http.Request) {
ip := clientip.Extract(r) ip := clientip.Extract(r)
ua := r.UserAgent() ua := r.UserAgent()
sdkVersion := r.Header.Get("X-SDK-Version") sdkVersion := r.Header.Get("X-SDK-Version")
cc := h.resolveCountryCode(r)
req := cookiebanner.RecordConsentRequest{ req := cookiebanner.RecordConsentRequest{
Version: body.Version, Version: body.Version,
@@ -179,7 +177,8 @@ func (h *Handler) handlePostConsent(w http.ResponseWriter, r *http.Request) {
ConsentData: body.ConsentData, ConsentData: body.ConsentData,
Action: body.Action, Action: body.Action,
SdkVersion: sdkVersion, SdkVersion: sdkVersion,
Regulation: h.resolveRegulation(r), Regulation: cookiebanner.RegulationForCountry(cc),
CountryCode: cc,
} }
record, err := h.cookieBannerSvc.RecordConsent(r.Context(), bannerID, req) record, err := h.cookieBannerSvc.RecordConsent(r.Context(), bannerID, req)