schema.prisma•4.08 kB
generator client {
provider = "prisma-client-js"
output = "src/generated/@prisma/client"
}
datasource db {
provider = "postgresql"
url = env("APISERVER_IDENTITY_DATABASE_URL")
}
model User {
ref String @id @default(uuid())
accessKeyId String @unique @map("access_key_id") @db.VarChar(255)
name String @db.VarChar(60)
email String @unique @db.VarChar(255)
emailVerified Boolean @default(false) @map("email_verified")
password String @map("password_hash") /// @encrypted
phoneNumber String? @map("phone_number") @db.VarChar(20)
phoneNumberVerified Boolean @default(false) @map("phone_number_verified")
avatar String? @db.VarChar(255)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3)
extended Json?
// Relations
ownedWorkspaces Workspace[] // Workspaces owned by the user
memberships WorkspaceMember[] // Workspaces the user is a member of
// Indexes and maps
@@index([email], type: Hash)
@@index([accessKeyId], type: Hash)
@@map("users")
}
model Workspace {
ref String @id @default(uuid())
accessKeyId String @unique @map("access_key_id") @db.VarChar(255)
name String @db.VarChar(60)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3)
// Relations
owner User @relation(fields: [ownerRef], references: [ref], onDelete: Cascade)
ownerRef String @map("owner_ref")
members WorkspaceMember[]
apiKeys ApiKey[]
// Indexes and maps
@@index([accessKeyId], type: Hash)
@@index([ownerRef], type: Hash)
@@map("workspaces")
}
model WorkspaceMember {
ref String @id @default(uuid())
status WorkspaceMemberStatus @default(PENDING)
role Role @default(WORKSPACE_MEMBER)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3)
// Relations
user User @relation(fields: [userRef], references: [ref], onDelete: Cascade)
userRef String @map("user_ref")
workspace Workspace @relation(fields: [workspaceRef], references: [ref], onDelete: Cascade)
workspaceRef String @map("workspace_ref")
@@unique([userRef, workspaceRef])
@@map("workspace_members")
}
model ApiKey {
ref String @id @default(uuid())
accessKeyId String @unique @map("access_key_id") @db.VarChar(255)
accessKeySecret String @map("access_key_secret") @db.VarChar(255) /// @encrypted
role Role @default(WORKSPACE_MEMBER)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(3)
expiresAt DateTime? @map("expires_at") @db.Timestamptz(3)
// Relations
workspace Workspace @relation(fields: [workspaceRef], references: [ref], onDelete: Cascade)
workspaceRef String @map("workspace_ref")
// Indexes and maps
@@index([accessKeyId], type: Hash)
@@index([workspaceRef], type: Hash)
@@map("api_keys")
}
model VerificationCode {
ref String @id @default(uuid())
type VerificationType
code String @db.VarChar(6)
value String @db.VarChar(255)
expiresAt DateTime @map("expires_at") @db.Timestamptz(3)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
// Indexes and maps
@@index([code], type: Hash)
@@map("verification_codes")
}
enum VerificationType {
EMAIL
PHONE
}
enum WorkspaceMemberStatus {
PENDING
ACTIVE
@@map("workspace_member_status")
}
enum Role {
USER
WORKSPACE_ADMIN
WORKSPACE_OWNER
WORKSPACE_MEMBER
@@map("role")
}