// src/collections/YtNotifications.ts import type { CollectionConfig } from 'payload' import { canAccessOwnNotifications } from '../lib/youtubeAccess' /** * YtNotifications Collection * * Benachrichtigungen für das YouTube Operations Team. * Werden automatisch bei Task-Zuweisungen und Statusänderungen erstellt. * Teil des YouTube Operations Hub. */ export const YtNotifications: CollectionConfig = { slug: 'yt-notifications', labels: { singular: 'Benachrichtigung', plural: 'Benachrichtigungen', }, admin: { group: 'YouTube', defaultColumns: ['title', 'recipient', 'type', 'read', 'createdAt'], description: 'Benachrichtigungen für YouTube Operations', }, access: { read: canAccessOwnNotifications, create: () => true, // System kann erstellen update: canAccessOwnNotifications, delete: ({ req }) => !!req.user?.isSuperAdmin, }, fields: [ { name: 'recipient', type: 'relationship', relationTo: 'users', required: true, label: 'Empfänger', index: true, }, { name: 'type', type: 'select', required: true, label: 'Typ', options: [ { label: 'Neue Aufgabe', value: 'task_assigned' }, { label: 'Aufgabe fällig', value: 'task_due' }, { label: 'Aufgabe überfällig', value: 'task_overdue' }, { label: 'Freigabe erforderlich', value: 'approval_required' }, { label: 'Freigabe erteilt', value: 'approved' }, { label: 'Freigabe abgelehnt', value: 'rejected' }, { label: 'Video veröffentlicht', value: 'video_published' }, { label: 'Kommentar', value: 'comment' }, { label: 'Erwähnung', value: 'mention' }, { label: 'System', value: 'system' }, ], }, { name: 'title', type: 'text', required: true, localized: true, label: 'Titel', }, { name: 'message', type: 'textarea', localized: true, label: 'Nachricht', }, { name: 'link', type: 'text', label: 'Link', admin: { description: 'Relativer Pfad zum relevanten Element', }, }, { name: 'relatedVideo', type: 'relationship', relationTo: 'youtube-content', label: 'Video', }, { name: 'relatedTask', type: 'relationship', relationTo: 'yt-tasks', label: 'Aufgabe', }, { name: 'read', type: 'checkbox', defaultValue: false, label: 'Gelesen', }, { name: 'readAt', type: 'date', label: 'Gelesen am', }, { name: 'emailSent', type: 'checkbox', defaultValue: false, label: 'E-Mail gesendet', }, ], timestamps: true, hooks: { beforeChange: [ // Setze readAt wenn read auf true wechselt ({ data, originalDoc }) => { if (!data) return data if (data.read && !originalDoc?.read) { data.readAt = new Date().toISOString() } return data }, ], }, }