cms.c2sgmbh/src/collections/CookieConfigurations.ts
Martin Porwoll 885ec93748 feat: add content collections for multi-tenant CMS
New collections:
- Categories: hierarchical content categorization
- Pages: flexible page builder with blocks
- Posts: blog/news articles with SEO
- Testimonials: customer reviews/quotes

Cookie & Consent management:
- ConsentLogs: GDPR consent tracking
- CookieConfigurations: per-tenant cookie settings
- CookieInventory: cookie registry

Additional:
- NewsletterSubscribers: email subscription management
- PrivacyPolicySettings: privacy policy configuration
- SocialLinks: social media links

Update Media collection with tenant support and image variants

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 08:18:58 +00:00

204 lines
5.8 KiB
TypeScript

// src/collections/CookieConfigurations.ts
import type { CollectionConfig } from 'payload'
import { tenantScopedPublicRead, authenticatedOnly } from '../lib/tenantAccess'
/**
* CookieConfigurations Collection
*
* Mandantenspezifische Cookie-Banner-Konfiguration.
* Öffentlich lesbar, aber nur für den eigenen Tenant (Domain-basiert).
*/
export const CookieConfigurations: CollectionConfig = {
slug: 'cookie-configurations',
admin: {
useAsTitle: 'title',
group: 'Consent Management',
description: 'Cookie-Banner Konfiguration pro Tenant',
},
access: {
// Öffentlich, aber tenant-isoliert (Domain-Check)
read: tenantScopedPublicRead,
create: authenticatedOnly,
update: authenticatedOnly,
delete: authenticatedOnly,
},
fields: [
{
name: 'tenant',
type: 'relationship',
relationTo: 'tenants',
required: true,
unique: true,
admin: {
description: 'Jeder Tenant kann nur eine Konfiguration haben',
},
},
{
name: 'title',
type: 'text',
required: true,
defaultValue: 'Cookie-Einstellungen',
admin: {
description: 'Interner Titel zur Identifikation',
},
},
{
name: 'revision',
type: 'number',
required: true,
defaultValue: 1,
admin: {
description:
'Bei inhaltlichen Änderungen erhöhen → erzwingt erneuten Consent bei allen Nutzern',
},
},
{
name: 'enabledCategories',
type: 'select',
hasMany: true,
required: true,
defaultValue: ['necessary', 'analytics'],
options: [
{ label: 'Notwendig', value: 'necessary' },
{ label: 'Funktional', value: 'functional' },
{ label: 'Statistik', value: 'analytics' },
{ label: 'Marketing', value: 'marketing' },
],
admin: {
description: 'Welche Kategorien sollen im Banner angezeigt werden?',
},
},
{
name: 'translations',
type: 'group',
fields: [
{
name: 'de',
type: 'group',
label: 'Deutsch',
fields: [
{
name: 'bannerTitle',
type: 'text',
defaultValue: 'Wir respektieren Ihre Privatsphäre',
},
{
name: 'bannerDescription',
type: 'textarea',
defaultValue:
'Diese Website verwendet Cookies, um Ihnen die bestmögliche Erfahrung zu bieten.',
},
{
name: 'acceptAllButton',
type: 'text',
defaultValue: 'Alle akzeptieren',
},
{
name: 'acceptNecessaryButton',
type: 'text',
defaultValue: 'Nur notwendige',
},
{
name: 'settingsButton',
type: 'text',
defaultValue: 'Einstellungen',
},
{
name: 'saveButton',
type: 'text',
defaultValue: 'Auswahl speichern',
},
{
name: 'privacyPolicyUrl',
type: 'text',
defaultValue: '/datenschutz',
},
{
name: 'categoryLabels',
type: 'group',
fields: [
{
name: 'necessary',
type: 'group',
fields: [
{ name: 'title', type: 'text', defaultValue: 'Notwendig' },
{
name: 'description',
type: 'textarea',
defaultValue:
'Diese Cookies sind für die Grundfunktionen der Website erforderlich.',
},
],
},
{
name: 'functional',
type: 'group',
fields: [
{ name: 'title', type: 'text', defaultValue: 'Funktional' },
{
name: 'description',
type: 'textarea',
defaultValue: 'Diese Cookies ermöglichen erweiterte Funktionen.',
},
],
},
{
name: 'analytics',
type: 'group',
fields: [
{ name: 'title', type: 'text', defaultValue: 'Statistik' },
{
name: 'description',
type: 'textarea',
defaultValue:
'Diese Cookies helfen uns zu verstehen, wie Besucher die Website nutzen.',
},
],
},
{
name: 'marketing',
type: 'group',
fields: [
{ name: 'title', type: 'text', defaultValue: 'Marketing' },
{
name: 'description',
type: 'textarea',
defaultValue: 'Diese Cookies werden für Werbezwecke verwendet.',
},
],
},
],
},
],
},
],
},
{
name: 'styling',
type: 'group',
fields: [
{
name: 'position',
type: 'select',
defaultValue: 'bottom',
options: [
{ label: 'Unten', value: 'bottom' },
{ label: 'Oben', value: 'top' },
{ label: 'Mitte (Modal)', value: 'middle' },
],
},
{
name: 'theme',
type: 'select',
defaultValue: 'dark',
options: [
{ label: 'Dunkel', value: 'dark' },
{ label: 'Hell', value: 'light' },
{ label: 'Auto (System)', value: 'auto' },
],
},
],
},
],
}