Add uncategorised cookie category

Replace the `required` boolean column on cookie_categories with a `kind`
enum (NORMAL, NECESSARY, UNCATEGORISED). The Necessary category remains
undeletable and always-on for consent; the new Uncategorised category is
also undeletable but users can opt out of it.

When a category is deleted, its cookies are merged into the Uncategorised
category (lazy-created for legacy banners that don't have one yet).

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-04-20 19:00:00 +04:00
parent 2147cded9f
commit 7cd8c516b9
18 changed files with 207 additions and 70 deletions

View File

@@ -354,7 +354,6 @@ func (r *mutationResolver) CreateCookieCategory(ctx context.Context, input types
CookieBannerID: input.CookieBannerID,
Name: input.Name,
Description: input.Description,
Required: input.Required,
Rank: input.Rank,
Cookies: cookies,
},
@@ -461,7 +460,7 @@ func (r *mutationResolver) DeleteCookieCategory(ctx context.Context, input types
if errors.Is(err, cookiebanner.ErrCategoryNotFound) {
return nil, gqlutils.NotFound(ctx, err)
}
if errors.Is(err, cookiebanner.ErrCannotDeleteRequiredCategory) {
if errors.Is(err, cookiebanner.ErrCannotDeleteSystemCategory) {
return nil, gqlutils.Conflict(ctx, err)
}
r.logger.ErrorCtx(ctx, "cannot delete cookie category", log.Error(err))

View File

@@ -90,7 +90,7 @@ type CookieCategory implements Node {
cookieBanner: CookieBanner @goField(forceResolver: true)
name: String!
description: String!
required: Boolean!
kind: String!
rank: Int!
cookies: [CookieItem!]!
createdAt: Datetime!
@@ -212,7 +212,6 @@ input CreateCookieCategoryInput {
cookieBannerId: ID!
name: String!
description: String!
required: Boolean!
rank: Int!
cookies: [CookieItemInput!]
}

View File

@@ -77,7 +77,7 @@ func NewCookieCategory(c *coredata.CookieCategory) *CookieCategory {
},
Name: c.Name,
Description: c.Description,
Required: c.Required,
Kind: string(c.Kind),
Rank: c.Rank,
Cookies: cookies,
CreatedAt: c.CreatedAt,