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:
@@ -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(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
19
pkg/coredata/migrations/20260507T131200Z.sql
Normal file
19
pkg/coredata/migrations/20260507T131200Z.sql
Normal 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;
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user