Add GraphQL API and service CRUD for cookie patterns

Add CookiePattern type, connection, and mutations to the GraphQL schema
with full resolver implementations. Add service methods for pattern
CRUD, category movement, listing, and counting. This enables the console
to manage cookie patterns instead of individual cookies.

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-04-29 14:24:28 +04:00
parent f9fec45eb1
commit 9c402058ec
6 changed files with 847 additions and 0 deletions

View File

@@ -156,12 +156,52 @@ type CookieCategory implements Node {
orderBy: CookieOrder
): CookieConnection @goField(forceResolver: true)
cookiePatterns(
first: Int
after: CursorKey
last: Int
before: CursorKey
orderBy: CookiePatternOrder
): CookiePatternConnection @goField(forceResolver: true)
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
enum CookiePatternMatchType
@goModel(
model: "go.probo.inc/probo/pkg/coredata.CookiePatternMatchType"
) {
EXACT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.CookiePatternMatchTypeExact"
)
PREFIX
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.CookiePatternMatchTypePrefix"
)
}
enum CookiePatternOrderField
@goModel(
model: "go.probo.inc/probo/pkg/coredata.CookiePatternOrderField"
) {
CREATED_AT
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.CookiePatternOrderFieldCreatedAt"
)
}
input CookiePatternOrder
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.CookiePatternOrderBy"
) {
direction: OrderDirection!
field: CookiePatternOrderField!
}
enum CookieOrderField
@goModel(
model: "go.probo.inc/probo/pkg/coredata.CookieOrderField"
@@ -207,6 +247,36 @@ type CookieEdge {
node: Cookie!
}
type CookiePattern implements Node {
id: ID!
cookieCategory: CookieCategory @goField(forceResolver: true)
pattern: String!
matchType: CookiePatternMatchType!
displayName: String!
duration: String!
description: String!
source: CookieSource!
cookieCount: Int! @goField(forceResolver: true)
createdAt: Datetime!
updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
}
type CookiePatternConnection
@goModel(
model: "go.probo.inc/probo/pkg/server/api/console/v1/types.CookiePatternConnection"
) {
totalCount: Int! @goField(forceResolver: true)
edges: [CookiePatternEdge!]!
pageInfo: PageInfo!
}
type CookiePatternEdge {
cursor: CursorKey!
node: CookiePattern!
}
type CookieBannerVersion implements Node {
id: ID!
version: Int!
@@ -295,6 +365,18 @@ extend type Mutation {
createCookie(input: CreateCookieInput!): CreateCookiePayload!
updateCookie(input: UpdateCookieInput!): UpdateCookiePayload!
deleteCookie(input: DeleteCookieInput!): DeleteCookiePayload!
createCookiePattern(
input: CreateCookiePatternInput!
): CreateCookiePatternPayload!
updateCookiePattern(
input: UpdateCookiePatternInput!
): UpdateCookiePatternPayload!
deleteCookiePattern(
input: DeleteCookiePatternInput!
): DeleteCookiePatternPayload!
moveCookiePatternToCategory(
input: MoveCookiePatternToCategoryInput!
): MoveCookiePatternToCategoryPayload!
upsertCookieBannerTranslation(
input: UpsertCookieBannerTranslationInput!
): UpsertCookieBannerTranslationPayload!
@@ -449,6 +531,51 @@ type DeleteCookiePayload {
cookieBanner: CookieBanner!
}
input CreateCookiePatternInput {
cookieCategoryId: ID!
pattern: String!
matchType: CookiePatternMatchType!
displayName: String!
duration: String!
description: String!
}
input UpdateCookiePatternInput {
cookiePatternId: ID!
displayName: String
duration: String
description: String
}
input DeleteCookiePatternInput {
cookiePatternId: ID!
}
input MoveCookiePatternToCategoryInput {
cookiePatternId: ID!
targetCookieCategoryId: ID!
}
type CreateCookiePatternPayload {
cookiePatternEdge: CookiePatternEdge!
cookieBanner: CookieBanner!
}
type UpdateCookiePatternPayload {
cookiePattern: CookiePattern!
cookieBanner: CookieBanner!
}
type DeleteCookiePatternPayload {
deletedCookiePatternId: ID!
cookieBanner: CookieBanner!
}
type MoveCookiePatternToCategoryPayload {
cookiePattern: CookiePattern!
cookieBanner: CookieBanner!
}
input UpsertCookieBannerTranslationInput {
cookieBannerId: ID!
language: String!