Skip draft version for uncategorised-only merges

Pattern merges and adoptions that stay entirely within the
uncategorised category never change the visitor-facing snapshot.
Only trigger ensureDraftVersionForBanner when a merge group
belongs to a consent category.

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-05-02 19:31:53 +04:00
parent 9d4af4d73e
commit 9dedeeaa42

View File

@@ -85,6 +85,15 @@ func (h *patternAnalysisHandler) Process(ctx context.Context, banner coredata.Co
func(ctx context.Context, tx pg.Tx) error { func(ctx context.Context, tx pg.Tx) error {
scope := coredata.NewScopeFromObjectID(banner.ID) scope := coredata.NewScopeFromObjectID(banner.ID)
var uncategorised coredata.CookieCategory
hasUncategorised := true
if err := uncategorised.LoadUncategorisedByCookieBannerID(ctx, tx, scope, banner.ID); err != nil {
if !errors.Is(err, coredata.ErrResourceNotFound) {
return fmt.Errorf("cannot load uncategorised category: %w", err)
}
hasUncategorised = false
}
var exactPatterns coredata.CookiePatterns var exactPatterns coredata.CookiePatterns
if err := exactPatterns.LoadAllByCookieBannerID( if err := exactPatterns.LoadAllByCookieBannerID(
ctx, ctx,
@@ -98,7 +107,7 @@ func (h *patternAnalysisHandler) Process(ctx context.Context, banner coredata.Co
mergeGroups := findMergeGroups(exactPatterns, patternMergeThreshold) mergeGroups := findMergeGroups(exactPatterns, patternMergeThreshold)
merged := false consentChanged := false
for key, group := range mergeGroups { for key, group := range mergeGroups {
maxAge := mostCommonMaxAge(group) maxAge := mostCommonMaxAge(group)
@@ -144,7 +153,10 @@ func (h *patternAnalysisHandler) Process(ctx context.Context, banner coredata.Co
} }
} }
merged = true if !hasUncategorised || key.categoryID != uncategorised.ID {
consentChanged = true
}
h.logger.InfoCtx( h.logger.InfoCtx(
ctx, ctx,
"merged exact patterns into prefix pattern", "merged exact patterns into prefix pattern",
@@ -154,15 +166,11 @@ func (h *patternAnalysisHandler) Process(ctx context.Context, banner coredata.Co
) )
} }
adopted, err := h.adoptUncategorisedPatterns(ctx, tx, scope, banner) if _, err := h.adoptUncategorisedPatterns(ctx, tx, scope, banner); err != nil {
if err != nil {
return fmt.Errorf("cannot adopt uncategorised patterns: %w", err) return fmt.Errorf("cannot adopt uncategorised patterns: %w", err)
} }
if adopted {
merged = true
}
if merged { if consentChanged {
if _, err := h.svc.ensureDraftVersionForBanner(ctx, tx, scope, banner.ID); err != nil { if _, err := h.svc.ensureDraftVersionForBanner(ctx, tx, scope, banner.ID); err != nil {
return fmt.Errorf("cannot ensure draft version: %w", err) return fmt.Errorf("cannot ensure draft version: %w", err)
} }