@danielcok17/prisma-db 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danielcok17/prisma-db",
3
- "version": "1.7.0",
3
+ "version": "1.8.1",
4
4
  "description": "Shared Prisma schema for Legal AI applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/prisma/app.prisma CHANGED
@@ -58,10 +58,11 @@ model User {
58
58
  messageCountResetAt DateTime? // Kedy sa má resetovať message count
59
59
  adminGrantExpiresAt DateTime? // Kedy admin grant expiruje
60
60
  // Relations
61
- approvalRequest UserApprovalRequest?
62
- stripeCustomer StripeCustomer? // ✨ B2C Stripe customer
63
- ownedOrganizations Organization[] @relation("OrganizationOwner")
64
- organizationMembers OrganizationMember[]
61
+ approvalRequest UserApprovalRequest?
62
+ stripeCustomer StripeCustomer? // ✨ B2C Stripe customer
63
+ ownedOrganizations Organization[] @relation("OrganizationOwner")
64
+ organizationMembers OrganizationMember[]
65
+ createdInvites OrganizationInvite[] @relation("InviteCreator")
65
66
  accounts Account[]
66
67
  answers Answer[]
67
68
  conversations Conversation[]
@@ -73,6 +74,12 @@ model User {
73
74
  passwordResetTokens PasswordResetToken[]
74
75
  canvasDocuments CanvasDocument[]
75
76
  canvasDocumentVersions CanvasDocumentVersion[]
77
+ // Folder system relations
78
+ ownedFolders Folder[] @relation("FolderOwner")
79
+ addedFolderItems FolderItem[] @relation("FolderItemAdder")
80
+ folderActivities FolderActivity[] @relation("FolderActivityUser")
81
+ folderSharesReceived FolderShare[] @relation("FolderShareUser")
82
+ createdFolderShares FolderShare[] @relation("FolderShareCreator")
76
83
  }
77
84
 
78
85
  // Nový model pre žiadosti o schválenie
@@ -125,10 +132,12 @@ model Organization {
125
132
  maxMembers Int @default(5) // Max počet členov podľa tieru
126
133
 
127
134
  // Relations
128
- owner User @relation("OrganizationOwner", fields: [ownerId], references: [id])
135
+ owner User @relation("OrganizationOwner", fields: [ownerId], references: [id])
129
136
  ownerId String
130
137
  members OrganizationMember[]
138
+ invites OrganizationInvite[]
131
139
  stripeCustomer StripeCustomer?
140
+ folderShares FolderShare[]
132
141
 
133
142
  createdAt DateTime @default(now())
134
143
  updatedAt DateTime @updatedAt
@@ -157,6 +166,32 @@ model OrganizationMember {
157
166
  @@index([role])
158
167
  }
159
168
 
169
+ // Organization Invite System
170
+ model OrganizationInvite {
171
+ id String @id @default(cuid())
172
+ organizationId String
173
+ token String @unique
174
+ email String? // Optional: specific email invite
175
+ role MemberRole @default(MEMBER)
176
+ createdBy String
177
+ expiresAt DateTime
178
+ maxUses Int @default(1) // For multi-use invites
179
+ currentUses Int @default(0)
180
+ isActive Boolean @default(true)
181
+ usedAt DateTime? // Last usage timestamp
182
+ usedBy String? // Last user who used it
183
+ createdAt DateTime @default(now())
184
+ updatedAt DateTime @updatedAt
185
+
186
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
187
+ creator User @relation("InviteCreator", fields: [createdBy], references: [id])
188
+
189
+ @@index([token])
190
+ @@index([organizationId])
191
+ @@index([isActive])
192
+ @@index([expiresAt])
193
+ }
194
+
160
195
  enum MemberRole {
161
196
  OWNER // Zakladateľ/vlastník, plný prístup k billing a settings
162
197
  ADMIN // Administrátor, môže pridávať/odoberať členov
@@ -542,6 +577,40 @@ enum DocumentStatus {
542
577
  ARCHIVED
543
578
  }
544
579
 
580
+ // ============================================
581
+ // FOLDER SYSTEM ENUMS
582
+ // ============================================
583
+
584
+ // Folder item types (what can be stored in folders)
585
+ enum FolderItemType {
586
+ CONVERSATION
587
+ CANVAS_DOCUMENT
588
+ REFERENCE
589
+ ATTACHMENT
590
+ }
591
+
592
+ // Folder activity types (for timeline)
593
+ enum FolderActivityType {
594
+ FOLDER_CREATED
595
+ FOLDER_UPDATED
596
+ FOLDER_MOVED
597
+ FOLDER_ARCHIVED
598
+ ITEM_ADDED
599
+ ITEM_REMOVED
600
+ ITEM_UPDATED
601
+ SHARE_ADDED
602
+ SHARE_REMOVED
603
+ USER_MESSAGE
604
+ USER_NOTE
605
+ }
606
+
607
+ // Folder permission levels
608
+ enum FolderPermission {
609
+ VIEW
610
+ EDIT
611
+ ADMIN
612
+ }
613
+
545
614
  // Nový model pre logovanie admin akcií
546
615
  model AdminActionLog {
547
616
  id String @id @default(cuid())
@@ -708,3 +777,145 @@ model CanvasDocumentVersion {
708
777
  @@index([createdBy])
709
778
  @@index([createdAt])
710
779
  }
780
+
781
+ // ============================================
782
+ // FOLDER SYSTEM MODELS
783
+ // ============================================
784
+
785
+ // Main folder entity with hierarchy support via parentId
786
+ // Uses materialized path pattern for efficient hierarchy queries
787
+ model Folder {
788
+ id String @id @default(cuid())
789
+ name String
790
+ description String?
791
+ color String? @default("#6366f1")
792
+ icon String? @default("folder")
793
+
794
+ // Ownership (always user-owned)
795
+ ownerId String
796
+
797
+ // Hierarchy
798
+ parentId String?
799
+ rootFolderId String? // NULL for root folders, points to top-level ancestor
800
+ path String @default("/") // Materialized path: "/parentId/grandparentId/..."
801
+ depth Int @default(0)
802
+
803
+ // Metadata
804
+ sortOrder Int @default(0)
805
+ isArchived Boolean @default(false)
806
+ createdAt DateTime @default(now())
807
+ updatedAt DateTime @updatedAt
808
+
809
+ // Relations
810
+ owner User @relation("FolderOwner", fields: [ownerId], references: [id], onDelete: Cascade)
811
+ parent Folder? @relation("FolderHierarchy", fields: [parentId], references: [id], onDelete: Cascade)
812
+ children Folder[] @relation("FolderHierarchy")
813
+ items FolderItem[]
814
+ activities FolderActivity[]
815
+ shares FolderShare[]
816
+
817
+ @@index([ownerId])
818
+ @@index([parentId])
819
+ @@index([rootFolderId])
820
+ @@index([path])
821
+ @@index([isArchived])
822
+ @@index([ownerId, isArchived])
823
+ }
824
+
825
+ // Links entities (conversations, documents, etc.) to folders
826
+ // Polymorphic: entityType + entityId point to any supported entity
827
+ model FolderItem {
828
+ id String @id @default(cuid())
829
+ folderId String
830
+
831
+ // Polymorphic reference
832
+ entityType FolderItemType
833
+ entityId String
834
+
835
+ // Optional metadata override
836
+ displayName String?
837
+ notes String?
838
+
839
+ // Denormalized for efficient hierarchy queries
840
+ rootFolderId String?
841
+
842
+ // Tracking
843
+ addedById String
844
+ sortOrder Int @default(0)
845
+ createdAt DateTime @default(now())
846
+ updatedAt DateTime @updatedAt
847
+
848
+ // Relations
849
+ folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)
850
+ addedBy User @relation("FolderItemAdder", fields: [addedById], references: [id], onDelete: Restrict)
851
+
852
+ @@unique([folderId, entityType, entityId])
853
+ @@index([folderId])
854
+ @@index([entityType, entityId])
855
+ @@index([rootFolderId])
856
+ @@index([addedById])
857
+ }
858
+
859
+ // Timeline entries for folders (system events + user messages)
860
+ // Opening ANY folder shows ALL activities from the entire folder tree
861
+ model FolderActivity {
862
+ id String @id @default(cuid())
863
+ folderId String
864
+
865
+ // Denormalized for cross-folder timeline queries
866
+ rootFolderId String?
867
+
868
+ // Activity details
869
+ activityType FolderActivityType
870
+ userId String
871
+ content String? // For USER_MESSAGE, USER_NOTE types
872
+ metadata Json? // For system event details
873
+ relatedItemId String? // Optional reference to FolderItem
874
+
875
+ // Timestamp
876
+ createdAt DateTime @default(now())
877
+
878
+ // Relations
879
+ folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)
880
+ user User @relation("FolderActivityUser", fields: [userId], references: [id], onDelete: Restrict)
881
+
882
+ @@index([folderId])
883
+ @@index([rootFolderId])
884
+ @@index([userId])
885
+ @@index([activityType])
886
+ @@index([createdAt])
887
+ @@index([rootFolderId, createdAt(sort: Desc)])
888
+ }
889
+
890
+ // Sharing permissions for folders
891
+ // Can share with individual user OR entire organization (not both)
892
+ model FolderShare {
893
+ id String @id @default(cuid())
894
+ folderId String
895
+
896
+ // Share target (either user OR organization, enforced by application logic)
897
+ userId String?
898
+ organizationId String?
899
+
900
+ // Permission level
901
+ permission FolderPermission @default(VIEW)
902
+
903
+ // Sharing metadata
904
+ sharedById String
905
+ sharedAt DateTime @default(now())
906
+ expiresAt DateTime?
907
+
908
+ // Relations
909
+ folder Folder @relation(fields: [folderId], references: [id], onDelete: Cascade)
910
+ user User? @relation("FolderShareUser", fields: [userId], references: [id], onDelete: Cascade)
911
+ organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
912
+ sharedBy User @relation("FolderShareCreator", fields: [sharedById], references: [id], onDelete: Restrict)
913
+
914
+ // Partial unique indexes for nullable columns
915
+ @@unique([folderId, userId])
916
+ @@unique([folderId, organizationId])
917
+ @@index([folderId])
918
+ @@index([userId])
919
+ @@index([organizationId])
920
+ @@index([sharedById])
921
+ }