| generator client { |
| provider = "prisma-client-js" |
| } |
|
|
| datasource db { |
| provider = "postgresql" |
| url = env("DATABASE_URL") |
| } |
|
|
| model User { |
| id String @id @default(uuid()) |
| email String @unique |
| name String |
| avatar String? |
| password String? |
| provider String @default("LOCAL") |
| createdAt DateTime @default(now()) |
| updatedAt DateTime @updatedAt |
|
|
| ownedRooms Room[] @relation("RoomOwner") |
| memberships RoomMembership[] |
| messages Message[] |
| executions Execution[] |
| snippets Snippet[] |
| activities Activity[] |
|
|
| @@map("users") |
| } |
|
|
| model Room { |
| id String @id @default(uuid()) |
| name String |
| ownerId String |
| language String @default("javascript") |
| isPublic Boolean @default(false) |
| inviteCode String @unique |
| maxMembers Int @default(10) |
| createdAt DateTime @default(now()) |
| updatedAt DateTime @updatedAt |
|
|
| owner User @relation("RoomOwner", fields: [ownerId], references: [id], onDelete: Cascade) |
| members RoomMembership[] |
| files RoomFile[] |
| messages Message[] |
| executions Execution[] |
|
|
| @@index([ownerId]) |
| @@map("rooms") |
| } |
|
|
| model RoomMembership { |
| id String @id @default(uuid()) |
| userId String |
| roomId String |
| role String @default("EDITOR") |
| joinedAt DateTime @default(now()) |
| lastActive DateTime @default(now()) |
|
|
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
| room Room @relation(fields: [roomId], references: [id], onDelete: Cascade) |
|
|
| @@unique([userId, roomId]) |
| @@map("room_memberships") |
| } |
|
|
| model RoomFile { |
| id String @id @default(uuid()) |
| roomId String |
| name String |
| path String |
| content String @default("") |
| language String @default("javascript") |
| createdAt DateTime @default(now()) |
| updatedAt DateTime @updatedAt |
|
|
| room Room @relation(fields: [roomId], references: [id], onDelete: Cascade) |
|
|
| @@unique([roomId, path]) |
| @@map("room_files") |
| } |
|
|
| model Message { |
| id String @id @default(uuid()) |
| content String |
| type String @default("TEXT") |
| metadata Json? |
| userId String |
| roomId String |
| createdAt DateTime @default(now()) |
|
|
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
| room Room @relation(fields: [roomId], references: [id], onDelete: Cascade) |
|
|
| @@index([roomId, createdAt]) |
| @@map("messages") |
| } |
|
|
| model Execution { |
| id String @id @default(uuid()) |
| userId String |
| roomId String |
| language String |
| code String |
| stdout String @default("") |
| stderr String @default("") |
| exitCode Int @default(0) |
| duration Int @default(0) |
| memoryUsed Int @default(0) |
| timedOut Boolean @default(false) |
| createdAt DateTime @default(now()) |
|
|
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
| room Room @relation(fields: [roomId], references: [id], onDelete: Cascade) |
|
|
| @@index([userId, createdAt]) |
| @@map("executions") |
| } |
|
|
| model Snippet { |
| id String @id @default(uuid()) |
| userId String |
| title String |
| description String? |
| code String |
| language String |
| isPublic Boolean @default(false) |
| createdAt DateTime @default(now()) |
| updatedAt DateTime @updatedAt |
|
|
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
|
|
| @@index([userId]) |
| @@map("snippets") |
| } |
|
|
| model Activity { |
| id String @id @default(uuid()) |
| userId String |
| type String |
| description String |
| roomId String? |
| roomName String? |
| metadata Json? |
| createdAt DateTime @default(now()) |
|
|
| user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
|
|
| @@index([userId, createdAt]) |
| @@map("activities") |
| } |
|
|