generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-3.0.x"] previewFeatures = ["metrics", "tracing"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model Workspace { id String @id @default(uuid()) @db.VarChar public Boolean createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) users UserWorkspacePermission[] @@map("workspaces") } model UserWorkspacePermission { id String @id @default(uuid()) @db.VarChar workspaceId String @map("workspace_id") @db.VarChar subPageId String? @map("sub_page_id") @db.VarChar userId String? @map("entity_id") @db.VarChar /// Read/Write/Admin/Owner type Int @db.SmallInt /// Whether the permission invitation is accepted by the user accepted Boolean @default(false) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) user User? @relation(fields: [userId], references: [id], onDelete: Cascade) workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade) @@unique([workspaceId, subPageId, userId]) @@map("user_workspace_permissions") } model User { id String @id @default(uuid()) @db.VarChar name String email String @unique emailVerified DateTime? @map("email_verified") // image field is for the next-auth avatarUrl String? @map("avatar_url") @db.VarChar accounts Account[] sessions Session[] workspaces UserWorkspacePermission[] createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) /// Not available if user signed up through OAuth providers password String? @db.VarChar features UserFeatureGates[] @@map("users") } model UserFeatureGates { id String @id @default(uuid()) @db.VarChar userId String @map("user_id") @db.VarChar feature String @db.VarChar reason String @db.VarChar createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("user_feature_gates") } model Account { id String @id @default(cuid()) userId String @map("user_id") type String provider String providerAccountId String @map("provider_account_id") refresh_token String? @db.Text access_token String? @db.Text expires_at Int? token_type String? scope String? id_token String? @db.Text session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) @@map("accounts") } model Session { id String @id @default(cuid()) sessionToken String @unique @map("session_token") userId String @map("user_id") expires DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("sessions") } model VerificationToken { identifier String token String @unique expires DateTime @@unique([identifier, token]) @@map("verificationtokens") } model Blob { id Int @id @default(autoincrement()) @db.Integer hash String @db.VarChar workspaceId String @map("workspace_id") @db.VarChar blob Bytes @db.ByteA length BigInt createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) @@unique([workspaceId, hash]) @@map("blobs") } model OptimizedBlob { id Int @id @default(autoincrement()) @db.Integer hash String @db.VarChar workspaceId String @map("workspace_id") @db.VarChar params String @db.VarChar blob Bytes @db.ByteA length BigInt createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) @@unique([workspaceId, hash, params]) @@map("optimized_blobs") } // the latest snapshot of each doc that we've seen // Snapshot + Updates are the latest state of the doc model Snapshot { id String @default(uuid()) @map("guid") @db.VarChar workspaceId String @map("workspace_id") @db.VarChar blob Bytes @db.ByteA seq Int @default(0) @db.Integer state Bytes? @db.ByteA createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(6) @@id([id, workspaceId]) @@map("snapshots") } // backup during other update operation queue downtime model Update { objectId String @id @default(uuid()) @map("object_id") @db.VarChar workspaceId String @map("workspace_id") @db.VarChar id String @map("guid") @db.VarChar seq Int @db.Integer blob Bytes @db.ByteA createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) @@unique([workspaceId, id, seq]) @@map("updates") } model NewFeaturesWaitingList { id String @id @default(uuid()) @db.VarChar email String @unique type Int @db.SmallInt createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) @@map("new_features_waiting_list") }