generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum NodeType { task event note project goal } enum NodeStatus { active archived deleted } enum LinkType { references blocks relates_to parent_of child_of scheduled_as prepared_for } enum WorkspaceRole { owner admin editor viewer } enum ReminderStatus { pending sent dismissed snoozed } enum NotificationType { push email sms in_app } enum ActionType { created updated deleted viewed shared linked completed ai_assisted } model User { id String @id @default(uuid()) @db.Uuid email String @unique passwordHash String @map("password_hash") displayName String @map("display_name") avatarUrl String? @map("avatar_url") @db.VarChar preferences Json @default("{}") encryptionKey String? @map("encryption_key") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") lastActiveAt DateTime @default(now()) @map("last_active_at") nodes Node[] ownedWorkspaces Workspace[] @relation("OwnedWorkspaces") memberships WorkspaceMember[] activities Activity[] reminders Reminder[] syncCheckpoints SyncCheckpoint[] refreshTokens RefreshToken[] @@map("users") } model RefreshToken { id String @id @default(uuid()) @db.Uuid tokenHash String @map("token_hash") userId String @map("user_id") @db.Uuid expiresAt DateTime @map("expires_at") createdAt DateTime @default(now()) @map("created_at") user User @relation(fields: [userId], references: [id]) @@index([userId]) @@index([tokenHash]) @@map("refresh_tokens") } model Workspace { id String @id @default(uuid()) @db.Uuid name String slug String description String? settings Json @default("{}") ownerId String @map("owner_id") @db.Uuid createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") owner User @relation("OwnedWorkspaces", fields: [ownerId], references: [id]) members WorkspaceMember[] nodes Node[] tags Tag[] folders Folder[] @@unique([slug, ownerId]) @@map("workspaces") } model Node { id String @id @default(uuid()) @db.Uuid type NodeType workspaceId String @map("workspace_id") @db.Uuid ownerId String @map("owner_id") @db.Uuid parentId String? @map("parent_id") @db.Uuid title String content Json @default("{}") plainText String @default("") @map("plain_text") status NodeStatus @default(active) priority Int? startTime DateTime? @map("start_time") endTime DateTime? @map("end_time") durationMinutes Int? @map("duration_minutes") recurrenceRule String? @map("recurrence_rule") completionRate Float? @map("completion_rate") metadata Json @default("{}") version Int @default(1) isEncrypted Boolean @default(false) @map("is_encrypted") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") completedAt DateTime? @map("completed_at") archivedAt DateTime? @map("archived_at") workspace Workspace @relation(fields: [workspaceId], references: [id]) owner User @relation(fields: [ownerId], references: [id]) parent Node? @relation("NodeHierarchy", fields: [parentId], references: [id]) children Node[] @relation("NodeHierarchy") tags NodeTag[] links NodeLink[] @relation("NodeLinksSource") backlinks NodeLink[] @relation("NodeLinksTarget") activities Activity[] reminders Reminder[] attachments Attachment[] embeddings Embedding[] @@index([type, status, workspaceId, ownerId]) @@index([createdAt]) @@map("nodes") } model NodeLink { id String @id @default(uuid()) @db.Uuid sourceId String @map("source_id") @db.Uuid targetId String @map("target_id") @db.Uuid linkType LinkType @map("link_type") strength Float @default(0.5) isAuto Boolean @default(false) @map("is_auto") context String? @db.Text createdAt DateTime @default(now()) @map("created_at") source Node @relation("NodeLinksSource", fields: [sourceId], references: [id]) target Node @relation("NodeLinksTarget", fields: [targetId], references: [id]) @@unique([sourceId, targetId, linkType]) @@index([sourceId]) @@index([targetId]) @@map("node_links") } model Tag { id String @id @default(uuid()) @db.Uuid name String color String @db.VarChar(7) workspaceId String @map("workspace_id") @db.Uuid isSystem Boolean @default(false) @map("is_system") createdAt DateTime @default(now()) @map("created_at") workspace Workspace @relation(fields: [workspaceId], references: [id]) nodes NodeTag[] @@map("tags") } model NodeTag { nodeId String @map("node_id") @db.Uuid tagId String @map("tag_id") @db.Uuid node Node @relation(fields: [nodeId], references: [id]) tag Tag @relation(fields: [tagId], references: [id]) @@id([nodeId, tagId]) @@map("node_tags") } model Folder { id String @id @default(uuid()) @db.Uuid name String workspaceId String @map("workspace_id") @db.Uuid parentId String? @map("parent_id") @db.Uuid viewType String @default("list") @map("view_type") filterConfig Json @default("{}") @map("filter_config") sortConfig Json @default("{}") @map("sort_config") orderIndex Int @default(0) @map("order_index") createdAt DateTime @default(now()) @map("created_at") workspace Workspace @relation(fields: [workspaceId], references: [id]) parent Folder? @relation("FolderHierarchy", fields: [parentId], references: [id]) children Folder[] @relation("FolderHierarchy") @@map("folders") } model Reminder { id String @id @default(uuid()) @db.Uuid nodeId String @map("node_id") @db.Uuid userId String @map("user_id") @db.Uuid remindAt DateTime @map("remind_at") notificationType NotificationType @map("notification_type") status ReminderStatus @default(pending) snoozeUntil DateTime? @map("snooze_until") createdAt DateTime @default(now()) @map("created_at") node Node @relation(fields: [nodeId], references: [id]) user User @relation(fields: [userId], references: [id]) @@map("reminders") } model Embedding { id String @id @default(uuid()) @db.Uuid nodeId String @map("node_id") @db.Uuid chunkIndex Int @map("chunk_index") chunkText String @map("chunk_text") @db.Text vector Unsupported("vector(1536)") modelVersion String @map("model_version") createdAt DateTime @default(now()) @map("created_at") node Node @relation(fields: [nodeId], references: [id]) @@index([nodeId]) @@map("embeddings") } model Activity { id String @id @default(uuid()) @db.Uuid userId String @map("user_id") @db.Uuid nodeId String? @map("node_id") @db.Uuid workspaceId String @map("workspace_id") @db.Uuid actionType ActionType @map("action_type") metadata Json @default("{}") sessionId String? @map("session_id") @db.Text createdAt DateTime @default(now()) @map("created_at") user User @relation(fields: [userId], references: [id]) node Node? @relation(fields: [nodeId], references: [id]) @@index([createdAt]) @@index([userId, workspaceId, actionType]) @@map("activities") } model Attachment { id String @id @default(uuid()) @db.Uuid nodeId String @map("node_id") @db.Uuid filename String mimeType String @map("mime_type") sizeBytes Int @map("size_bytes") storageKey String @map("storage_key") thumbnailKey String? @map("thumbnail_key") uploadedBy String @map("uploaded_by") @db.Uuid createdAt DateTime @default(now()) @map("created_at") node Node @relation(fields: [nodeId], references: [id]) @@map("attachments") } model WorkspaceMember { id String @id @default(uuid()) @db.Uuid workspaceId String @map("workspace_id") @db.Uuid userId String @map("user_id") @db.Uuid role WorkspaceRole permissions Json @default("{}") joinedAt DateTime @default(now()) @map("joined_at") lastAccessedAt DateTime @default(now()) @map("last_accessed_at") workspace Workspace @relation(fields: [workspaceId], references: [id]) user User @relation(fields: [userId], references: [id]) @@unique([workspaceId, userId]) @@map("workspace_members") } model SyncCheckpoint { id String @id @default(uuid()) @db.Uuid userId String @map("user_id") @db.Uuid deviceId String @map("device_id") lastSyncAt DateTime @default(now()) @map("last_sync_at") syncToken String? @map("sync_token") deviceInfo Json @default("{}") @map("device_info") updatedAt DateTime @updatedAt @map("updated_at") user User @relation(fields: [userId], references: [id]) @@unique([userId, deviceId]) @@map("sync_checkpoints") } model PasswordResetToken { id String @id @default(uuid()) @db.Uuid tokenHash String @map("token_hash") userId String @map("user_id") @db.Uuid expiresAt DateTime @map("expires_at") createdAt DateTime @default(now()) @map("created_at") @@index([tokenHash]) @@map("password_reset_tokens") }