Files
HiveGrid-Wireframes/hivegrid-cloud/docs/boilerplate-inventory/data-layer.md
T

262 lines
25 KiB
Markdown

# Boilerplate-Inventur: Daten-Layer (Prisma)
> FAKTISCHE Inventur des Datenbank-Bereichs der Boilerplate.
> Boilerplate-Wurzel: `/Users/raffaelsheikh/Documents/GitHub/boilerplate`
> Nur gelesen — nichts verändert. Diese Datei ist das einzige Schreib-Artefakt.
## Übersicht
| Aspekt | Fakt |
| --- | --- |
| Paket | `@toolctrl/db` (`packages/db/package.json`, `private`, `type: module`) |
| ORM | Prisma `7.8.0` + `@prisma/client` `7.8.0` + `@prisma/adapter-pg` `7.8.0` (Decision: bei Prisma 7 bleiben — `packages/db/ORM-DECISION.md`) |
| Datenbank | PostgreSQL |
| Schema-Ort | `prisma/schema/*.prisma` (27 `.prisma`-Dateien inkl. `schema.prisma` + `app.prisma`-Platzhalter) |
| Migrationen | `prisma/migrations/` (150 Migrations-Ordner; `migration_lock.toml` → provider `postgresql`) |
| Generierter Client | `packages/db/generated/prisma/client` (Output via `generator client` in `schema.prisma`) |
| Modelle gesamt | **190** Prisma-Modelle (Brief nannte ~184) + **6** Enums |
| Verbindungs-URLs | NICHT im Schema (Prisma 7) — liegen in `packages/db/prisma.config.ts`: Migrate nutzt `DIRECT_URL` (Port 5432), Runtime `DATABASE_URL` (Port 6432 / PgBouncer); optional `DATABASE_READ_URL` für Read-Replica |
### Modelle pro Schema-Datei (faktische Zählung)
| Datei | Modelle | Datei | Modelle |
| --- | ---: | --- | ---: |
| `accounts.prisma` | 13 | `knowledgeBase.prisma` | 9 |
| `ai.prisma` | 8 | `marketingLeads.prisma` | 4 |
| `analytics.prisma` | 4 | `notifications.prisma` | 3 |
| `app.prisma` | 0 (Platzhalter `// custom database models`) | `onboarding.prisma` | 7 |
| `appsEngine.prisma` | 5 | `outbox.prisma` | 1 |
| `collabDocs.prisma` | 1 | `permissions.prisma` | 6 |
| `core.prisma` | 16 | `plugins.prisma` | 5 |
| `email.prisma` | 10 | `portals.prisma` | 12 |
| `emailSequences.prisma` | 3 | `promptFlows.prisma` | 12 |
| `entityBuilder.prisma` | 36 | `queue.prisma` | 2 |
| `featureFlags.prisma` | 3 | `sites.prisma` | 1 |
| `formWidget.prisma` | 2 | `subscriptions.prisma` | 14 |
| `helpDesk.prisma` | 2 | `workflows.prisma` | 10 |
| `imports.prisma` | 1 | `schema.prisma` | 0 (generator + datasource) |
---
## Querschnitt-Konventionen (über alle Schemas)
| Konvention | Fakt | Beispiele |
| --- | --- | --- |
| Primärschlüssel | `id String @id @default(cuid())` durchgängig. Ausnahmen: `FileChunk.id Int @default(autoincrement())`, `PluginInvocation.id String @id` (extern gesetzt), Join-Tabellen mit `@@id([...])` (z.B. `PromptFlowGroupEntity`). | — |
| Audit-Timestamps | `createdAt DateTime @default(now())` fast überall; `updatedAt DateTime @updatedAt` auf mutierbaren Entitäten. | nahezu alle Modelle |
| Tenant-Scoping | `tenantId String` (pflicht) oder `tenantId String?` (nullable für system-/global-scoped). `tenant Tenant @relation(... onDelete: Cascade)`. Nullable = system-/operator-weit. | `App.tenantId` (pflicht), `Workflow.tenantId?` (nullable), `Lead` (KEIN tenantId — operator-scoped bis Conversion) |
| Soft-Delete | NUR `Row.deletedAt DateTime?` (`entityBuilder.prisma`) mit `@@index([deletedAt])`. `ExportJob` hat `deletedAt` + `hardDeletedAt` (Retention). Sonst Hard-Delete via `onDelete: Cascade`. | `Row`, `ExportJob` |
| FK-Delete-Strategie | `onDelete: Cascade` (Default), `onDelete: SetNull` (Audit-/Tombstone-Spalten), `onDelete: NoAction`. | `ImpersonationAudit` (SetNull), `Chat.user` (NoAction) |
| Tamper-Evidenz | Hash-Ketten: `AuditEvent` (`previousHash`/`eventHash`), `PluginCapabilityUse` (`prevHash`/`rowHash`), `FeatureFlagAudit` (append-only). | `core.prisma`, `plugins.prisma`, `featureFlags.prisma` |
| DSGVO/PII | IPs als SHA-256-Hash (`ipHash`, `lastIpHash`); Pseudonymisierungs-Flags auf `User` (`pseudonymized`, `scheduledDeletionAt`, `deletionRequestId`); zentrale FK-Karte `packages/db/src/dsgvo/user-fk-map.ts`. | `FormSubmission.ipHash`, `Lead.lastIpHash`, `User` |
| Idempotenz | `dispatchKey`/`requestId`/`triggerEventId` `@unique`; `IdempotencyKey`-Modell für HTTP-Response-Caching. | `OutboxEvent.dispatchKey`, `AICostEvent.requestId` |
| MFA/Secrets | Verschlüsselte Spalten mit `…Encrypted`-Suffix; JSON-Configs mit verschlüsselten Secrets (`configJson`). | `User.totpSecretEncrypted`, `MarketingIntegration.configJson` |
---
## Paket `@toolctrl/db`
**Zweck:** Eigentümer-Paket für die server-seitige Prisma-Client-Grenze, den generierten Client und die Repository-Datenbank-Befehlsfläche. Schema + Migrationen bleiben (Stand jetzt) unter `prisma/`.
### Zentrale Dateien (mit absolutem Pfad)
| Datei | Inhalt / API |
| --- | --- |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/index.ts` | Root-Barrel: re-exportiert auth-boundary, conversations/history, audit-events, export-jobs, idempotency-keys, import-jobs, notifications, outbox(+claim/retention/receiver), permissions-seed, seed, settings, transactions, workspace-invites; `databaseBoundary` / `getDatabaseBoundary()` Metadaten-Objekt |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/client.server.ts` | `getDbClient()` (Dev-Singleton), `getWriteDbClient()` (Primary), `getReadDbClient()` (Replica via `DATABASE_READ_URL`, Fallback Primary), `getExtendedDbClient()` (`$extends` mit `.read`/`.write`), Typen `DbClient`/`ExtendedDbClient`. Nutzt `PrismaPg`-Adapter + `@toolctrl/logger` |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/transactions.server.ts` | `runDbTransaction(callback, client?)`, `runDbTransactionBatch(operations, client?)`, Typen `DbTransactionClient`/`DbTransactionRunner` |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/prisma.ts` | Konstanten der Ownership-Metadaten: `PRISMA_SCHEMA_PATH="prisma/schema"`, `PRISMA_MIGRATIONS_PATH="prisma/migrations"`, `PRISMA_GENERATED_CLIENT_PATH`, `PRISMA_SEED_COMMAND="tsx prisma/seed.ts"` |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/audit-hash.ts` | Tamper-evidente Hash-Kette für `AuditEvent`: `computeAuditHash()`, `verifyAuditChain()`, `canonicalizeAuditPayload()`; HMAC-SHA-256 via `AUDIT_CHAIN_SECRET` (Fallback SHA-256) |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/dsgvo/user-fk-map.ts` | `USER_FK_MAP` — enumeriert ALLE Modelle mit FK auf `User.id` + Cascade-Strategie (`hard-delete` / `pseudonymize` / `retain-tombstone`) + `includeInExport`. Test erzwingt Vollständigkeit gegen Schema (`user-fk-map.test.ts`) |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/dsgvo/pseudonymize.ts` | DSGVO-Pseudonymisierungs-Helfer |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/src/outbox.ts` | Transaktionaler Outbox-Publisher: `publishOutboxEvent(tx, args)`, `OUTBOX_EVENT_TYPE_PATTERN` (`<domain>.<entity>.<verb>`), `OUTBOX_DISPATCH_KEY_PATTERN`, `OUTBOX_MAX_PAYLOAD_BYTES=64 KiB` |
| `/Users/raffaelsheikh/Documents/GitHub/boilerplate/packages/db/prisma.config.ts` | Prisma-7-Config: Schema-/Migrations-Pfad, Seed-Befehl, `datasource.url = env("DATABASE_URL")` |
### Server-Module (Repository-Befehlsfläche, je `*.server.ts` mit `*.test.ts`)
Alle unter `packages/db/src/` (Auswahl der Domänen-Repositories):
`accounts`, `analytics`, `api-keys`, `audit-events`, `auth-boundary`, `auth-providers`, `conversations/history`, `device-tokens`, `email-sequences`, `entities`, `entitlements-seed`, `events`, `event-webhook-attempts`, `export-jobs`, `import-jobs`, `idempotency-keys`, `impersonation-audit`, `kpi`, `logs`, `notifications`, `permissions-seed`, `queue-failed-jobs`, `relationships`, `rows`, `seed`, `settings`, `subscriptions`, `support-tickets`, `telemetry`, `transactions`, `usage`, `users`, `widgets`, `workspace-invites`.
Subpath-Exporte sind in `package.json` deklariert (z.B. `@toolctrl/db/rows.server`, `@toolctrl/db/audit-events.server`, `@toolctrl/db/outbox`).
### Scripts & CI / verify
| Script | Zweck |
| --- | --- |
| `prisma:generate` | `prisma generate` (Root-Config) |
| `prisma:migrate:check` | `scripts/db/check-direct-url.sh --skip-ping` (erzwingt DIRECT_URL) |
| `prisma:migrate:deploy` | check + `prisma migrate deploy` |
| `prisma:migrate:status` | Migrations-Status |
| `seed` / `permissions:sync` | `tsx prisma/seed.ts` bzw. permissions-seed |
| `build` | esbuild-Bundles: `permissions-seed`, `production-seed`, `e2e-readiness-seed` |
| Root `verify:db-migrate-status` | `scripts/verify-db-migrate-status.mjs` (CI-Gate, benötigt `DATABASE_URL`) |
| Root `verify:db-migrate-status:staging` | `scripts/verify-db-migrate-status-staging.sh` |
**HiveGrid-Relevanz:** Fundament für JEDES HiveGrid-Modul. Die Client-/Transaktions-/Outbox-/Audit-Helfer und das Tenant-Scoping-Muster sind direkt wiederverwendbar. `getReadDbClient()`/`getExtendedDbClient()` deckt Read-Heavy HiveGrid-Dashboards ab. `user-fk-map.ts` ist Pflicht-Referenz für jedes neue Modul mit User-Bezug (DSGVO).
---
## Schema-Domänen (Modelle + Kernfelder + HiveGrid-Relevanz)
### accounts.prisma (13) — `prisma/schema/accounts.prisma`
Modelle: `User`, `MagicLinkToken`, `AdminUser`, `Tenant`, `TenantChatbotAccess`, `WorkspaceAuthProvider`, `ImpersonationAudit`, `TenantUser`, `TenantUserInvitation`, `Registration`, `Blacklist`, `TenantIpAddress`, `TenantType`.
- `User`: email-unique, `passwordHash?`, OAuth (`githubId`/`googleId`), MFA (`totpSecretEncrypted`, `mfaRecoveryCodeHashes`), DSGVO-Flags (`pendingDeletion`, `scheduledDeletionAt`, `pseudonymized`, `deletionRequestId`), `defaultTenantId`. Index `user_pending_deletion_due_idx`.
- `Tenant`: `slug @unique`, `name`, `active`, `subscriptionId?`, Chatbot-Felder, AI-Cost-Override-Felder, Theme. Zentraler Tenant-Scope-Anker.
- `TenantUser` (Membership: `type`/`joined`/`status` als Int), `TenantUserInvitation` (`tokenHash`/`tokenPrefix`/`expiresAt`/`status`), `WorkspaceAuthProvider` (SSO/SAML/OIDC pro Tenant), `AdminUser` (Admin-Panel + Authentik-OIDC `ssoProvider`/`ssoSubjectId`), `ImpersonationAudit`.
**HiveGrid-Relevanz:** Identity / Auth / Mandanten-Kern für ALLE HiveGrid-Module (Multi-Tenant-Fundament, SSO, Invitations, Impersonation-Audit). MFA + DSGVO-Selfservice direkt nutzbar.
### core.prisma (16) — `prisma/schema/core.prisma`
Modelle: `AppConfiguration`, `Log`, `AuditEvent`, `IdempotencyKey`, `ApiKey`, `ApiKeyLog`, `Event`, `EventWebhookAttempt`, `MetricLog`, `FileUploadProgress`, `FileChunk`, `FileObject`, `IpAddress`, `IpAddressLog`, `Widget`, `Credential`.
- `AuditEvent`: tamper-evidente Hash-Kette (`previousHash`/`eventHash`), `actorType`/`actorId`/`actorEmail`, `dataSensitivity`, `regulatoryScope[]`, `outcome`. Reichlich Indizes auf `(tenantId, createdAt)` etc.
- `ApiKey`: `keyHash`/`keyPrefix`/`keyLastFour`/`keyVersion` (gehashte Keys), `@@unique([tenantId, alias])`. `ApiKeyLog` für Request-Logging.
- `IdempotencyKey` (`@@unique([scope, key])`), `FileObject`/`FileUploadProgress`/`FileChunk` (Storage-Metadaten), `Credential` (globaler Secret-Store, `value Json`).
**HiveGrid-Relevanz:** Querschnitt — Audit-Trail (Compliance), API-Keys, File-Storage, Idempotenz, Telemetrie. Für HiveGrid-Logging/Audit und externe API-Integrationen unmittelbar verwendbar.
### permissions.prisma (6) — `prisma/schema/permissions.prisma`
Modelle: `Role`, `Permission`, `RolePermission`, `UserRole`, `Group`, `GroupUser`.
- `Role` (tenant-scoped optional, `type`, `isDefault`, `assignToNewUsers`), `Permission` (global `name @unique`, optional `entityId`), Join `RolePermission`. `UserRole` mit nullable `tenantId` (partielle Eindeutigkeit via Migration-SQL). `Group`/`GroupUser` für Gruppen-basierte Berechtigung.
**HiveGrid-Relevanz:** RBAC-Fundament. Jedes HiveGrid-Modul mit Rollen/Rechten baut hierauf auf. Entity-gebundene Permissions koppeln an den Entity-Builder.
### app.prisma (0) — `prisma/schema/app.prisma`
Reiner Platzhalter (`// custom database models`) für projekt-/HiveGrid-spezifische Modelle.
**HiveGrid-Relevanz:** Vorgesehener Ort für HiveGrid-eigene Modelle ohne die Boilerplate-Domänen zu verändern.
### appsEngine.prisma (5) — `prisma/schema/appsEngine.prisma`
Modelle: `App`, `DataConnection`, `AppSyncRun`, `AppSyncRunLog`, `AppSyncItem`.
- `App` (`type`, `config` JSON-String, `@@unique([tenantId, type])`), `DataConnection` (verschlüsselte Credentials), `AppSyncRun` (Status/Mode/Metriken `itemsProcessed`…), `AppSyncItem` (Source→Destination-Mapping + Rollback).
**HiveGrid-Relevanz:** Integrations-/Sync-Engine — relevant für HiveGrid-Module, die externe Datenquellen (REST/OAuth/Webhook) synchronisieren, inkl. Rollback-fähiger Sync-Runs.
### subscriptions.prisma (14) — `prisma/schema/subscriptions.prisma`
Modelle: `SubscriptionProduct`, `SubscriptionPrice`, `SubscriptionUsageBasedPrice`, `SubscriptionUsageBasedTier`, `SubscriptionFeature`, `TenantSubscription`, `TenantSubscriptionProduct`, `TenantSubscriptionProductPrice`, `TenantSubscriptionUsageRecord`, `TenantProductConfiguration`, `TenantFeatureOverride`, `CheckoutSessionStatus`, `Credit`.
- Stripe-gekoppelt (`stripeId`, `stripeCustomerId`, `stripeSubscriptionId`), Usage-Based-Billing (Tiers, UsageRecords), `TenantFeatureOverride` (`@@unique([tenantId, featureKey])`), `TenantProductConfiguration.blueprintId` (Default `crm-saas`), `Credit` (Guthaben pro Tenant/User).
**HiveGrid-Relevanz:** Billing / Entitlements / Feature-Gating-Fundament für HiveGrid-Pläne. Gekoppelt mit `@toolctrl/entitlements` (Workspace-Dependency).
### notifications.prisma (3) — `prisma/schema/notifications.prisma`
Enums: `NotificationDeliveryStatus`, `NotificationPreferenceChannel`. Modelle: `NotificationDelivery`, `UserNotificationPreference`, `DeviceToken`.
- `NotificationDelivery` (Channel IN_APP/EMAIL, `status`, `attemptsMade`, `providerMessageId`, `@@unique([tenantId, userId, channel, sourceKey])`), `UserNotificationPreference` (pro Channel+Category), `DeviceToken` (APNs/FCM/WebPush, `token @unique`, `revokedAt`).
**HiveGrid-Relevanz:** Benachrichtigungs-Querschnitt (In-App + E-Mail + Push) für alle HiveGrid-Module mit User-Notifications. Mobile-Push (Capacitor) bereits modelliert.
### email.prisma (10) — `prisma/schema/email.prisma`
Modelle: `TenantInboundAddress`, `Email`, `EmailRead`, `EmailCc`, `EmailAttachment`, `EmailSender`, `Campaign`, `OutboundEmail`, `OutboundEmailOpen`, `OutboundEmailClick`.
- Inbound (`Email` inbound/outbound, `messageId @unique`) + Outbound-Kampagnen (`Campaign`, `OutboundEmail` mit `sentAt`/`bouncedAt`/`unsubscribedAt`, Open/Click-Tracking).
**HiveGrid-Relevanz:** E-Mail-Infrastruktur (transaktional + Kampagnen) für HiveGrid-Kommunikationsmodule und CRM-Outreach.
### emailSequences.prisma (3) — `prisma/schema/emailSequences.prisma`
Modelle: `EmailSequence`, `EmailSequenceRun`, `EmailSequenceStepDelivery`.
- Drip-Kampagnen via Outbox-Events (`triggerEvent`), `stepsJson` (linear), Run-State, Step-Delivery mit Open/Click/Bounce. `@@unique([sequenceId, triggerEventId])` (Idempotenz).
**HiveGrid-Relevanz:** Marketing-/Lifecycle-Automation. Relevant für HiveGrid-Onboarding-/Nurture-Flows; eng an Outbox + marketingLeads gekoppelt.
### marketingLeads.prisma (4) — `prisma/schema/marketingLeads.prisma`
Enum: `LeadStatus`. Modelle: `Lead`, `LeadEvent`, `TenantAcquisition`, `MarketingIntegration`.
- `Lead` (NICHT tenant-scoped — operator-/sales-scoped, `email @unique`, First-Touch-UTM-Attribution, `score`, `convertedToTenantId`, `lastIpHash`), `LeadEvent` (Timeline-Append-Log), `TenantAcquisition` (Attributions-Snapshot bei Conversion, `tenantId @unique`), `MarketingIntegration` (verschlüsselte `configJson`, `triggerEvents[]`).
**HiveGrid-Relevanz:** Lead-/Funnel-/Attribution-Modul. Relevant für HiveGrid-Akquise/Marketing; zeigt das Muster „operator-scoped statt tenant-scoped".
### entityBuilder.prisma (36) — `prisma/schema/entityBuilder.prisma`
Größte Domäne (No-Code-/Dynamic-Entity-Engine). Kernmodelle:
- `Entity` (`name`/`slug`/`prefix` unique, `type` app/admin/all, Feature-Flags `hasTags`/`hasComments`/`hasTasks`/`hasViews`, `defaultVisibility`), `Property` (typisierte Spalten, `type Int`/`subtype`, `formulaId?`, `@@unique([entityId, name, tenantId])`), `EntityView` (Layout table/board/calendar…, Grid-Konfig, Filter/Sort/GroupBy), `EntityViewProperty`/`EntityViewFilter`/`EntityViewSort`, `PropertyAttribute`/`PropertyOption`, `EntityTag`, `EntityRelationship`/`RowRelationship` (Parent/Child), `EntityWebhook`/`EntityWebhookLog`.
- **Row-Daten:** `Row` (`folio`, `deletedAt?` Soft-Delete, `order`, FK auf Entity/Tenant/User), `RowValue` (polymorphe Werte: text/number/date/boolean), `RowValueMultiple`, `RowValueRange`, `RowMedia`, `RowPermission` (row-level: role/group/user/public), `RowTag`, `RowComment`/`RowCommentReaction`, `RowTask`.
- `Formula`/`FormulaComponent`/`FormulaLog`/`FormulaComponentLog`, `EntityGroup`/`EntityGroupEntity`/`EntityGroupConfiguration(Row)`, `EntityTemplate`, `ApiKeyEntity` (per-Entity-CRUD-Rechte), `TenantSettingsRow`, `SampleCustomEntity`.
**HiveGrid-Relevanz:** Kern-Datenmodell-Engine. Wenn HiveGrid dynamische/benutzerdefinierte Entitäten, Tabellen-Views, Row-Level-Permissions, Tags/Tasks/Comments oder Formeln braucht, ist dies das Fundament. Größter Wiederverwendungs-Hebel und größte Komplexität.
### portals.prisma (12) — `prisma/schema/portals.prisma`
Modelle: `Portal`, `PortalUser`, `PortalPage`, `PortalUserRegistration`, `PortalSubscriptionProduct`, `PortalSubscriptionPrice`, `PortalSubscriptionFeature`, `PortalUserSubscription`, `PortalUserSubscriptionProduct`, `PortalUserSubscriptionProductPrice`, `PortalCheckoutSessionStatus`.
- `Portal` (`subdomain @unique`, optional `domain`, SEO/Branding/Auth-Flags, eigene Stripe-Account), `PortalUser` (separate End-User-Identität pro Portal, `@@unique([portalId, email])`), eigenes Subscription-Subsystem (gespiegelt vom Haupt-Subscriptions-Modell).
**HiveGrid-Relevanz:** Customer-Portal / White-Label-Public-Sites mit eigener User-Basis und eigenem Billing. Relevant falls HiveGrid kundenseitige Portale (B2B2C) anbietet.
### promptFlows.prisma (12) — `prisma/schema/promptFlows.prisma`
Modelle: `PromptFlowGroup`, `PromptFlowGroupTemplate`, `PromptFlowGroupEntity`, `PromptFlow`, `PromptFlowInputVariable`, `PromptTemplate`, `PromptFlowOutput`, `PromptFlowOutputMapping`, `PromptFlowExecution`, `PromptTemplateResult`.
- LLM-Prompt-Pipelines, an `Entity`/`Property` gekoppelt (Output-Mapping in Row-Properties), `executionType` sequential/parallel, Streaming-Flag, Execution + Result-Log.
**HiveGrid-Relevanz:** AI-Prompt-Orchestrierung an Entity-Daten. Relevant für HiveGrid-Module, die strukturierte LLM-Outputs in Datensätze schreiben.
### ai.prisma (8) — `prisma/schema/ai.prisma`
Modelle: `Chat`, `ChatMessage`, `ChatMessagePart`, `GeneratedObject`, `AICostEvent`, `TenantAICostSummary`.
- `Chat` (Typ tenant/admin/marketing, Scope, anonym via `sessionId`), `ChatMessage`/`ChatMessagePart` (Multi-Part), `GeneratedObject` (LLM-Generierungen + Token/Cost-Felder), `AICostEvent` (append-only Cost-Log, `requestId @unique`, KEINE Prompt-Bodies, Stripe-Overage-Felder), `TenantAICostSummary` (vor-aggregiert pro Periode).
**HiveGrid-Relevanz:** AI-Chatbot + AI-Kostentracking/Billing. Für HiveGrid-Assistenten und AI-Cost-Dashboards direkt nutzbar.
### workflows.prisma (10) — `prisma/schema/workflows.prisma`
Modelle: `Workflow`, `WorkflowBlock`, `WorkflowBlockConditionGroup`, `WorkflowBlockCondition`, `WorkflowBlockToBlock`, `WorkflowExecution`, `WorkflowInputExample`, `WorkflowBlockExecution`, `WorkflowVariable`, `WorkflowCredential`.
- Visueller Workflow-Builder: Blocks + Conditions + Block-zu-Block-Edges, Execution-Tracking pro Block, tenant-scoped + `appliesToAllTenants`. `WorkflowVariable`/`WorkflowCredential` (`@@unique([tenantId, name])`).
**HiveGrid-Relevanz:** Automatisierungs-/Workflow-Engine (node-basiert). Relevant für HiveGrid-Prozessautomatisierung, gekoppelt an Outbox-Events.
### knowledgeBase.prisma (9) — `prisma/schema/knowledgeBase.prisma`
Modelle: `KnowledgeBase`, `KnowledgeBaseCategory`, `KnowledgeBaseCategorySection`, `KnowledgeBaseArticle`, `KnowledgeBaseRelatedArticle`, `KnowledgeBaseViews`, `KnowledgeBaseArticleViews`, `KnowledgeBaseArticleUpvotes`, `KnowledgeBaseArticleDownvotes`.
- Mehrsprachige Wissensdatenbank, tenant-scoped optional (`ownerKey` default "global"), Artikel mit Draft/Published-Content, Voting + View-Tracking.
**HiveGrid-Relevanz:** Help-Center / Docs-Modul. Relevant für HiveGrid-Self-Service-Wissensbasis.
### onboarding.prisma (7) — `prisma/schema/onboarding.prisma`
Modelle: `Onboarding`, `OnboardingFilter`, `OnboardingStep`, `OnboardingSession`, `OnboardingSessionAction`, `OnboardingSessionFilterMatch`, `OnboardingSessionStep`.
- Onboarding-Flows (modal/page), Filter-Targeting, Session-Tracking pro User/Tenant (`@@unique([onboardingId, userId, tenantId])`).
**HiveGrid-Relevanz:** User-Onboarding / Produkt-Touren für HiveGrid-Adoption.
### analytics.prisma (4) — `prisma/schema/analytics.prisma`
Modelle: `AnalyticsSettings`, `AnalyticsUniqueVisitor`, `AnalyticsPageView`, `AnalyticsEvent`.
- First-Party-Web-Analytics (Cookie-basiert, UTM, Device/Browser), an `Portal`/`User`/`PortalUser`/`FeatureFlag` gekoppelt.
**HiveGrid-Relevanz:** Eingebettetes Web-Analytics für HiveGrid-Portale/Sites; FeatureFlag-Event-Korrelation.
### featureFlags.prisma (3) — `prisma/schema/featureFlags.prisma`
Modelle: `FeatureFlag`, `FeatureFlagFilter`, `FeatureFlagAudit`.
- `FeatureFlag` (scope global/tenant/user, v2-Targeting `rules`/`variants` JSON, `enabledFrom/Until`, Flag-Dependencies via self-relation), `FeatureFlagFilter` (Prozent/Sprache/Page…), `FeatureFlagAudit` (append-only).
**HiveGrid-Relevanz:** Feature-Toggles / Gradual-Rollout / A-B für alle HiveGrid-Module.
### plugins.prisma (5) — `prisma/schema/plugins.prisma`
Modelle: `Plugin`, `TenantPluginCapabilityGrant`, `PluginUserConfig`, `PluginInvocation`, `PluginCapabilityUse`.
- WASM-Plugin-Runtime: `Plugin` (`wasmSha256`, `signaturePublicKey` Ed25519, `manifest` JSON, `@@unique([tenantId, pluginId])`), explizite Capability-Grants pro Tenant, per-User-Config, Invocation-Audit + per-Capability-Use mit Hash-Kette (`prevHash`/`rowHash`).
**HiveGrid-Relevanz:** Erweiterbarkeit via signierte sandboxed Plugins. Relevant falls HiveGrid Third-Party-/Custom-Erweiterungen unterstützt.
### imports.prisma (1) — `prisma/schema/imports.prisma`
Enum: `ImportJobStatus`. Modell: `ImportJob` (tenant-scoped, `importType`/`format`, Source-Bucket/Key, `acceptedRows`/`rejectedRows`, Error-Report-Bucket, `requestId`).
**HiveGrid-Relevanz:** Daten-Import-Jobs (CSV/etc.) für HiveGrid-Bulk-Onboarding.
### queue.prisma (2) — `prisma/schema/queue.prisma`
Enum: `ExportJobStatus`. Modelle: `QueueFailedJob` (BullMQ-DLQ, `@@unique([queueName, jobName, jobId])`), `ExportJob` (Daten-Export mit Retention `expiresAt`/`deletedAt`/`hardDeletedAt`).
**HiveGrid-Relevanz:** Background-Job-Fehler-Observability + DSGVO-konformer Datenexport.
### outbox.prisma (1) — `prisma/schema/outbox.prisma`
Enum: `OutboxStatus`. Modell: `OutboxEvent` (`eventType`, `payload` JSON, `status`, `retries`, `scheduledAt`, `dispatchKey @unique` für Idempotenz, `priority`, `lockedUntil`). Reiche Indizes für Dispatcher-Polling.
**HiveGrid-Relevanz:** Transaktionales Outbox-Muster — atomare Side-Effects mit DB-Writes. Querschnitt für ALLE HiveGrid-Module mit zuverlässiger Event-Auslieferung (Publisher: `packages/db/src/outbox.ts`).
### sites.prisma (1) — `prisma/schema/sites.prisma`
Modell: `Site` (tenant-scoped, `type` community/booking, `siteId @@unique([type, siteId])`, Branding/Copy JSON, Server-Resolution domain/path/subdomain).
**HiveGrid-Relevanz:** Multi-Site / Public-Sites (z.B. Booking/Community). Relevant für HiveGrid-Endkunden-Frontends.
### collabDocs.prisma (1) — `prisma/schema/collabDocs.prisma`
Modell: `CollabDoc` (Y.js/Hocuspocus Realtime-Docs, `ydocState Bytes`, `version`, `@@unique([tenantId, resourceType, resourceId])`).
**HiveGrid-Relevanz:** Realtime-Kollaboration (Live-Editing) für HiveGrid-Dokumente/Notizen.
### helpDesk.prisma (2) — `prisma/schema/helpDesk.prisma`
Modelle: `Feedback` (tenant/user-scoped, `message`, `fromUrl`), `SupportTicket` (`source`/`status`/`priority`, `inboundMessageId @unique`).
**HiveGrid-Relevanz:** Support-/Feedback-Modul für HiveGrid-Kundenservice.
### formWidget.prisma (2) — `prisma/schema/formWidget.prisma`
Modelle: `Form` (tenant-scoped, embeddable, `key @unique`, `definition` JSON, `fieldMapping`, `allowedOrigins[]`, Anti-Spam-`config`), `FormSubmission` (`payload` JSON, `ipHash`, `status` received/processed/failed/spam).
**HiveGrid-Relevanz:** Eingebettete Formulare (Lead-Capture, Kontakt) für HiveGrid-Public-Surfaces; koppelt an CRM/Entity-Rows.
---
## Hinweise für Modul-Abgleich-Agenten
- **Tenant-Scope-Regel:** `tenantId` nullable ⇒ system-/operator-weit; `tenantId` pflicht ⇒ strikt mandanten-isoliert. `Lead` ist bewusst NICHT tenant-scoped.
- **Soft-Delete ist die Ausnahme:** nur `Row.deletedAt` + `ExportJob`. Default ist Hard-Delete via `onDelete: Cascade`.
- **Vor jedem neuen User-FK:** Eintrag in `packages/db/src/dsgvo/user-fk-map.ts` ergänzen — der Test bricht CI sonst.
- **Side-Effects:** über Outbox (`publishOutboxEvent` in `$transaction`), nicht direkt.
- **Verbindungen:** Migrate = `DIRECT_URL`, Runtime = `DATABASE_URL` (PgBouncer), Reads optional `DATABASE_READ_URL`.
- **HiveGrid-eigene Modelle:** `prisma/schema/app.prisma` ist der vorgesehene leere Platzhalter.