-
Notifications
You must be signed in to change notification settings - Fork 77
Expand file tree
/
Copy pathschema.prisma
More file actions
133 lines (116 loc) · 5 KB
/
schema.prisma
File metadata and controls
133 lines (116 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum MemberRole {
VIEWER
MEMBER
ADMIN
}
// Access Keys - API authentication for SDK/trace ingestion
model AccessKey {
id String @id @db.VarChar
projectId String @map("project_id") @db.VarChar
secretHash String @unique @map("secret_hash") @db.VarChar
keyHint String @map("key_hint") @db.VarChar
name String? @db.VarChar
expireTime DateTime? @map("expire_time") @db.Timestamp(6)
lastUseTime DateTime? @map("last_use_time") @db.Timestamp(6)
createTime DateTime @default(now()) @map("create_time") @db.Timestamp(6)
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@index([projectId], map: "ix_access_key_project_id")
@@map("access_keys")
}
// Invites - Pending workspace invitations
model Invite {
id String @id @db.VarChar
email String @db.VarChar
workspaceId String @map("workspace_id") @db.VarChar
role MemberRole
invitedByUserId String? @map("invited_by_user_id") @db.VarChar
createTime DateTime @default(now()) @map("create_time") @db.Timestamp(6)
updateTime DateTime @default(now()) @map("update_time") @db.Timestamp(6)
invitedBy User? @relation(fields: [invitedByUserId], references: [id], onUpdate: NoAction)
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@unique([email, workspaceId], map: "uq_invite_email_workspace")
@@index([workspaceId], map: "ix_invite_workspace_id")
@@map("invites")
}
// Workspace Members - User membership in workspaces
model WorkspaceMember {
id String @id @db.VarChar
workspaceId String @map("workspace_id") @db.VarChar
userId String @map("user_id") @db.VarChar
role MemberRole
createTime DateTime @default(now()) @map("create_time") @db.Timestamp(6)
updateTime DateTime @default(now()) @map("update_time") @db.Timestamp(6)
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade, onUpdate: NoAction)
user User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@unique([workspaceId, userId], map: "uq_workspace_user")
@@index([workspaceId], map: "ix_workspace_member_workspace_id")
@@index([userId], map: "ix_workspace_member_user_id")
@@map("workspace_members")
}
// Workspaces - Top-level container for projects and members
model Workspace {
id String @id @db.VarChar
name String @db.VarChar
createTime DateTime @default(now()) @map("create_time") @db.Timestamp(6)
updateTime DateTime @default(now()) @map("update_time") @db.Timestamp(6)
invites Invite[]
members WorkspaceMember[]
projects Project[]
@@map("workspaces")
}
// Projects - Container for traces and access keys
model Project {
id String @id @db.VarChar
workspaceId String @map("workspace_id") @db.VarChar
name String @db.VarChar
traceTtlDays Int? @map("trace_ttl_days")
deleteTime DateTime? @map("delete_time") @db.Timestamp(6)
createTime DateTime @default(now()) @map("create_time") @db.Timestamp(6)
updateTime DateTime @default(now()) @map("update_time") @db.Timestamp(6)
accessKeys AccessKey[]
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@index([workspaceId], map: "ix_project_workspace_id")
@@map("projects")
}
// Users - Authentication and identity
model User {
id String @id @default(cuid()) @db.VarChar
email String? @unique @db.VarChar
emailVerified DateTime? @map("email_verified")
name String? @db.VarChar
image String? @db.VarChar
password String? @db.VarChar
createTime DateTime @default(now()) @map("create_time") @db.Timestamp(6)
updateTime DateTime @default(now()) @map("update_time") @db.Timestamp(6)
invites Invite[]
memberships WorkspaceMember[]
accounts Account[]
@@map("users")
}
// Accounts - OAuth provider accounts (NextAuth)
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?
createTime DateTime @default(now()) @map("create_time")
updateTime DateTime @updatedAt @map("update_time")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([provider, providerAccountId])
@@map("accounts")
}