1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17generator client {
18 provider = "prisma-client-js"
19
20
21
22
23
24}
25
26datasource db {
27 provider = "postgresql"
28 url = env("DATABASE_URL")
29}
30
31
32
33enum WorkspaceRole {
34 OWNER
35 ADMIN
36 MEMBER
37 GUEST
38}
39
40enum PermissionLevel {
41 NONE
42 VIEW
43 COMMENT
44 EDIT
45 FULL_ACCESS
46}
47
48enum ShareScope {
49 PRIVATE
50 WORKSPACE
51 TEAM
52 USERS
53 PUBLIC
54}
55
56enum BlockType {
57 PARAGRAPH
58 HEADING_1
59 HEADING_2
60 HEADING_3
61 QUOTE
62 CALLOUT
63 BULLETED_LIST
64 NUMBERED_LIST
65 TODO
66 TOGGLE
67 IMAGE
68 VIDEO
69 AUDIO
70 FILE
71 BOOKMARK
72 EMBED
73 CODE
74 EQUATION
75 COLUMN
76 COLUMN_LIST
77 DIVIDER
78 SPACER
79 DATABASE
80 LINKED_DATABASE
81 TABLE
82 CHART
83 FORM
84 SYNCED_BLOCK
85 CHILD_PAGE
86 CHILD_DATABASE
87
88 TOC
89}
90
91enum PropertyType {
92 TITLE
93 TEXT
94 RICH_TEXT
95 NUMBER
96 SELECT
97 MULTI_SELECT
98 STATUS
99 DATE
100 DATE_RANGE
101 PERSON
102 EMAIL
103 PHONE
104 URL
105 CHECKBOX
106 FILES
107 CREATED_TIME
108 CREATED_BY
109 LAST_EDITED_TIME
110 LAST_EDITED_BY
111 RELATION
112 ROLLUP
113 FORMULA
114 BUTTON
115 UNIQUE_ID
116}
117
118enum ViewType {
119 TABLE
120 LIST
121 BOARD
122 GALLERY
123 CALENDAR
124 TIMELINE
125 CHART
126 DASHBOARD
127 FORM
128}
129
130enum RelationCardinality {
131 ONE_TO_ONE
132 ONE_TO_MANY
133 MANY_TO_MANY
134}
135
136enum RollupAggregate {
137 COUNT
138 SUM
139 AVERAGE
140 MIN
141 MAX
142 PERCENT
143 UNIQUE
144}
145
146enum AutomationTriggerType {
147 RECORD_CREATED
148 RECORD_UPDATED
149 PROPERTY_CHANGED
150 PAGE_CREATED
151 FORM_SUBMITTED
152 SCHEDULE
153 WEBHOOK
154 MANUAL
155}
156
157enum AutomationActionType {
158 UPDATE_RECORD
159 CREATE_PAGE
160 SEND_EMAIL
161 SEND_WEBHOOK
162 CREATE_NOTIFICATION
163 ASSIGN_USER
164 CHANGE_STATUS
165 CALL_INTEGRATION
166 RUN_AI_ACTION
167}
168
169enum AutomationStatus {
170 DRAFT
171 ACTIVE
172 PAUSED
173 ARCHIVED
174}
175
176enum AutomationRunStatus {
177 PENDING
178 RUNNING
179 SUCCEEDED
180 FAILED
181 DEAD_LETTER
182}
183
184enum NotificationChannel {
185 IN_APP
186 EMAIL
187 WEBHOOK
188}
189
190enum NotificationType {
191 MENTION
192 FORM_SUBMITTED
193 COMMENT
194 ASSIGNMENT
195 PAGE_SHARED
196 TASK_ASSIGNED
197 DATABASE_CHANGE
198 AUTOMATION
199 INTEGRATION
200
201 REVIEW_REQUESTED
202 APPROVAL_DECISION
203 WATCH_UPDATE
204 TASK_DUE
205}
206
207enum FileStatus {
208 UPLOADING
209 SCANNING
210 READY
211 VIRUS_DETECTED
212 FAILED
213}
214
215enum FormQuestionType {
216 SHORT_TEXT
217 LONG_TEXT
218 NUMBER
219 EMAIL
220 DATE
221 CHECKBOX
222 SINGLE_SELECT
223 MULTI_SELECT
224 RATING
225 FILE
226}
227
228enum FormStatus {
229 DRAFT
230 PUBLISHED
231 CLOSED
232}
233
234enum AuditActorType {
235 USER
236 API_KEY
237 SYSTEM
238 INTEGRATION
239}
240
241enum ApiKeyScope {
242 READ
243 WRITE
244 ADMIN
245}
246
247enum WebhookDeliveryStatus {
248 PENDING
249 DELIVERED
250 FAILED
251 REJECTED
252
253
254
255 DEAD_LETTER
256}
257
258enum UserStatus {
259 ACTIVE
260 INVITED
261 SUSPENDED
262}
263
264enum InvitationStatus {
265 PENDING
266 ACCEPTED
267 DECLINED
268 REVOKED
269 EXPIRED
270}
271
272enum SessionStatus {
273 ACTIVE
274 REVOKED
275 EXPIRED
276}
277
278enum EmailVerificationStatus {
279 UNVERIFIED
280 PENDING
281 VERIFIED
282}
283
284enum PasswordResetStatus {
285 PENDING
286 USED
287 EXPIRED
288 REVOKED
289}
290
291enum SSOProviderType {
292 SAML
293 OIDC
294}
295
296enum RetentionPolicyType {
297 PURGE
298 HOLD
299}
300
301
302
303model User {
304 id String @id @default(cuid())
305 email String @unique
306 emailVerifiedAt DateTime?
307 emailVerification EmailVerificationStatus @default(UNVERIFIED)
308 passwordHash String?
309 name String
310 displayName String?
311 avatarUrl String?
312 status UserStatus @default(ACTIVE)
313 locale String @default("en-US")
314 timezone String @default("UTC")
315 theme String @default("system")
316
317
318
319
320
321 notificationPrefs Json @default("{}")
322
323
324
325 twoFactorSecret String?
326 lastLoginAt DateTime?
327 createdAt DateTime @default(now())
328 updatedAt DateTime @updatedAt
329
330 memberships WorkspaceMember[]
331 ownedWorkspaces Workspace[] @relation("WorkspaceOwner")
332 ownedOrganizations Organization[] @relation("OrgOwner")
333 orgMemberships OrganizationMember[]
334
335 pageWatches PageWatch[]
336 recentItems UserRecentItem[]
337 savedSearches SavedSearch[]
338 comments Comment[]
339 commentReplies CommentReply[]
340 notifications Notification[]
341 favorites PageFavorite[]
342 pageVersions PageVersion[]
343 blockVersions BlockVersion[]
344 fileVersions FileVersion[]
345 sessions Session[]
346 refreshTokens RefreshToken[]
347 passwordResets PasswordReset[]
348 apiKeys ApiKey[]
349 automations Automation[] @relation("AutomationCreator")
350 aiConversations AiConversation[]
351 mentionNotifications MentionNotification[]
352
353 @@map("users")
354}
355
356model RefreshToken {
357 id String @id @default(cuid())
358 tokenHash String @unique
359 userId String
360 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
361 sessionAgent String?
362 createdAt DateTime @default(now())
363 expiresAt DateTime
364 revokedAt DateTime?
365 replacedBy String?
366
367 @@map("refresh_tokens")
368}
369
370model Session {
371 id String @id @default(cuid())
372 userId String
373 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
374 tokenHash String @unique
375 userAgent String?
376 ipAddress String?
377 status SessionStatus @default(ACTIVE)
378 createdAt DateTime @default(now())
379 expiresAt DateTime
380 revokedAt DateTime?
381
382 @@index([userId, status])
383 @@map("sessions")
384}
385
386model EmailVerification {
387 id String @id @default(cuid())
388 userId String
389 tokenHash String @unique
390 expiresAt DateTime
391 createdAt DateTime @default(now())
392
393 @@index([userId])
394 @@map("email_verifications")
395}
396
397model PasswordReset {
398 id String @id @default(cuid())
399 userId String
400 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
401 tokenHash String @unique
402 status PasswordResetStatus @default(PENDING)
403 expiresAt DateTime
404 usedAt DateTime?
405 createdAt DateTime @default(now())
406
407 @@index([userId])
408 @@map("password_resets")
409}
410
411model Organization {
412 id String @id @default(cuid())
413 name String
414 slug String @unique
415 logoUrl String?
416 ownerId String
417 owner User @relation("OrgOwner", fields: [ownerId], references: [id])
418 policy Json @default("{}")
419 ssoConfig Json?
420 scimConfig Json?
421 createdAt DateTime @default(now())
422 updatedAt DateTime @updatedAt
423
424 members OrganizationMember[]
425 workspaces Workspace[]
426 ssoProvider SsoProvider?
427 retentionPolicies RetentionPolicy[]
428 auditExports AuditExport[]
429
430 @@map("organizations")
431}
432
433
434
435
436
437
438
439model AuditExport {
440 id String @id
441 organizationId String
442 organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
443 status String @default("processing")
444 totalRows Int
445 capRows Int
446 rows Int @default(0)
447 truncated Boolean @default(false)
448 filters Json @default("{}")
449 error String?
450 downloadUrlAt DateTime?
451 downloadUsed Boolean @default(false)
452 createdAt DateTime @default(now())
453 updatedAt DateTime @updatedAt
454 completedAt DateTime?
455
456 @@index([organizationId, status])
457 @@index([organizationId, createdAt])
458 @@map("audit_exports")
459}
460
461model OrganizationMember {
462 id String @id @default(cuid())
463 organizationId String
464 userId String
465 role WorkspaceRole @default(MEMBER)
466 createdAt DateTime @default(now())
467
468 organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
469 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
470
471 @@unique([organizationId, userId])
472 @@map("organization_members")
473}
474
475model SsoProvider {
476 id String @id @default(cuid())
477 organizationId String @unique
478 type SSOProviderType
479 name String
480 config Json
481 enforce Boolean @default(false)
482 createdAt DateTime @default(now())
483 updatedAt DateTime @updatedAt
484
485 organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
486 identityLinks SsoIdentity[]
487
488 @@map("sso_providers")
489}
490
491model SsoIdentity {
492 id String @id @default(cuid())
493 providerId String
494 externalId String
495 userId String
496 createdAt DateTime @default(now())
497
498 provider SsoProvider @relation(fields: [providerId], references: [id], onDelete: Cascade)
499
500 @@unique([providerId, externalId])
501 @@map("sso_identities")
502}
503
504model RetentionPolicy {
505 id String @id @default(cuid())
506 organizationId String
507 type RetentionPolicyType
508 scope String
509 retainDays Int?
510 config Json @default("{}")
511 createdAt DateTime @default(now())
512 updatedAt DateTime @updatedAt
513
514 organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
515
516
517 @@unique([organizationId, scope])
518 @@map("retention_policies")
519}
520
521model Workspace {
522 id String @id @default(cuid())
523 organizationId String?
524 name String
525 slug String @unique
526 iconUrl String?
527 logoUrl String?
528 description String?
529 publicUrl String?
530
531
532
533
534
535
536 settings Json @default("{}")
537
538
539
540 type String @default("team")
541
542
543
544 archivedAt DateTime?
545 isPersonal Boolean @default(false)
546 ownerId String?
547 owner User? @relation("WorkspaceOwner", fields: [ownerId], references: [id], onDelete: SetNull)
548 billingPlan String @default("free")
549
550
551
552
553 usageLimits Json @default("{}")
554
555
556
557
558
559 usageStorageBytes BigInt @default(0)
560 createdAt DateTime @default(now())
561 updatedAt DateTime @updatedAt
562 deletedAt DateTime?
563
564 organization Organization? @relation(fields: [organizationId], references: [id], onDelete: SetNull)
565 members WorkspaceMember[]
566 invitations Invitation[]
567 teams Team[]
568 pages Page[]
569 databases Database[]
570 files File[]
571 automations Automation[]
572 integrations Integration[]
573 webhooks Webhook[]
574 apiKeys ApiKey[]
575 shares Share[]
576 templates Template[]
577 notifications Notification[]
578 auditLogs AuditLog[]
579 searchDocuments SearchDocument[]
580 aiConversations AiConversation[]
581 formSubmissions FormSubmission[]
582 dashboards Dashboard[]
583 comments Comment[]
584
585 @@index([organizationId])
586 @@map("workspaces")
587}
588
589model WorkspaceMember {
590 id String @id @default(cuid())
591 workspaceId String
592 userId String
593 role WorkspaceRole @default(MEMBER)
594 invitedBy String?
595 joinedAt DateTime?
596 createdAt DateTime @default(now())
597 updatedAt DateTime @updatedAt
598
599 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
600 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
601 teamMemberships TeamMember[]
602
603 @@unique([workspaceId, userId])
604 @@index([userId])
605 @@map("workspace_members")
606}
607
608model Invitation {
609 id String @id @default(cuid())
610 workspaceId String
611 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
612 email String
613 role WorkspaceRole @default(MEMBER)
614 invitedById String
615 tokenHash String @unique
616 status InvitationStatus @default(PENDING)
617 expiresAt DateTime
618 acceptedAt DateTime?
619 revokedAt DateTime?
620 createdAt DateTime @default(now())
621 updatedAt DateTime @updatedAt
622
623 @@unique([workspaceId, email, role])
624 @@index([workspaceId, status])
625 @@map("invitations")
626}
627
628model Team {
629 id String @id @default(cuid())
630 workspaceId String
631 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
632 name String
633 slug String
634 description String?
635 color String?
636 iconUrl String?
637 position String @default("a0")
638 isPrivate Boolean @default(false)
639 createdAt DateTime @default(now())
640 updatedAt DateTime @updatedAt
641
642 members TeamMember[]
643 pages Page[]
644 comments Comment[]
645 shares Share[]
646
647 @@unique([workspaceId, slug])
648 @@map("teams")
649}
650
651model TeamMember {
652 id String @id @default(cuid())
653 teamId String
654 workspaceMemberId String
655 userId String
656 role WorkspaceRole @default(MEMBER)
657 createdAt DateTime @default(now())
658
659 team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
660 workspaceMember WorkspaceMember @relation(fields: [workspaceMemberId], references: [id], onDelete: Cascade)
661
662 @@unique([teamId, userId])
663 @@map("team_members")
664}
665
666
667
668model Page {
669 id String @id @default(cuid())
670 workspaceId String
671 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
672 teamId String?
673 team Team? @relation(fields: [teamId], references: [id], onDelete: SetNull)
674 parentId String?
675 parent Page? @relation("PageTree", fields: [parentId], references: [id], onDelete: SetNull)
676 children Page[] @relation("PageTree")
677 grandparentId String?
678 position String @default("a0")
679 title String @default("")
680 icon String?
681 coverUrl String?
682 description String?
683
684
685
686
687
688 kind String @default("page")
689
690
691
692
693 reviewState String @default("published")
694 isPrivate Boolean @default(false)
695 isFavorite Boolean @default(false)
696 archivedAt DateTime?
697 deletedAt DateTime?
698 trashedAt DateTime?
699 restoredAt DateTime?
700 createdBy String?
701 updatedBy String?
702 version Int @default(1)
703 createdAt DateTime @default(now())
704 updatedAt DateTime @updatedAt
705
706 blocks Block[]
707 favorites PageFavorite[]
708 versions PageVersion[]
709 comments Comment[]
710 shares Share[]
711 record DatabaseRecord?
712 auditLogs AuditLog[]
713 reviews Review[]
714 watch PageWatch[]
715 whiteboard Whiteboard?
716 task Task?
717
718 @@index([workspaceId, parentId, position])
719 @@index([workspaceId, deletedAt])
720 @@index([teamId])
721 @@map("pages")
722}
723
724model PageFavorite {
725 id String @id @default(cuid())
726 workspaceId String
727 userId String
728 pageId String
729 position String @default("a0")
730 createdAt DateTime @default(now())
731
732 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
733 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
734
735 @@unique([workspaceId, userId, pageId])
736 @@map("page_favorites")
737}
738
739model PageVersion {
740 id String @id @default(cuid())
741 pageId String
742 version Int
743 snapshot Json
744 createdBy String?
745 note String?
746 createdAt DateTime @default(now())
747
748 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
749 user User? @relation(fields: [createdBy], references: [id], onDelete: SetNull)
750
751 @@unique([pageId, version])
752 @@map("page_versions")
753}
754
755model Block {
756 id String @id @default(cuid())
757 pageId String
758 workspaceId String
759 parentId String?
760 type BlockType
761 position String @default("a0")
762 content Json @default("{}")
763 properties Json @default("{}")
764 isSynced Boolean @default(false)
765 syncedSourceId String?
766 createdBy String?
767 updatedBy String?
768 deletedAt DateTime?
769 version Int @default(1)
770 createdAt DateTime @default(now())
771 updatedAt DateTime @updatedAt
772
773 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
774 versions BlockVersion[]
775 comments Comment[]
776 files File[]
777
778 @@index([pageId, parentId, position])
779 @@index([pageId, position])
780 @@index([workspaceId, pageId])
781 @@map("blocks")
782}
783
784model BlockVersion {
785 id String @id @default(cuid())
786 blockId String
787 version Int
788 content Json
789 properties Json
790 createdBy String?
791 createdAt DateTime @default(now())
792
793 block Block @relation(fields: [blockId], references: [id], onDelete: Cascade)
794 user User? @relation(fields: [createdBy], references: [id], onDelete: SetNull)
795
796 @@unique([blockId, version])
797 @@map("block_versions")
798}
799
800
801
802model Database {
803 id String @id @default(cuid())
804 workspaceId String
805 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
806 pageId String?
807 title String @default("")
808 icon String?
809 description String?
810 schemaVersion Int @default(1)
811 isArchived Boolean @default(false)
812 createdBy String?
813 createdAt DateTime @default(now())
814 updatedAt DateTime @updatedAt
815
816 properties DatabaseProperty[]
817 views DatabaseView[]
818 records DatabaseRecord[]
819 relations Relation[]
820 relationLinks RelationLink[]
821 rollups Rollup[]
822 formulas Formula[]
823 buttons DatabaseButton[]
824 forms Form[]
825 charts Chart[]
826
827 @@index([workspaceId])
828 @@map("databases")
829}
830
831model DatabaseProperty {
832 id String @id @default(cuid())
833 databaseId String
834 name String
835 type PropertyType
836 position String @default("a0")
837 isTitle Boolean @default(false)
838 isVisible Boolean @default(true)
839 required Boolean @default(false)
840 config Json @default("{}")
841 default Json?
842 deletedAt DateTime?
843 createdAt DateTime @default(now())
844 updatedAt DateTime @updatedAt
845
846 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
847 values RecordProperty[]
848
849 @@unique([databaseId, name])
850 @@index([databaseId, position])
851 @@map("database_properties")
852}
853
854model DatabaseView {
855 id String @id @default(cuid())
856 databaseId String
857 name String
858 type ViewType
859 position String @default("a0")
860 config Json @default("{}")
861 filter Json?
862 sort Json?
863 group Json?
864 pageSize Int?
865 createdAt DateTime @default(now())
866 updatedAt DateTime @updatedAt
867
868 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
869
870 @@index([databaseId, position])
871 @@map("database_views")
872}
873
874model DatabaseRecord {
875 id String @id @default(cuid())
876 workspaceId String
877 databaseId String
878 pageId String? @unique
879 coverUrl String?
880 icon String?
881 archivedAt DateTime?
882 isSubItem Boolean @default(false)
883 position String @default("a0")
884 version Int @default(1)
885 createdBy String?
886 createdTime DateTime @default(now())
887 lastEditedBy String?
888 lastEditedTime DateTime @default(now())
889 createdAt DateTime @default(now())
890 updatedAt DateTime @updatedAt
891
892 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
893 page Page? @relation(fields: [pageId], references: [id], onDelete: SetNull)
894 properties RecordProperty[]
895 relationLinks RelationLink[]
896 formSubmissions FormSubmission[]
897
898 @@index([workspaceId, databaseId, position])
899 @@index([databaseId, archivedAt])
900 @@index([databaseId, position])
901 @@map("database_records")
902}
903
904model RecordProperty {
905 id String @id @default(cuid())
906 recordId String
907 propertyId String
908 value Json?
909 createdAt DateTime @default(now())
910 updatedAt DateTime @updatedAt
911
912 record DatabaseRecord @relation(fields: [recordId], references: [id], onDelete: Cascade)
913 property DatabaseProperty @relation(fields: [propertyId], references: [id], onDelete: Cascade)
914
915 @@unique([recordId, propertyId])
916 @@map("record_properties")
917}
918
919
920
921model Relation {
922 id String @id @default(cuid())
923 databaseId String
924 targetDatabaseId String
925 propertyId String?
926 reversePropertyId String?
927 name String
928 targetName String?
929 cardinality RelationCardinality @default(MANY_TO_MANY)
930 bidirectional Boolean @default(true)
931 createdAt DateTime @default(now())
932 updatedAt DateTime @updatedAt
933
934 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
935
936 @@index([databaseId])
937 @@index([targetDatabaseId])
938 @@map("relations")
939}
940
941model RelationLink {
942 id String @id @default(cuid())
943 databaseId String
944 recordId String
945 targetRecordId String
946 targetDatabaseId String
947 createdAt DateTime @default(now())
948
949 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
950 record DatabaseRecord @relation(fields: [recordId], references: [id], onDelete: Cascade)
951
952 @@unique([databaseId, recordId, targetDatabaseId, targetRecordId])
953 @@index([targetDatabaseId, targetRecordId])
954 @@map("relation_links")
955}
956
957model Rollup {
958 id String @id @default(cuid())
959 databaseId String
960 propertyId String?
961 relationId String
962 targetPropertyId String
963 aggregate RollupAggregate
964 filter Json?
965 createdAt DateTime @default(now())
966 updatedAt DateTime @updatedAt
967
968 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
969
970 @@index([databaseId])
971 @@map("rollups")
972}
973
974model Formula {
975 id String @id @default(cuid())
976 databaseId String
977 propertyId String?
978 expression String
979 ast Json
980 returnType String
981 dependencies String[]
982 createdAt DateTime @default(now())
983 updatedAt DateTime @updatedAt
984
985 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
986
987 @@index([databaseId])
988 @@map("formulas")
989}
990
991model DatabaseButton {
992 id String @id @default(cuid())
993 databaseId String
994 propertyId String?
995 name String
996 icon String?
997 color String?
998 actions Json
999 createdAt DateTime @default(now())
1000 updatedAt DateTime @updatedAt
1001
1002 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
1003
1004 @@index([databaseId])
1005 @@map("database_buttons")
1006}
1007
1008
1009
1010model Chart {
1011 id String @id @default(cuid())
1012 workspaceId String
1013 databaseId String
1014 name String
1015 chartType String
1016 config Json
1017 filter Json?
1018 position String @default("a0")
1019 createdAt DateTime @default(now())
1020 updatedAt DateTime @updatedAt
1021
1022 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
1023
1024 @@index([workspaceId, databaseId])
1025 @@map("charts")
1026}
1027
1028model Dashboard {
1029 id String @id @default(cuid())
1030 workspaceId String
1031 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1032 name String
1033 icon String?
1034 layout Json @default("{}")
1035 isPublic Boolean @default(false)
1036 createdAt DateTime @default(now())
1037 updatedAt DateTime @updatedAt
1038
1039 widgets DashboardWidget[]
1040
1041 @@index([workspaceId])
1042 @@map("dashboards")
1043}
1044
1045model DashboardWidget {
1046 id String @id @default(cuid())
1047 dashboardId String
1048 widgetType String
1049 sourceRef Json?
1050 position String @default("a0")
1051 layout Json @default("{}")
1052 filter Json?
1053 createdAt DateTime @default(now())
1054 updatedAt DateTime @updatedAt
1055
1056 dashboard Dashboard @relation(fields: [dashboardId], references: [id], onDelete: Cascade)
1057
1058 @@index([dashboardId, position])
1059 @@map("dashboard_widgets")
1060}
1061
1062
1063
1064model Comment {
1065 id String @id @default(cuid())
1066 workspaceId String
1067 teamId String?
1068 pageId String?
1069 blockId String?
1070 recordId String?
1071 selection Json?
1072 body String
1073 mentionIds String[] @default([])
1074 pageMentionIds String[] @default([])
1075 resolvedAt DateTime?
1076 resolvedBy String?
1077 status String @default("open")
1078 createdBy String
1079 createdAt DateTime @default(now())
1080 updatedAt DateTime @updatedAt
1081
1082 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1083 team Team? @relation(fields: [teamId], references: [id], onDelete: SetNull)
1084 page Page? @relation(fields: [pageId], references: [id], onDelete: Cascade)
1085 block Block? @relation(fields: [blockId], references: [id], onDelete: Cascade)
1086 author User @relation(fields: [createdBy], references: [id], onDelete: Cascade)
1087 replies CommentReply[]
1088 reactions CommentReaction[]
1089
1090 @@index([workspaceId, pageId])
1091 @@index([workspaceId, blockId])
1092 @@index([workspaceId, recordId])
1093 @@map("comments")
1094}
1095
1096model CommentReply {
1097 id String @id @default(cuid())
1098 commentId String
1099 body String
1100 mentionIds String[] @default([])
1101 createdBy String
1102 createdAt DateTime @default(now())
1103 updatedAt DateTime @updatedAt
1104
1105 comment Comment @relation(fields: [commentId], references: [id], onDelete: Cascade)
1106 author User @relation(fields: [createdBy], references: [id], onDelete: Cascade)
1107 reactions CommentReaction[]
1108
1109 @@index([commentId])
1110 @@map("comment_replies")
1111}
1112
1113model CommentReaction {
1114 id String @id @default(cuid())
1115 emoji String
1116 userId String
1117 commentId String?
1118 replyId String?
1119 createdAt DateTime @default(now())
1120
1121 comment Comment? @relation(fields: [commentId], references: [id], onDelete: Cascade)
1122 reply CommentReply? @relation(fields: [replyId], references: [id], onDelete: Cascade)
1123
1124 @@unique([commentId, replyId, userId, emoji])
1125 @@map("comment_reactions")
1126}
1127
1128model Notification {
1129 id String @id @default(cuid())
1130 workspaceId String
1131 userId String
1132 type NotificationType
1133 channel NotificationChannel @default(IN_APP)
1134 title String
1135 body String?
1136 link Json?
1137 readAt DateTime?
1138
1139
1140
1141 actorId String?
1142
1143
1144
1145
1146
1147 emailSentAt DateTime?
1148 createdAt DateTime @default(now())
1149
1150 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1151 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1152
1153 @@index([userId, readAt])
1154 @@index([workspaceId, userId])
1155 @@map("notifications")
1156}
1157
1158model MentionNotification {
1159 id String @id @default(cuid())
1160 userId String
1161 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1162 mentionerId String
1163 targetType String
1164 targetId String
1165 context Json?
1166 readAt DateTime?
1167 createdAt DateTime @default(now())
1168
1169 @@index([userId, readAt])
1170 @@map("mention_notifications")
1171}
1172
1173
1174
1175model File {
1176 id String @id @default(cuid())
1177 workspaceId String
1178 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1179 blockId String?
1180 pageId String?
1181 name String
1182 key String @unique
1183 url String?
1184 size Int
1185 mimeType String
1186 status FileStatus @default(UPLOADING)
1187 metadata Json @default("{}")
1188 thumbnailKey String?
1189 thumbnailUrl String?
1190 scanReport Json?
1191 uploadedBy String
1192 permissions Json?
1193 deletedAt DateTime?
1194 createdAt DateTime @default(now())
1195 updatedAt DateTime @updatedAt
1196
1197 block Block? @relation(fields: [blockId], references: [id], onDelete: SetNull)
1198 versions FileVersion[]
1199
1200 @@index([workspaceId, deletedAt])
1201 @@index([blockId])
1202
1203 @@index([workspaceId, createdAt(sort: Desc)])
1204 @@map("files")
1205}
1206
1207model FileVersion {
1208 id String @id @default(cuid())
1209 fileId String
1210 version Int
1211 key String
1212 size Int
1213 createdBy String?
1214 createdAt DateTime @default(now())
1215
1216 file File @relation(fields: [fileId], references: [id], onDelete: Cascade)
1217 user User? @relation(fields: [createdBy], references: [id], onDelete: SetNull)
1218
1219 @@unique([fileId, version])
1220 @@map("file_versions")
1221}
1222
1223
1224
1225model Permission {
1226 id String @id @default(cuid())
1227 workspaceId String
1228 granteeType String
1229 granteeId String
1230 resourceType String
1231 resourceId String
1232 level PermissionLevel
1233 inheritsFrom String?
1234 createdAt DateTime @default(now())
1235 updatedAt DateTime @updatedAt
1236
1237 @@unique([workspaceId, granteeType, granteeId, resourceType, resourceId])
1238 @@index([workspaceId, granteeId])
1239 @@index([resourceType, resourceId])
1240 @@map("permissions")
1241}
1242
1243model Share {
1244 id String @id @default(cuid())
1245 workspaceId String
1246 pageId String?
1247 teamId String?
1248 recordId String?
1249 token String @unique
1250 scope ShareScope @default(PRIVATE)
1251 allowComments Boolean @default(true)
1252 allowDuplicate Boolean @default(false)
1253 allowSearchIndexing Boolean @default(false)
1254 passwordHash String?
1255 expiresAt DateTime?
1256 createdBy String
1257 createdAt DateTime @default(now())
1258 updatedAt DateTime @updatedAt
1259
1260 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1261 page Page? @relation(fields: [pageId], references: [id], onDelete: Cascade)
1262 team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
1263
1264 @@index([workspaceId, pageId])
1265 @@index([token])
1266 @@map("shares")
1267}
1268
1269
1270
1271model Template {
1272 id String @id @default(cuid())
1273 workspaceId String
1274 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1275 name String
1276 icon String?
1277 type String
1278 sourceRef Json?
1279 sourceDatabaseId String?
1280 snapshot Json
1281 isBuiltin Boolean @default(false)
1282
1283
1284
1285
1286
1287 category String?
1288 description String?
1289 variables Json?
1290 defaultFor String?
1291 createdBy String?
1292 createdAt DateTime @default(now())
1293 updatedAt DateTime @updatedAt
1294
1295 versions TemplateVersion[]
1296
1297 @@index([workspaceId, type])
1298 @@map("templates")
1299}
1300
1301model TemplateVersion {
1302 id String @id @default(cuid())
1303 templateId String
1304 version Int
1305 snapshot Json
1306 name String?
1307 description String?
1308 variables Json?
1309 note String?
1310 createdBy String?
1311 createdAt DateTime @default(now())
1312
1313 template Template @relation(fields: [templateId], references: [id], onDelete: Cascade)
1314
1315 @@unique([templateId, version])
1316 @@map("template_versions")
1317}
1318
1319
1320
1321model Automation {
1322 id String @id @default(cuid())
1323 workspaceId String
1324 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1325 name String
1326 description String?
1327 status AutomationStatus @default(DRAFT)
1328 databaseId String?
1329 createdById String
1330 createdBy User @relation("AutomationCreator", fields: [createdById], references: [id])
1331 createdAt DateTime @default(now())
1332 updatedAt DateTime @updatedAt
1333
1334 triggers AutomationTrigger[]
1335 conditions AutomationCondition[]
1336 actions AutomationAction[]
1337 runs AutomationRun[]
1338
1339 @@index([workspaceId, status])
1340 @@map("automations")
1341}
1342
1343model AutomationTrigger {
1344 id String @id @default(cuid())
1345 automationId String
1346 type AutomationTriggerType
1347 config Json
1348 position Int @default(0)
1349
1350 automation Automation @relation(fields: [automationId], references: [id], onDelete: Cascade)
1351
1352 @@index([automationId])
1353 @@map("automation_triggers")
1354}
1355
1356model AutomationCondition {
1357 id String @id @default(cuid())
1358 automationId String
1359 expression Json
1360 position Int @default(0)
1361
1362 automation Automation @relation(fields: [automationId], references: [id], onDelete: Cascade)
1363
1364 @@index([automationId])
1365 @@map("automation_conditions")
1366}
1367
1368model AutomationAction {
1369 id String @id @default(cuid())
1370 automationId String
1371 type AutomationActionType
1372 config Json
1373 position Int
1374 retries Int @default(3)
1375 timeoutMs Int @default(30000)
1376
1377 automation Automation @relation(fields: [automationId], references: [id], onDelete: Cascade)
1378 runs AutomationRun[]
1379
1380 @@index([automationId, position])
1381 @@map("automation_actions")
1382}
1383
1384model AutomationRun {
1385 id String @id @default(cuid())
1386 workspaceId String
1387 automationId String
1388 actionId String?
1389 status AutomationRunStatus @default(PENDING)
1390 triggerEvent Json?
1391 input Json?
1392 output Json?
1393 error Json?
1394 startedAt DateTime?
1395 finishedAt DateTime?
1396 retryCount Int @default(0)
1397 createdAt DateTime @default(now())
1398
1399 automation Automation @relation(fields: [automationId], references: [id], onDelete: Cascade)
1400 action AutomationAction? @relation(fields: [actionId], references: [id], onDelete: SetNull)
1401 logs AutomationLog[]
1402
1403 @@index([workspaceId, automationId, createdAt])
1404 @@index([status])
1405 @@map("automation_runs")
1406}
1407
1408model AutomationLog {
1409 id String @id @default(cuid())
1410 runId String
1411 level String
1412 message String
1413 data Json?
1414 createdAt DateTime @default(now())
1415
1416 run AutomationRun @relation(fields: [runId], references: [id], onDelete: Cascade)
1417
1418 @@index([runId])
1419 @@map("automation_logs")
1420}
1421
1422
1423
1424model Integration {
1425 id String @id @default(cuid())
1426 workspaceId String
1427 name String
1428 provider String
1429 config Json
1430 status String @default("active")
1431 createdById String
1432 createdAt DateTime @default(now())
1433 updatedAt DateTime @updatedAt
1434
1435 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1436
1437 @@index([workspaceId])
1438 @@map("integrations")
1439}
1440
1441model ApiKey {
1442 id String @id @default(cuid())
1443 workspaceId String
1444 name String
1445 keyHash String @unique
1446 prefix String
1447 scopes ApiKeyScope[]
1448 rateLimit Int?
1449 lastUsedAt DateTime?
1450 expiresAt DateTime?
1451 revokedAt DateTime?
1452 createdById String
1453 createdAt DateTime @default(now())
1454
1455 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1456 createdBy User @relation(fields: [createdById], references: [id], onDelete: Cascade)
1457
1458 @@index([workspaceId])
1459 @@map("api_keys")
1460}
1461
1462model Webhook {
1463 id String @id @default(cuid())
1464 workspaceId String
1465 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1466 url String
1467
1468
1469
1470
1471 secretHash String
1472
1473
1474
1475
1476 secretEncrypted Bytes?
1477 events String[]
1478 active Boolean @default(true)
1479 createdById String
1480 createdAt DateTime @default(now())
1481 updatedAt DateTime @updatedAt
1482
1483 deliveries WebhookDelivery[]
1484
1485 @@index([workspaceId])
1486 @@map("webhooks")
1487}
1488
1489model WebhookDelivery {
1490 id String @id @default(cuid())
1491 webhookId String
1492 event String
1493 payload Json
1494 status WebhookDeliveryStatus @default(PENDING)
1495 attempts Int @default(0)
1496 statusCode Int?
1497 error String?
1498 deliveredAt DateTime?
1499 nextRetryAt DateTime?
1500 createdAt DateTime @default(now())
1501
1502
1503 latencyMs Int?
1504
1505
1506
1507 originDeliveryId String?
1508
1509 webhook Webhook @relation(fields: [webhookId], references: [id], onDelete: Cascade)
1510
1511 @@index([webhookId, status])
1512 @@index([status, nextRetryAt])
1513
1514 @@index([webhookId, createdAt])
1515 @@map("webhook_deliveries")
1516}
1517
1518
1519
1520model AuditLog {
1521 id String @id @default(cuid())
1522 actorType AuditActorType
1523 actorId String
1524 workspaceId String?
1525 pageId String?
1526 resourceType String
1527 resourceId String
1528 action String
1529 ipAddress String?
1530 userAgent String?
1531 metadata Json @default("{}")
1532 createdAt DateTime @default(now())
1533
1534 workspace Workspace? @relation(fields: [workspaceId], references: [id], onDelete: SetNull)
1535 page Page? @relation(fields: [pageId], references: [id], onDelete: SetNull)
1536
1537 @@index([workspaceId, action, createdAt])
1538 @@index([resourceType, resourceId, createdAt])
1539 @@index([actorType, actorId, createdAt])
1540
1541 @@index([workspaceId, createdAt(sort: Desc)])
1542 @@map("audit_logs")
1543}
1544
1545
1546
1547model SearchDocument {
1548 id String @id @default(cuid())
1549 workspaceId String
1550 type String
1551 refId String
1552 title String
1553 body String?
1554 permissions Json
1555 metadata Json @default("{}")
1556 indexedAt DateTime @default(now())
1557
1558
1559 contentHash String?
1560
1561 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1562
1563 @@unique([type, refId])
1564 @@index([workspaceId, type])
1565 @@map("search_documents")
1566}
1567
1568
1569
1570model AiConversation {
1571 id String @id @default(cuid())
1572 workspaceId String
1573 userId String
1574 title String?
1575 context Json?
1576
1577
1578
1579 deletedAt DateTime?
1580 createdAt DateTime @default(now())
1581 updatedAt DateTime @updatedAt
1582
1583 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1584 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1585 messages AiMessage[]
1586
1587 @@index([workspaceId, userId])
1588 @@map("ai_conversations")
1589}
1590
1591model AiMessage {
1592 id String @id @default(cuid())
1593 conversationId String
1594 role String
1595 content String
1596 toolCalls Json?
1597 toolResults Json?
1598
1599
1600
1601 metadata Json?
1602 model String?
1603 tokensIn Int?
1604 tokensOut Int?
1605 latencyMs Int?
1606 createdAt DateTime @default(now())
1607
1608 conversation AiConversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
1609
1610
1611
1612
1613 @@index([conversationId])
1614 @@index([createdAt])
1615 @@index([conversationId, createdAt])
1616 @@map("ai_messages")
1617}
1618
1619model AiEmbedding {
1620 id String @id @default(cuid())
1621 workspaceId String
1622 chunkRef String
1623 chunkText String
1624 vectorId String
1625 model String
1626 dimension Int
1627 metadata Json @default("{}")
1628 createdAt DateTime @default(now())
1629
1630
1631
1632 @@unique([workspaceId, chunkRef])
1633 @@index([workspaceId])
1634 @@index([workspaceId, model])
1635 @@map("ai_embeddings")
1636}
1637
1638
1639
1640model Form {
1641 id String @id @default(cuid())
1642 workspaceId String
1643 databaseId String
1644 name String
1645 slug String @unique
1646 description String?
1647 status FormStatus @default(DRAFT)
1648 config Json @default("{}")
1649 createdById String
1650 createdAt DateTime @default(now())
1651 updatedAt DateTime @updatedAt
1652
1653 database Database @relation(fields: [databaseId], references: [id], onDelete: Cascade)
1654 questions FormQuestion[]
1655 submissions FormSubmission[]
1656
1657 @@index([workspaceId, databaseId])
1658 @@map("forms")
1659}
1660
1661model FormQuestion {
1662 id String @id @default(cuid())
1663 formId String
1664 label String
1665 description String?
1666 type FormQuestionType
1667 required Boolean @default(false)
1668 validation Json?
1669 propertyId String?
1670 placeholder String?
1671 position String @default("a0")
1672 createdAt DateTime @default(now())
1673 updatedAt DateTime @updatedAt
1674
1675 form Form @relation(fields: [formId], references: [id], onDelete: Cascade)
1676
1677 @@index([formId, position])
1678 @@map("form_questions")
1679}
1680
1681model FormSubmission {
1682 id String @id @default(cuid())
1683 workspaceId String
1684 formId String
1685 recordId String?
1686 answers Json
1687 submittedBy String?
1688 ipAddress String?
1689 createdAt DateTime @default(now())
1690
1691 workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
1692 form Form @relation(fields: [formId], references: [id], onDelete: Cascade)
1693 record DatabaseRecord? @relation(fields: [recordId], references: [id], onDelete: SetNull)
1694
1695 @@index([workspaceId, formId, createdAt])
1696 @@map("form_submissions")
1697}
1698
1699
1700
1701
1702
1703
1704model Whiteboard {
1705 id String @id @default(cuid())
1706 pageId String @unique
1707 canvas Json
1708 schemaVersion Int @default(1)
1709 updatedBy String?
1710 createdAt DateTime @default(now())
1711 updatedAt DateTime @updatedAt
1712
1713 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
1714
1715 @@map("whiteboards")
1716}
1717
1718model Review {
1719 id String @id @default(cuid())
1720 pageId String
1721 state String
1722 reviewerIds String[] @default([])
1723 requestedBy String
1724 comment String?
1725 deadline DateTime?
1726 decision String?
1727 decidedAt DateTime?
1728 decidedBy String?
1729 openedAt DateTime @default(now())
1730 closedAt DateTime?
1731
1732 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
1733
1734 @@index([pageId, state])
1735 @@index([reviewerIds])
1736 @@map("reviews")
1737}
1738
1739model Task {
1740 id String @id @default(cuid())
1741 workspaceId String
1742 pageId String @unique
1743 title String
1744 assigneeIds String[] @default([])
1745 createdBy String
1746 status String @default("todo")
1747 dueAt DateTime?
1748 createdAt DateTime @default(now())
1749 updatedAt DateTime @updatedAt
1750
1751 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
1752
1753 @@index([workspaceId, status])
1754 @@index([assigneeIds])
1755 @@index([workspaceId, dueAt])
1756 @@map("tasks")
1757}
1758
1759model PageWatch {
1760 id String @id @default(cuid())
1761 pageId String
1762 userId String
1763 createdAt DateTime @default(now())
1764
1765 page Page @relation(fields: [pageId], references: [id], onDelete: Cascade)
1766 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1767
1768 @@unique([pageId, userId])
1769 @@index([userId])
1770 @@map("page_watches")
1771}
1772
1773model UserRecentItem {
1774 id String @id @default(cuid())
1775 userId String
1776 itemType String
1777 refId String
1778 at DateTime @default(now())
1779
1780 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1781
1782 @@unique([userId, itemType, refId])
1783 @@index([userId, at])
1784 @@map("user_recent_items")
1785}
1786
1787model SavedSearch {
1788 id String @id @default(cuid())
1789 userId String
1790 workspaceId String?
1791 name String
1792 queryJson Json
1793 createdAt DateTime @default(now())
1794 updatedAt DateTime @updatedAt
1795
1796 user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1797
1798 @@index([userId])
1799 @@map("saved_searches")
1800}
1801