@danielcok17/prisma-db 1.17.0 → 1.19.0

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.17.0",
3
+ "version": "1.19.0",
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
@@ -130,12 +130,18 @@ model User {
130
130
  // Ingestion pipeline
131
131
  ingestedDocuments IngestedDocument[]
132
132
  adminGrants AdminGrant[]
133
+ invoiceGrants InvoiceGrant[]
133
134
  emailSends EmailSend[]
134
135
  emailConsent EmailConsent?
135
136
  userScore UserScore?
136
137
  sequenceEnrollments EmailSequenceEnrollment[]
137
138
  referralsSent Referral[] @relation("ReferralsSent")
138
139
  referralsReceived Referral[] @relation("ReferralsReceived")
140
+ // Files & folders system
141
+ userFiles UserFile[] @relation("UserFiles")
142
+ reviewTables FileReviewTable[] @relation("UserReviewTables")
143
+ filesTotalBytes BigInt @default(0)
144
+ filesCount Int @default(0)
139
145
 
140
146
  // Multi-brand: compound unique allows same email across brands
141
147
  @@unique([email, brand])
@@ -213,6 +219,7 @@ model Organization {
213
219
  stripeCustomer StripeCustomer?
214
220
  folderShares FolderShare[]
215
221
  adminGrants AdminGrant[]
222
+ invoiceGrants InvoiceGrant[]
216
223
 
217
224
  createdAt DateTime @default(now())
218
225
  updatedAt DateTime @updatedAt
@@ -323,6 +330,7 @@ model Answer {
323
330
  WorkflowLog WorkflowLog[]
324
331
  files MessageFile[]
325
332
  canvasDocumentId String? // No FK constraint - flexible document management
333
+ userFiles UserFile[] @relation("UserFileAnswers")
326
334
 
327
335
  @@index([conversationId])
328
336
  @@index([messageId])
@@ -725,7 +733,8 @@ model StripeSubscription {
725
733
  trialEnd DateTime?
726
734
 
727
735
  // Additional fields
728
- quantity Int @default(1) // Počet seats (pre LAW_FIRM/ENTERPRISE tier)
736
+ quantity Int @default(1) // Počet seats (pre LAW_FIRM/ENTERPRISE tier)
737
+ collectionMethod CollectionMethod @default(CHARGE_AUTOMATICALLY) // Karta vs faktúra
729
738
  defaultPaymentMethodId String? // Stripe payment method ID
730
739
 
731
740
  metadata Json? // Dodatočné Stripe metadata
@@ -887,7 +896,8 @@ enum FolderItemType {
887
896
  CONVERSATION
888
897
  CANVAS_DOCUMENT
889
898
  REFERENCE
890
- ATTACHMENT
899
+ ATTACHMENT // deprecated — kept for migration of old data
900
+ USER_FILE
891
901
  }
892
902
 
893
903
  // Folder activity types (for timeline)
@@ -899,10 +909,35 @@ enum FolderActivityType {
899
909
  ITEM_ADDED
900
910
  ITEM_REMOVED
901
911
  ITEM_UPDATED
912
+ ITEM_MOVED
902
913
  SHARE_ADDED
903
914
  SHARE_REMOVED
904
915
  USER_MESSAGE
905
916
  USER_NOTE
917
+ FILE_INDEXED
918
+ FILE_INDEX_ERROR
919
+ }
920
+
921
+ enum UserFileStatus {
922
+ STORED
923
+ QUEUED
924
+ INDEXING
925
+ INDEXED
926
+ ERROR
927
+ DELETED
928
+ }
929
+
930
+ enum IndexingJobStatus {
931
+ QUEUED
932
+ RUNNING
933
+ COMPLETED
934
+ FAILED
935
+ }
936
+
937
+ enum FolderType {
938
+ PERSONAL
939
+ MATTER
940
+ KNOWLEDGE_BASE
906
941
  }
907
942
 
908
943
  // Folder permission levels
@@ -1086,6 +1121,121 @@ enum IngestionStatus {
1086
1121
  ERROR
1087
1122
  }
1088
1123
 
1124
+ model UserFile {
1125
+ id String @id @default(cuid())
1126
+ userId String
1127
+
1128
+ storageKey String @unique
1129
+ storageUrl String?
1130
+ checksumSha256 String
1131
+
1132
+ fileName String
1133
+ fileType String
1134
+ fileSize Int
1135
+ pageCount Int?
1136
+ language String? @default("sk")
1137
+
1138
+ status UserFileStatus @default(STORED)
1139
+
1140
+ docType String?
1141
+ legalArea String?
1142
+ summary String?
1143
+ extractedData Json?
1144
+ references String[] @default([])
1145
+ chunkCount Int?
1146
+ qdrantDocId String? @unique
1147
+ indexingCost Float?
1148
+ indexedAt DateTime?
1149
+ indexError String?
1150
+
1151
+ tags String[] @default([])
1152
+
1153
+ parentFileId String?
1154
+ versionNumber Int @default(1)
1155
+
1156
+ answerId String?
1157
+
1158
+ createdAt DateTime @default(now())
1159
+ updatedAt DateTime @updatedAt
1160
+ deletedAt DateTime?
1161
+
1162
+ user User @relation("UserFiles", fields: [userId], references: [id], onDelete: Cascade)
1163
+ answer Answer? @relation("UserFileAnswers", fields: [answerId], references: [id], onDelete: SetNull)
1164
+ indexingJobs FileIndexingJob[]
1165
+ deadlines FileDeadline[]
1166
+ parentFile UserFile? @relation("FileVersions", fields: [parentFileId], references: [id], onDelete: SetNull)
1167
+ childVersions UserFile[] @relation("FileVersions")
1168
+
1169
+ @@index([userId])
1170
+ @@index([status])
1171
+ @@index([userId, status])
1172
+ @@index([userId, deletedAt])
1173
+ @@index([qdrantDocId])
1174
+ @@index([answerId])
1175
+ @@index([checksumSha256])
1176
+ }
1177
+
1178
+ model FileIndexingJob {
1179
+ id String @id @default(cuid())
1180
+ fileId String
1181
+ userId String
1182
+ status IndexingJobStatus @default(QUEUED)
1183
+ attempts Int @default(0)
1184
+ maxAttempts Int @default(3)
1185
+ errorMsg String?
1186
+ startedAt DateTime?
1187
+ finishedAt DateTime?
1188
+ createdAt DateTime @default(now())
1189
+
1190
+ file UserFile @relation(fields: [fileId], references: [id], onDelete: Cascade)
1191
+
1192
+ @@index([fileId])
1193
+ @@index([userId])
1194
+ @@index([status])
1195
+ @@index([createdAt])
1196
+ }
1197
+
1198
+ model FileDeadline {
1199
+ id String @id @default(cuid())
1200
+ fileId String
1201
+ userId String
1202
+ label String
1203
+ deadlineAt DateTime
1204
+ notifyAt DateTime?
1205
+ isNotified Boolean @default(false)
1206
+ isDismissed Boolean @default(false)
1207
+ sourceSection String?
1208
+ sourcePage Int?
1209
+ createdAt DateTime @default(now())
1210
+
1211
+ file UserFile @relation(fields: [fileId], references: [id], onDelete: Cascade)
1212
+
1213
+ @@index([fileId])
1214
+ @@index([userId])
1215
+ @@index([deadlineAt])
1216
+ @@index([notifyAt, isNotified])
1217
+ @@index([userId, isDismissed])
1218
+ }
1219
+
1220
+ model FileReviewTable {
1221
+ id String @id @default(cuid())
1222
+ userId String
1223
+ folderId String?
1224
+ name String
1225
+ columns Json
1226
+ fileIds String[] @default([])
1227
+ results Json?
1228
+ status String @default("draft")
1229
+ createdAt DateTime @default(now())
1230
+ updatedAt DateTime @updatedAt
1231
+
1232
+ user User @relation("UserReviewTables", fields: [userId], references: [id], onDelete: Cascade)
1233
+
1234
+ @@index([userId])
1235
+ @@index([folderId])
1236
+ @@index([status])
1237
+ }
1238
+
1089
1239
  enum LifecycleStage {
1090
1240
  REGISTERED
1091
1241
  ACTIVATED
@@ -1150,6 +1300,17 @@ enum ReferralStatus {
1150
1300
  REWARDED
1151
1301
  }
1152
1302
 
1303
+ enum InvoiceGrantStatus {
1304
+ PENDING // Faktúra odoslaná, čaká na platbu
1305
+ PAID // Zaplatené, grant aktívny
1306
+ VOID // Stornovaná (admin alebo Stripe)
1307
+ }
1308
+
1309
+ enum CollectionMethod {
1310
+ CHARGE_AUTOMATICALLY // Automatické strhnutie kartou
1311
+ SEND_INVOICE // Faktúra na email (bank transfer)
1312
+ }
1313
+
1153
1314
  // ============================================
1154
1315
  // CANVAS DOCUMENT MODELS
1155
1316
  // ============================================
@@ -1223,6 +1384,9 @@ model Folder {
1223
1384
  path String @default("/") // Materialized path: "/parentId/grandparentId/..."
1224
1385
  depth Int @default(0)
1225
1386
 
1387
+ // Folder type
1388
+ folderType FolderType @default(PERSONAL)
1389
+
1226
1390
  // Metadata
1227
1391
  sortOrder Int @default(0)
1228
1392
  isArchived Boolean @default(false)
@@ -1372,6 +1536,33 @@ model AdminGrant {
1372
1536
  @@index([isActive])
1373
1537
  }
1374
1538
 
1539
+ // One-off admin invoice — standalone faktúra pre špeciálne prípady (demo, trial, custom deal)
1540
+ // Pre recurring fakturáciu použiť StripeSubscription s collectionMethod=SEND_INVOICE
1541
+ model InvoiceGrant {
1542
+ id String @id @default(cuid())
1543
+ userId String?
1544
+ organizationId String?
1545
+ stripeInvoiceId String @unique
1546
+ tier SubscriptionTier
1547
+ durationDays Int // Na koľko dní sa aktivuje grant po platbe
1548
+ amount Int // Suma v centoch (EUR)
1549
+ status InvoiceGrantStatus @default(PENDING)
1550
+ grantId String? // ID AdminGrantu vytvoreného po platbe
1551
+ createdBy String // Admin email
1552
+ notes String?
1553
+ paidAt DateTime?
1554
+ createdAt DateTime @default(now())
1555
+ updatedAt DateTime @updatedAt
1556
+
1557
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
1558
+ organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
1559
+
1560
+ @@index([userId])
1561
+ @@index([organizationId])
1562
+ @@index([status])
1563
+ @@index([stripeInvoiceId])
1564
+ }
1565
+
1375
1566
  model AppInvite {
1376
1567
  id String @id @default(cuid())
1377
1568
  email String
@@ -0,0 +1,49 @@
1
+ -- CreateEnum
2
+ CREATE TYPE "InvoiceGrantStatus" AS ENUM ('PENDING', 'PAID', 'VOID');
3
+
4
+ -- CreateEnum
5
+ CREATE TYPE "CollectionMethod" AS ENUM ('CHARGE_AUTOMATICALLY', 'SEND_INVOICE');
6
+
7
+ -- AlterTable
8
+ ALTER TABLE "StripeSubscription" ADD COLUMN "collectionMethod" "CollectionMethod" NOT NULL DEFAULT 'CHARGE_AUTOMATICALLY';
9
+
10
+ -- CreateTable
11
+ CREATE TABLE "InvoiceGrant" (
12
+ "id" TEXT NOT NULL,
13
+ "userId" TEXT,
14
+ "organizationId" TEXT,
15
+ "stripeInvoiceId" TEXT NOT NULL,
16
+ "tier" "SubscriptionTier" NOT NULL,
17
+ "durationDays" INTEGER NOT NULL,
18
+ "amount" INTEGER NOT NULL,
19
+ "status" "InvoiceGrantStatus" NOT NULL DEFAULT 'PENDING',
20
+ "grantId" TEXT,
21
+ "createdBy" TEXT NOT NULL,
22
+ "notes" TEXT,
23
+ "paidAt" TIMESTAMP(3),
24
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
25
+ "updatedAt" TIMESTAMP(3) NOT NULL,
26
+
27
+ CONSTRAINT "InvoiceGrant_pkey" PRIMARY KEY ("id")
28
+ );
29
+
30
+ -- CreateIndex
31
+ CREATE UNIQUE INDEX "InvoiceGrant_stripeInvoiceId_key" ON "InvoiceGrant"("stripeInvoiceId");
32
+
33
+ -- CreateIndex
34
+ CREATE INDEX "InvoiceGrant_userId_idx" ON "InvoiceGrant"("userId");
35
+
36
+ -- CreateIndex
37
+ CREATE INDEX "InvoiceGrant_organizationId_idx" ON "InvoiceGrant"("organizationId");
38
+
39
+ -- CreateIndex
40
+ CREATE INDEX "InvoiceGrant_status_idx" ON "InvoiceGrant"("status");
41
+
42
+ -- CreateIndex
43
+ CREATE INDEX "InvoiceGrant_stripeInvoiceId_idx" ON "InvoiceGrant"("stripeInvoiceId");
44
+
45
+ -- AddForeignKey
46
+ ALTER TABLE "InvoiceGrant" ADD CONSTRAINT "InvoiceGrant_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
47
+
48
+ -- AddForeignKey
49
+ ALTER TABLE "InvoiceGrant" ADD CONSTRAINT "InvoiceGrant_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,194 @@
1
+ -- CreateEnum
2
+ CREATE TYPE "UserFileStatus" AS ENUM ('STORED', 'QUEUED', 'INDEXING', 'INDEXED', 'ERROR', 'DELETED');
3
+
4
+ -- CreateEnum
5
+ CREATE TYPE "IndexingJobStatus" AS ENUM ('QUEUED', 'RUNNING', 'COMPLETED', 'FAILED');
6
+
7
+ -- CreateEnum
8
+ CREATE TYPE "FolderType" AS ENUM ('PERSONAL', 'MATTER', 'KNOWLEDGE_BASE');
9
+
10
+ -- AlterEnum
11
+ -- This migration adds more than one value to an enum.
12
+ -- With PostgreSQL versions 11 and earlier, this is not possible
13
+ -- in a single migration. This can be worked around by creating
14
+ -- multiple migrations, each migration adding only one value to
15
+ -- the enum.
16
+
17
+
18
+ ALTER TYPE "FolderActivityType" ADD VALUE 'ITEM_MOVED';
19
+ ALTER TYPE "FolderActivityType" ADD VALUE 'FILE_INDEXED';
20
+ ALTER TYPE "FolderActivityType" ADD VALUE 'FILE_INDEX_ERROR';
21
+
22
+ -- AlterEnum
23
+ ALTER TYPE "FolderItemType" ADD VALUE 'USER_FILE';
24
+
25
+ -- AlterTable
26
+ ALTER TABLE "Folder" ADD COLUMN "folderType" "FolderType" NOT NULL DEFAULT 'PERSONAL';
27
+
28
+ -- AlterTable
29
+ ALTER TABLE "User" ADD COLUMN "filesCount" INTEGER NOT NULL DEFAULT 0,
30
+ ADD COLUMN "filesTotalBytes" BIGINT NOT NULL DEFAULT 0;
31
+
32
+ -- CreateTable
33
+ CREATE TABLE "UserFile" (
34
+ "id" TEXT NOT NULL,
35
+ "userId" TEXT NOT NULL,
36
+ "storageKey" TEXT NOT NULL,
37
+ "storageUrl" TEXT,
38
+ "checksumSha256" TEXT NOT NULL,
39
+ "fileName" TEXT NOT NULL,
40
+ "fileType" TEXT NOT NULL,
41
+ "fileSize" INTEGER NOT NULL,
42
+ "pageCount" INTEGER,
43
+ "language" TEXT DEFAULT 'sk',
44
+ "status" "UserFileStatus" NOT NULL DEFAULT 'STORED',
45
+ "docType" TEXT,
46
+ "legalArea" TEXT,
47
+ "summary" TEXT,
48
+ "extractedData" JSONB,
49
+ "references" TEXT[] DEFAULT ARRAY[]::TEXT[],
50
+ "chunkCount" INTEGER,
51
+ "qdrantDocId" TEXT,
52
+ "indexingCost" DOUBLE PRECISION,
53
+ "indexedAt" TIMESTAMP(3),
54
+ "indexError" TEXT,
55
+ "tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
56
+ "parentFileId" TEXT,
57
+ "versionNumber" INTEGER NOT NULL DEFAULT 1,
58
+ "answerId" TEXT,
59
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
60
+ "updatedAt" TIMESTAMP(3) NOT NULL,
61
+ "deletedAt" TIMESTAMP(3),
62
+
63
+ CONSTRAINT "UserFile_pkey" PRIMARY KEY ("id")
64
+ );
65
+
66
+ -- CreateTable
67
+ CREATE TABLE "FileIndexingJob" (
68
+ "id" TEXT NOT NULL,
69
+ "fileId" TEXT NOT NULL,
70
+ "userId" TEXT NOT NULL,
71
+ "status" "IndexingJobStatus" NOT NULL DEFAULT 'QUEUED',
72
+ "attempts" INTEGER NOT NULL DEFAULT 0,
73
+ "maxAttempts" INTEGER NOT NULL DEFAULT 3,
74
+ "errorMsg" TEXT,
75
+ "startedAt" TIMESTAMP(3),
76
+ "finishedAt" TIMESTAMP(3),
77
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
78
+
79
+ CONSTRAINT "FileIndexingJob_pkey" PRIMARY KEY ("id")
80
+ );
81
+
82
+ -- CreateTable
83
+ CREATE TABLE "FileDeadline" (
84
+ "id" TEXT NOT NULL,
85
+ "fileId" TEXT NOT NULL,
86
+ "userId" TEXT NOT NULL,
87
+ "label" TEXT NOT NULL,
88
+ "deadlineAt" TIMESTAMP(3) NOT NULL,
89
+ "notifyAt" TIMESTAMP(3),
90
+ "isNotified" BOOLEAN NOT NULL DEFAULT false,
91
+ "isDismissed" BOOLEAN NOT NULL DEFAULT false,
92
+ "sourceSection" TEXT,
93
+ "sourcePage" INTEGER,
94
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
95
+
96
+ CONSTRAINT "FileDeadline_pkey" PRIMARY KEY ("id")
97
+ );
98
+
99
+ -- CreateTable
100
+ CREATE TABLE "FileReviewTable" (
101
+ "id" TEXT NOT NULL,
102
+ "userId" TEXT NOT NULL,
103
+ "folderId" TEXT,
104
+ "name" TEXT NOT NULL,
105
+ "columns" JSONB NOT NULL,
106
+ "fileIds" TEXT[] DEFAULT ARRAY[]::TEXT[],
107
+ "results" JSONB,
108
+ "status" TEXT NOT NULL DEFAULT 'draft',
109
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
110
+ "updatedAt" TIMESTAMP(3) NOT NULL,
111
+
112
+ CONSTRAINT "FileReviewTable_pkey" PRIMARY KEY ("id")
113
+ );
114
+
115
+ -- CreateIndex
116
+ CREATE UNIQUE INDEX "UserFile_storageKey_key" ON "UserFile"("storageKey");
117
+
118
+ -- CreateIndex
119
+ CREATE UNIQUE INDEX "UserFile_qdrantDocId_key" ON "UserFile"("qdrantDocId");
120
+
121
+ -- CreateIndex
122
+ CREATE INDEX "UserFile_userId_idx" ON "UserFile"("userId");
123
+
124
+ -- CreateIndex
125
+ CREATE INDEX "UserFile_status_idx" ON "UserFile"("status");
126
+
127
+ -- CreateIndex
128
+ CREATE INDEX "UserFile_userId_status_idx" ON "UserFile"("userId", "status");
129
+
130
+ -- CreateIndex
131
+ CREATE INDEX "UserFile_userId_deletedAt_idx" ON "UserFile"("userId", "deletedAt");
132
+
133
+ -- CreateIndex
134
+ CREATE INDEX "UserFile_qdrantDocId_idx" ON "UserFile"("qdrantDocId");
135
+
136
+ -- CreateIndex
137
+ CREATE INDEX "UserFile_answerId_idx" ON "UserFile"("answerId");
138
+
139
+ -- CreateIndex
140
+ CREATE INDEX "UserFile_checksumSha256_idx" ON "UserFile"("checksumSha256");
141
+
142
+ -- CreateIndex
143
+ CREATE INDEX "FileIndexingJob_fileId_idx" ON "FileIndexingJob"("fileId");
144
+
145
+ -- CreateIndex
146
+ CREATE INDEX "FileIndexingJob_userId_idx" ON "FileIndexingJob"("userId");
147
+
148
+ -- CreateIndex
149
+ CREATE INDEX "FileIndexingJob_status_idx" ON "FileIndexingJob"("status");
150
+
151
+ -- CreateIndex
152
+ CREATE INDEX "FileIndexingJob_createdAt_idx" ON "FileIndexingJob"("createdAt");
153
+
154
+ -- CreateIndex
155
+ CREATE INDEX "FileDeadline_fileId_idx" ON "FileDeadline"("fileId");
156
+
157
+ -- CreateIndex
158
+ CREATE INDEX "FileDeadline_userId_idx" ON "FileDeadline"("userId");
159
+
160
+ -- CreateIndex
161
+ CREATE INDEX "FileDeadline_deadlineAt_idx" ON "FileDeadline"("deadlineAt");
162
+
163
+ -- CreateIndex
164
+ CREATE INDEX "FileDeadline_notifyAt_isNotified_idx" ON "FileDeadline"("notifyAt", "isNotified");
165
+
166
+ -- CreateIndex
167
+ CREATE INDEX "FileDeadline_userId_isDismissed_idx" ON "FileDeadline"("userId", "isDismissed");
168
+
169
+ -- CreateIndex
170
+ CREATE INDEX "FileReviewTable_userId_idx" ON "FileReviewTable"("userId");
171
+
172
+ -- CreateIndex
173
+ CREATE INDEX "FileReviewTable_folderId_idx" ON "FileReviewTable"("folderId");
174
+
175
+ -- CreateIndex
176
+ CREATE INDEX "FileReviewTable_status_idx" ON "FileReviewTable"("status");
177
+
178
+ -- AddForeignKey
179
+ ALTER TABLE "UserFile" ADD CONSTRAINT "UserFile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
180
+
181
+ -- AddForeignKey
182
+ ALTER TABLE "UserFile" ADD CONSTRAINT "UserFile_answerId_fkey" FOREIGN KEY ("answerId") REFERENCES "Answer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
183
+
184
+ -- AddForeignKey
185
+ ALTER TABLE "UserFile" ADD CONSTRAINT "UserFile_parentFileId_fkey" FOREIGN KEY ("parentFileId") REFERENCES "UserFile"("id") ON DELETE SET NULL ON UPDATE CASCADE;
186
+
187
+ -- AddForeignKey
188
+ ALTER TABLE "FileIndexingJob" ADD CONSTRAINT "FileIndexingJob_fileId_fkey" FOREIGN KEY ("fileId") REFERENCES "UserFile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
189
+
190
+ -- AddForeignKey
191
+ ALTER TABLE "FileDeadline" ADD CONSTRAINT "FileDeadline_fileId_fkey" FOREIGN KEY ("fileId") REFERENCES "UserFile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
192
+
193
+ -- AddForeignKey
194
+ ALTER TABLE "FileReviewTable" ADD CONSTRAINT "FileReviewTable_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;