diff --git a/package.json b/package.json index fff0ab3..cb8cfc7 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "build": "tsc", "dev": "tsc --watch", "typecheck": "tsc --noEmit", - "extract": "tsx scripts/extract-types.ts", + "extract": "npx tsx scripts/extract-types.ts", "wo:create": "bash scripts/create-work-order.sh", "wo:execute": "bash scripts/execute-work-order.sh", "preinstall": "true", @@ -52,9 +52,6 @@ "@types/react": "^19.0.0", "typescript": "^5.7.0" }, - "optionalDependencies": { - "tsx": "^4.19.0" - }, "peerDependencies": { "react": "^19.0.0" }, diff --git a/src/types/collections.ts b/src/types/collections.ts index 6e9ee2a..85dfd98 100644 --- a/src/types/collections.ts +++ b/src/types/collections.ts @@ -39,6 +39,10 @@ import type { CookieConfiguration, CookieInventory, PrivacyPolicySetting, + MonitoringSnapshot, + MonitoringLog, + MonitoringAlertRule, + MonitoringAlertHistory, SiteSetting, Navigation, Form, @@ -82,6 +86,10 @@ export type { CookieConfiguration, CookieInventory, PrivacyPolicySetting, + MonitoringSnapshot, + MonitoringLog, + MonitoringAlertRule, + MonitoringAlertHistory, SiteSetting, Navigation, Form, @@ -127,6 +135,10 @@ export interface CollectionTypeMap { 'cookie-configurations': CookieConfiguration; 'cookie-inventory': CookieInventory; 'privacy-policy-settings': PrivacyPolicySetting; + 'monitoring-snapshots': MonitoringSnapshot; + 'monitoring-logs': MonitoringLog; + 'monitoring-alert-rules': MonitoringAlertRule; + 'monitoring-alert-history': MonitoringAlertHistory; 'site-settings': SiteSetting; 'navigations': Navigation; 'forms': Form; diff --git a/src/types/payload-types.ts b/src/types/payload-types.ts index 7cf0e15..6b64aac 100644 --- a/src/types/payload-types.ts +++ b/src/types/payload-types.ts @@ -125,6 +125,10 @@ export interface Config { 'privacy-policy-settings': PrivacyPolicySetting; 'email-logs': EmailLog; 'audit-logs': AuditLog; + 'monitoring-snapshots': MonitoringSnapshot; + 'monitoring-logs': MonitoringLog; + 'monitoring-alert-rules': MonitoringAlertRule; + 'monitoring-alert-history': MonitoringAlertHistory; 'site-settings': SiteSetting; navigations: Navigation; forms: Form; @@ -191,6 +195,10 @@ export interface Config { 'privacy-policy-settings': PrivacyPolicySettingsSelect | PrivacyPolicySettingsSelect; 'email-logs': EmailLogsSelect | EmailLogsSelect; 'audit-logs': AuditLogsSelect | AuditLogsSelect; + 'monitoring-snapshots': MonitoringSnapshotsSelect | MonitoringSnapshotsSelect; + 'monitoring-logs': MonitoringLogsSelect | MonitoringLogsSelect; + 'monitoring-alert-rules': MonitoringAlertRulesSelect | MonitoringAlertRulesSelect; + 'monitoring-alert-history': MonitoringAlertHistorySelect | MonitoringAlertHistorySelect; 'site-settings': SiteSettingsSelect | SiteSettingsSelect; navigations: NavigationsSelect | NavigationsSelect; forms: FormsSelect | FormsSelect; @@ -310,6 +318,10 @@ export interface YoutubeChannel { language: 'de' | 'en'; category: 'lifestyle' | 'corporate' | 'b2b'; status: 'active' | 'planned' | 'paused' | 'archived'; + /** + * Profil-Thumbnail URL von YouTube (automatisch befüllt) + */ + channelThumbnailUrl?: string | null; branding?: { /** * z.B. #1278B3 @@ -494,7 +506,7 @@ export interface Tenant { /** * Hostname ohne Protokoll (z.B. smtp.gmail.com) */ - host: string; + host?: string | null; /** * 587 (STARTTLS) oder 465 (SSL) */ @@ -506,7 +518,7 @@ export interface Tenant { /** * Meist die E-Mail-Adresse */ - user: string; + user?: string | null; /** * Leer lassen um bestehendes Passwort zu behalten */ @@ -528,11 +540,6 @@ export interface Page { * URL-Pfad (z.B. "ueber-uns" / "about-us") */ slug: string; - hero?: { - image?: (number | null) | Media; - headline?: string | null; - subline?: string | null; - }; layout?: | ( | { @@ -797,7 +804,13 @@ export interface Page { headline?: string | null; cards?: | { + mediaType?: ('none' | 'image' | 'icon') | null; image?: (number | null) | Media; + /** + * Lucide Icon-Name (z.B. "heart", "star", "shield-check", "camera") + */ + icon?: string | null; + iconPosition?: ('top' | 'left') | null; title: string; description?: string | null; link?: string | null; @@ -6381,6 +6394,17 @@ export interface YoutubeContent { subscribersGained?: number | null; lastSyncedAt?: string | null; }; + /** + * Für ROI-Berechnung (manuell pflegen) + */ + costs?: { + estimatedProductionHours?: number | null; + estimatedProductionCost?: number | null; + /** + * AdSense + Sponsoring + Affiliate + */ + estimatedRevenue?: number | null; + }; /** * Nur für das Team sichtbar */ @@ -7422,6 +7446,232 @@ export interface AuditLog { updatedAt: string; createdAt: string; } +/** + * Historische System-Metriken für Trend-Charts + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-snapshots". + */ +export interface MonitoringSnapshot { + id: number; + timestamp: string; + /** + * System-Ressourcen (CPU, RAM, Disk) + */ + system?: { + cpuUsagePercent?: number | null; + memoryUsedMB?: number | null; + memoryTotalMB?: number | null; + memoryUsagePercent?: number | null; + diskUsedGB?: number | null; + diskTotalGB?: number | null; + diskUsagePercent?: number | null; + loadAvg1?: number | null; + loadAvg5?: number | null; + /** + * Uptime in Sekunden + */ + uptime?: number | null; + }; + /** + * Service-Status (PM2-Prozesse, Datenbank, Cache) + */ + services?: { + payload?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + queueWorker?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + postgresql?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + pgbouncer?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + redis?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + }; + /** + * Externe Services (SMTP, OAuth, Cron) + */ + external?: { + smtp?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + metaOAuth?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + youtubeOAuth?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + cronJobs?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + }; + /** + * Performance-Metriken + */ + performance?: { + avgResponseTimeMs?: number | null; + p95ResponseTimeMs?: number | null; + p99ResponseTimeMs?: number | null; + errorRate?: number | null; + requestsPerMinute?: number | null; + }; + updatedAt: string; + createdAt: string; +} +/** + * Structured Logs für Business-Events + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-logs". + */ +export interface MonitoringLog { + id: number; + level: 'debug' | 'info' | 'warn' | 'error' | 'fatal'; + source: 'payload' | 'queue-worker' | 'cron' | 'email' | 'oauth' | 'sync'; + message: string; + /** + * Strukturierte Metadaten + */ + context?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + /** + * Korrelations-ID + */ + requestId?: string | null; + userId?: (number | null) | User; + tenant?: (number | null) | Tenant; + /** + * Dauer in ms + */ + duration?: number | null; + updatedAt: string; + createdAt: string; +} +/** + * Konfigurierbare Alert-Regeln + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-alert-rules". + */ +export interface MonitoringAlertRule { + id: number; + name: string; + /** + * z.B. system.cpuUsagePercent, services.redis.memoryUsedMB + */ + metric: string; + condition: 'gt' | 'lt' | 'eq' | 'gte' | 'lte'; + threshold: number; + severity: 'warning' | 'error' | 'critical'; + channels: ('email' | 'slack' | 'discord')[]; + recipients?: { + emails?: + | { + email: string; + id?: string | null; + }[] + | null; + slackWebhook?: string | null; + discordWebhook?: string | null; + }; + /** + * Minimaler Abstand zwischen gleichen Alerts + */ + cooldownMinutes?: number | null; + enabled?: boolean | null; + /** + * Optional: Tenant-spezifische Regel + */ + tenant?: (number | null) | Tenant; + updatedAt: string; + createdAt: string; +} +/** + * Alert-Log (WORM - Write Once) + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-alert-history". + */ +export interface MonitoringAlertHistory { + id: number; + rule?: (number | null) | MonitoringAlertRule; + metric: string; + value: number; + threshold: number; + severity: 'warning' | 'error' | 'critical'; + message: string; + channelsSent?: ('email' | 'slack' | 'discord')[] | null; + resolvedAt?: string | null; + acknowledgedBy?: (number | null) | User; + updatedAt: string; + createdAt: string; +} /** * Allgemeine Website-Einstellungen pro Tenant * @@ -7804,6 +8054,22 @@ export interface PayloadLockedDocument { relationTo: 'audit-logs'; value: number | AuditLog; } | null) + | ({ + relationTo: 'monitoring-snapshots'; + value: number | MonitoringSnapshot; + } | null) + | ({ + relationTo: 'monitoring-logs'; + value: number | MonitoringLog; + } | null) + | ({ + relationTo: 'monitoring-alert-rules'; + value: number | MonitoringAlertRule; + } | null) + | ({ + relationTo: 'monitoring-alert-history'; + value: number | MonitoringAlertHistory; + } | null) | ({ relationTo: 'site-settings'; value: number | SiteSetting; @@ -8065,13 +8331,6 @@ export interface PagesSelect { tenant?: T; title?: T; slug?: T; - hero?: - | T - | { - image?: T; - headline?: T; - subline?: T; - }; layout?: | T | { @@ -8297,7 +8556,10 @@ export interface PagesSelect { cards?: | T | { + mediaType?: T; image?: T; + icon?: T; + iconPosition?: T; title?: T; description?: T; link?: T; @@ -11464,6 +11726,7 @@ export interface YoutubeChannelsSelect { language?: T; category?: T; status?: T; + channelThumbnailUrl?: T; branding?: | T | { @@ -11631,6 +11894,13 @@ export interface YoutubeContentSelect { subscribersGained?: T; lastSyncedAt?: T; }; + costs?: + | T + | { + estimatedProductionHours?: T; + estimatedProductionCost?: T; + estimatedRevenue?: T; + }; internalNotes?: T; updatedAt?: T; createdAt?: T; @@ -12278,6 +12548,117 @@ export interface AuditLogsSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-snapshots_select". + */ +export interface MonitoringSnapshotsSelect { + timestamp?: T; + system?: + | T + | { + cpuUsagePercent?: T; + memoryUsedMB?: T; + memoryTotalMB?: T; + memoryUsagePercent?: T; + diskUsedGB?: T; + diskTotalGB?: T; + diskUsagePercent?: T; + loadAvg1?: T; + loadAvg5?: T; + uptime?: T; + }; + services?: + | T + | { + payload?: T; + queueWorker?: T; + postgresql?: T; + pgbouncer?: T; + redis?: T; + }; + external?: + | T + | { + smtp?: T; + metaOAuth?: T; + youtubeOAuth?: T; + cronJobs?: T; + }; + performance?: + | T + | { + avgResponseTimeMs?: T; + p95ResponseTimeMs?: T; + p99ResponseTimeMs?: T; + errorRate?: T; + requestsPerMinute?: T; + }; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-logs_select". + */ +export interface MonitoringLogsSelect { + level?: T; + source?: T; + message?: T; + context?: T; + requestId?: T; + userId?: T; + tenant?: T; + duration?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-alert-rules_select". + */ +export interface MonitoringAlertRulesSelect { + name?: T; + metric?: T; + condition?: T; + threshold?: T; + severity?: T; + channels?: T; + recipients?: + | T + | { + emails?: + | T + | { + email?: T; + id?: T; + }; + slackWebhook?: T; + discordWebhook?: T; + }; + cooldownMinutes?: T; + enabled?: T; + tenant?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "monitoring-alert-history_select". + */ +export interface MonitoringAlertHistorySelect { + rule?: T; + metric?: T; + value?: T; + threshold?: T; + severity?: T; + message?: T; + channelsSent?: T; + resolvedAt?: T; + acknowledgedBy?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "site-settings_select".