From e39fe252379c813a3e4548c83321c5bad05371c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Tue, 5 May 2026 17:09:03 +0400 Subject: [PATCH] Dual-write tracker patterns in cookie pattern CRUD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CookiePattern Create/Update/Delete/Move now also write the corresponding TrackerPattern (TrackerType=COOKIE) so the tracker-pattern-based snapshot picks up the changes and draft versions are created correctly. Signed-off-by: Émile Ré --- pkg/cookiebanner/service.go | 56 +++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/pkg/cookiebanner/service.go b/pkg/cookiebanner/service.go index 982393ddc..c8449aceb 100644 --- a/pkg/cookiebanner/service.go +++ b/pkg/cookiebanner/service.go @@ -1211,6 +1211,26 @@ func (s *Service) CreateCookiePattern( return fmt.Errorf("cannot insert cookie pattern: %w", err) } + src := coredata.CookieSourceScript + tp := &coredata.TrackerPattern{ + ID: gid.New(scope.GetTenantID(), coredata.TrackerPatternEntityType), + OrganizationID: category.OrganizationID, + CookieBannerID: category.CookieBannerID, + CookieCategoryID: category.ID, + TrackerType: coredata.TrackerTypeCookie, + Pattern: req.Pattern, + MatchType: req.MatchType, + DisplayName: req.DisplayName, + MaxAgeSeconds: req.MaxAgeSeconds, + Description: req.Description, + Source: &src, + CreatedAt: now, + UpdatedAt: now, + } + if _, err := tp.InsertIfNotExists(ctx, tx, scope); err != nil { + return fmt.Errorf("cannot insert tracker pattern: %w", err) + } + if _, err := s.ensureDraftVersionForBanner(ctx, tx, scope, category.CookieBannerID); err != nil { return fmt.Errorf("cannot ensure draft version: %w", err) } @@ -1279,6 +1299,26 @@ func (s *Service) UpdateCookiePattern( return fmt.Errorf("cannot update cookie pattern: %w", err) } + var tp coredata.TrackerPattern + if err := tp.LoadByBannerIDTypeAndPattern(ctx, tx, scope, pattern.CookieBannerID, coredata.TrackerTypeCookie, pattern.Pattern); err == nil { + if req.DisplayName != nil { + tp.DisplayName = *req.DisplayName + } + if req.MaxAgeSeconds != nil { + tp.MaxAgeSeconds = *req.MaxAgeSeconds + } + if req.Description != nil { + tp.Description = *req.Description + } + if req.Excluded != nil { + tp.Excluded = *req.Excluded + } + tp.UpdatedAt = time.Now() + if err := tp.Update(ctx, tx, scope); err != nil { + return fmt.Errorf("cannot update tracker pattern: %w", err) + } + } + if !staysExcluded { if _, err := s.ensureDraftVersionForBanner(ctx, tx, scope, pattern.CookieBannerID); err != nil { return fmt.Errorf("cannot ensure draft version: %w", err) @@ -1317,6 +1357,13 @@ func (s *Service) DeleteCookiePattern( return fmt.Errorf("cannot delete cookie pattern: %w", err) } + var tp coredata.TrackerPattern + if err := tp.LoadByBannerIDTypeAndPattern(ctx, tx, scope, pattern.CookieBannerID, coredata.TrackerTypeCookie, pattern.Pattern); err == nil { + if err := tp.Delete(ctx, tx, scope); err != nil { + return fmt.Errorf("cannot delete tracker pattern: %w", err) + } + } + if !wasExcluded { if _, err := s.ensureDraftVersionForBanner(ctx, tx, scope, pattern.CookieBannerID); err != nil { return fmt.Errorf("cannot ensure draft version: %w", err) @@ -1375,6 +1422,15 @@ func (s *Service) MoveCookiePatternToCategory( return fmt.Errorf("cannot update cookie pattern: %w", err) } + var tp coredata.TrackerPattern + if err := tp.LoadByBannerIDTypeAndPattern(ctx, tx, scope, pattern.CookieBannerID, coredata.TrackerTypeCookie, pattern.Pattern); err == nil { + tp.CookieCategoryID = target.ID + tp.UpdatedAt = time.Now() + if err := tp.Update(ctx, tx, scope); err != nil { + return fmt.Errorf("cannot update tracker pattern: %w", err) + } + } + var banner coredata.CookieBanner if err := banner.LoadByID(ctx, tx, scope, pattern.CookieBannerID); err != nil { return fmt.Errorf("cannot load cookie banner: %w", err)