-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.prisma
More file actions
283 lines (252 loc) · 8.11 KB
/
schema.prisma
File metadata and controls
283 lines (252 loc) · 8.11 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
generator client {
provider = "prisma-client-js"
previewFeatures = ["metrics"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum OrgPlan {
None
Starter
Team
Professional
Enterprise
}
model Org {
orgId String @id
orgName String
orgPlan OrgPlan @default(Starter)
orgUsers User[]
orgSessions Session[]
orgEvents EventLog[]
orgProjects Project[]
orgWorkflows Workflow[]
orgTeams Team[]
}
enum UserRole {
Owner // Can add / manage administrators and below
Admin // Can add / manage devs and viewer
Developer // Read + Write Access, Can Trigger Workflows
Viewer // Read Access Only
}
model User {
userId String @id @default(cuid(2))
userFirstName String
userMail String
userPassword String
userRole UserRole
userLastName String?
userOrgId String
userVerified Boolean @default(false)
userOrg Org @relation(fields: [userOrgId], references: [orgId], onDelete: Cascade, onUpdate: Cascade)
userTeams UserTeams[]
userProjects ProjectUserAccess[]
userSessions Session[]
userS3Requests S3Request[]
userEvents EventLog[]
userVerificationTokens UserVerificationToken[]
userWorkflowMessages WorkflowMessage[]
}
model UserVerificationToken {
tokenId String @id @default(cuid(2))
verificationToken String
tokenExpirationTimestamp DateTime
userId String
targetUser User @relation(fields: [userId], references: [userId], onDelete: Cascade)
}
model Session {
sessionId String @id @default(cuid(2))
sessionToken String
sessionIp String
sessionUA String
sessionStartTimestamp DateTime
sessionEndTimestamp DateTime
userId String
sessionUser User @relation(fields: [userId], references: [userId], onDelete: Cascade, onUpdate: Cascade)
orgId String
sessionOrg Org @relation(fields: [orgId], references: [orgId], onDelete: Cascade, onUpdate: Cascade)
sessionEvents EventLog[]
sessionXSRFTokens CrossSiteToken[]
}
model CrossSiteToken {
tokenId String @id @default(cuid(2))
tokenHash String
tokenExpiryTimestamp DateTime
tokenIp String
tokenUA String
tokenSessionId String?
tokenSession Session? @relation(fields: [tokenSessionId], references: [sessionId], onDelete: Cascade, onUpdate: Cascade)
@@index([tokenHash], type: Hash)
}
model Team {
teamId String @id @default(cuid(2))
teamName String
teamOrgId String
teamOrg Org @relation(fields: [teamOrgId], references: [orgId], onDelete: Cascade, onUpdate: Cascade)
teamUsers UserTeams[]
teamProjects ProjectTeamAccess[]
}
model UserTeams {
userId String
teamId String
linkedUser User @relation(fields: [userId], references: [userId], onDelete: Cascade, onUpdate: Cascade)
linkedTeam Team @relation(fields: [teamId], references: [teamId], onDelete: Cascade, onUpdate: Cascade)
@@id([userId, teamId])
}
enum ProjectType {
typescript
}
enum ProjectSourceType {
GitHub
}
model Project {
projectId String @id @default(cuid(2))
// The project identifier on the VCS Platform (e.g GitHub: repo id)
projectIdentifier String
projectBranch String
projectEntryPoint String
projectName String
projectOrgId String
projectType ProjectType
projectSourceType ProjectSourceType
projectTeams ProjectTeamAccess[]
projectUsers ProjectUserAccess[]
projectOrg Org @relation(fields: [projectOrgId], references: [orgId], onDelete: Cascade, onUpdate: Cascade)
projectWorkflows Workflow[]
}
enum AccessLevel {
Admin // Manage project settings
Write // Read + Write, trigger workflows
Read // Read-only, cannot trigger workflows
}
model ProjectTeamAccess {
projectId String
teamId String
accessLevel AccessLevel
linkedProject Project @relation(fields: [projectId], references: [projectId], onDelete: Cascade, onUpdate: Cascade)
linkedTeam Team @relation(fields: [teamId], references: [teamId], onDelete: Cascade, onUpdate: Cascade)
@@id([projectId, teamId])
}
model ProjectUserAccess {
projectId String
userId String
accessLevel AccessLevel
linkedProject Project @relation(fields: [projectId], references: [projectId], onDelete: Cascade, onUpdate: Cascade)
linkedUser User @relation(fields: [userId], references: [userId], onDelete: Cascade, onUpdate: Cascade)
@@id([projectId, userId])
}
enum WorkflowStatus {
Queued
CloneStarted
CloneFailed
CloneCompleted
DepGraphStarted
DepGraphFailed
DepGraphCompleted
GraphUploadStarted
GraphUploadFailed
GraphUploadCompleted
WorkflowCompleted
// Once a workflow is completed, archive it.
Archived
}
model Workflow {
workflowId String @id @default(cuid(2))
workflowStartTimestamp DateTime
workflowEndTimestamp DateTime?
workflowStatus WorkflowStatus
workflowProjectId String
workflowOrgId String
workflowMetadata Json
workflowProject Project @relation(fields: [workflowProjectId], references: [projectId], onDelete: Cascade, onUpdate: Cascade)
workflowOrg Org @relation(fields: [workflowOrgId], references: [orgId], onDelete: Cascade, onUpdate: Cascade)
workflowMessages WorkflowMessage[]
}
enum WorkflowMessageSender {
User
QueryAgent
AnswerAgent
}
model WorkflowMessage {
messageId String @id @default(cuid(2))
messageGroupId String
messageContent String
messageTimestamp DateTime
messageSender WorkflowMessageSender
messageIndex Int @default(autoincrement())
messageUserId String
messageWorkflowId String
messageUser User @relation(fields: [messageUserId], references: [userId], onDelete: Cascade, onUpdate: Cascade)
messageWorkflow Workflow @relation(fields: [messageWorkflowId], references: [workflowId], onDelete: Cascade, onUpdate: Cascade)
}
enum S3RequestMethod {
GET
PUT
DELETE
}
enum S3RequestStatus {
Pending
Success
Error
}
model S3Request {
requestId String @id @default(cuid(2))
requestObjectKey String
requestStatus S3RequestStatus
requestCreationTimestamp DateTime
requestExpiryTimestamp DateTime
requestMethod S3RequestMethod
requestObjectSize Int?
requestObjectContentType String?
requestObjectFileName String?
requestUserId String?
requestUser User? @relation(fields: [requestUserId], references: [userId], onDelete: Cascade)
}
model S3Object {
objectKey String @id
objectFileName String
objectSizeBytes Int
objectContentType String
}
// Events and analytics
enum EventType {
OrgCreate
OrgUpdate
UserCreate
UserUpdate
UserDelete
AuthVerify
AuthLogin
ProjectCreate
ProjectUpdate
ProjectDelete
ProjectTeamUpdate
ProjectUserUpdate
TeamCreate
TeamUpdate
TeamDelete
TeamUserAdd
TeamUserDelete
SessionStart
SessionClose
S3RequestCreate
S3ObjectCreate
S3ObjectDelete
S3RequestCallback
VerificationMailSend
}
model EventLog {
eventId String @id @default(cuid(2))
eventTimestamp DateTime
eventType EventType
userId String?
sessionId String?
orgId String?
eventAuth User? @relation(fields: [userId], references: [userId], onDelete: Cascade)
eventSession Session? @relation(fields: [sessionId], references: [sessionId], onDelete: Cascade)
eventOrg Org? @relation(fields: [orgId], references: [orgId], onDelete: Cascade, onUpdate: Cascade)
// Postgres supports json
eventMetadata Json
@@index([userId])
}