@danielcok17/prisma-db 1.20.9 → 1.20.11

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.20.9",
3
+ "version": "1.20.11",
4
4
  "description": "Shared Prisma schema for Legal AI applications",
5
5
  "repository": {
6
6
  "type": "git",
package/prisma/app.prisma CHANGED
@@ -341,14 +341,17 @@ model Answer {
341
341
  }
342
342
 
343
343
  model MessageFile {
344
- id String @id @default(cuid())
345
- answerId String?
346
- fileName String
347
- fileType String
348
- base64Data String
349
- extractedText String?
350
- uploadedAt DateTime @default(now())
351
- answer Answer? @relation(fields: [answerId], references: [id], onDelete: Cascade)
344
+ id String @id @default(cuid())
345
+ answerId String?
346
+ fileName String
347
+ fileType String
348
+ base64Data String
349
+ convertedBase64Data String?
350
+ convertedFileName String?
351
+ convertedFileType String?
352
+ extractedText String?
353
+ uploadedAt DateTime @default(now())
354
+ answer Answer? @relation(fields: [answerId], references: [id], onDelete: Cascade)
352
355
 
353
356
  @@index([answerId])
354
357
  @@index([fileType])
@@ -958,17 +961,85 @@ enum FolderPermission {
958
961
 
959
962
  // Nový model pre logovanie admin akcií
960
963
  model AdminActionLog {
961
- id String @id @default(cuid())
962
- action String // APPROVE_USER, REJECT_USER, etc.
963
- targetUserId String // ID používateľa, na ktorého sa akcia vzťahuje
964
- adminEmail String // E-mail admina, ktorý vykonal akciu
965
- details Json? // Ďalšie detaily akcie (reason, notes, etc.)
966
- createdAt DateTime @default(now())
964
+ id String @id @default(cuid())
965
+ action String // APPROVE_USER, REJECT_USER, etc.
966
+ targetUserId String // ID používateľa, na ktorého sa akcia vzťahuje
967
+ adminEmail String // E-mail admina, ktorý vykonal akciu
968
+ details Json? // Ďalšie detaily akcie (reason, notes, etc.)
969
+ createdAt DateTime @default(now())
970
+ // Correlation + security audit fields
971
+ requestId String? // korelácia s Pino logom (AsyncLocalStorage requestId)
972
+ ipAddress String?
973
+ userAgent String?
974
+ brand String @default("smartlex")
975
+ organizationId String?
967
976
 
968
977
  @@index([action])
969
978
  @@index([targetUserId])
970
979
  @@index([adminEmail])
971
980
  @@index([createdAt])
981
+ @@index([brand])
982
+ @@index([organizationId])
983
+ @@index([requestId])
984
+ }
985
+
986
+ // GDPR Article 30 — data access audit trail
987
+ // WHO accessed WHAT legal data, WHEN, and from WHERE
988
+ model AuditLog {
989
+ id String @id @default(cuid())
990
+
991
+ userId String?
992
+ adminEmail String?
993
+
994
+ action String // READ_CONVERSATION | DELETE_ANSWER | EXPORT_DATA | VIEW_USER | SHARE_FOLDER
995
+ entityType String // "Conversation" | "Answer" | "UserFile" | "User" | "Folder"
996
+ entityId String
997
+ brand String @default("smartlex")
998
+
999
+ requestId String?
1000
+ ipAddress String?
1001
+ userAgent String?
1002
+ metadata Json?
1003
+
1004
+ createdAt DateTime @default(now())
1005
+
1006
+ @@index([userId])
1007
+ @@index([action])
1008
+ @@index([entityType, entityId])
1009
+ @@index([brand])
1010
+ @@index([createdAt])
1011
+ @@index([requestId])
1012
+ }
1013
+
1014
+ // Daily aggregated usage — billing analytics, cost trending
1015
+ // Populated by nightly cron job from AnswerMetrics — never write from request path
1016
+ model UsageDaily {
1017
+ id String @id @default(cuid())
1018
+
1019
+ date DateTime @db.Date
1020
+ userId String?
1021
+ organizationId String?
1022
+ brand String @default("smartlex")
1023
+ aiProvider String
1024
+ aiModel String
1025
+
1026
+ messageCount Int @default(0)
1027
+ tokenCount Int @default(0)
1028
+ totalCost Float @default(0)
1029
+ aiCost Float @default(0)
1030
+ ragCost Float @default(0)
1031
+ avgDurationMs Float?
1032
+ errorCount Int @default(0)
1033
+
1034
+ createdAt DateTime @default(now())
1035
+ updatedAt DateTime @updatedAt
1036
+
1037
+ @@unique([date, userId, organizationId, aiModel])
1038
+ @@index([date])
1039
+ @@index([userId, date])
1040
+ @@index([organizationId, date])
1041
+ @@index([brand, date])
1042
+ @@index([aiProvider, date])
972
1043
  }
973
1044
 
974
1045
  model WorkflowLog {
@@ -0,0 +1,91 @@
1
+ -- AlterTable
2
+ ALTER TABLE "AdminActionLog" ADD COLUMN "brand" TEXT NOT NULL DEFAULT 'smartlex',
3
+ ADD COLUMN "ipAddress" TEXT,
4
+ ADD COLUMN "organizationId" TEXT,
5
+ ADD COLUMN "requestId" TEXT,
6
+ ADD COLUMN "userAgent" TEXT;
7
+
8
+ -- CreateTable
9
+ CREATE TABLE "AuditLog" (
10
+ "id" TEXT NOT NULL,
11
+ "userId" TEXT,
12
+ "adminEmail" TEXT,
13
+ "action" TEXT NOT NULL,
14
+ "entityType" TEXT NOT NULL,
15
+ "entityId" TEXT NOT NULL,
16
+ "brand" TEXT NOT NULL DEFAULT 'smartlex',
17
+ "requestId" TEXT,
18
+ "ipAddress" TEXT,
19
+ "userAgent" TEXT,
20
+ "metadata" JSONB,
21
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
22
+
23
+ CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id")
24
+ );
25
+
26
+ -- CreateTable
27
+ CREATE TABLE "UsageDaily" (
28
+ "id" TEXT NOT NULL,
29
+ "date" DATE NOT NULL,
30
+ "userId" TEXT,
31
+ "organizationId" TEXT,
32
+ "brand" TEXT NOT NULL DEFAULT 'smartlex',
33
+ "aiProvider" TEXT NOT NULL,
34
+ "aiModel" TEXT NOT NULL,
35
+ "messageCount" INTEGER NOT NULL DEFAULT 0,
36
+ "tokenCount" INTEGER NOT NULL DEFAULT 0,
37
+ "totalCost" DOUBLE PRECISION NOT NULL DEFAULT 0,
38
+ "aiCost" DOUBLE PRECISION NOT NULL DEFAULT 0,
39
+ "ragCost" DOUBLE PRECISION NOT NULL DEFAULT 0,
40
+ "avgDurationMs" DOUBLE PRECISION,
41
+ "errorCount" INTEGER NOT NULL DEFAULT 0,
42
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
43
+ "updatedAt" TIMESTAMP(3) NOT NULL,
44
+
45
+ CONSTRAINT "UsageDaily_pkey" PRIMARY KEY ("id")
46
+ );
47
+
48
+ -- CreateIndex
49
+ CREATE INDEX "AuditLog_userId_idx" ON "AuditLog"("userId");
50
+
51
+ -- CreateIndex
52
+ CREATE INDEX "AuditLog_action_idx" ON "AuditLog"("action");
53
+
54
+ -- CreateIndex
55
+ CREATE INDEX "AuditLog_entityType_entityId_idx" ON "AuditLog"("entityType", "entityId");
56
+
57
+ -- CreateIndex
58
+ CREATE INDEX "AuditLog_brand_idx" ON "AuditLog"("brand");
59
+
60
+ -- CreateIndex
61
+ CREATE INDEX "AuditLog_createdAt_idx" ON "AuditLog"("createdAt");
62
+
63
+ -- CreateIndex
64
+ CREATE INDEX "AuditLog_requestId_idx" ON "AuditLog"("requestId");
65
+
66
+ -- CreateIndex
67
+ CREATE INDEX "UsageDaily_date_idx" ON "UsageDaily"("date");
68
+
69
+ -- CreateIndex
70
+ CREATE INDEX "UsageDaily_userId_date_idx" ON "UsageDaily"("userId", "date");
71
+
72
+ -- CreateIndex
73
+ CREATE INDEX "UsageDaily_organizationId_date_idx" ON "UsageDaily"("organizationId", "date");
74
+
75
+ -- CreateIndex
76
+ CREATE INDEX "UsageDaily_brand_date_idx" ON "UsageDaily"("brand", "date");
77
+
78
+ -- CreateIndex
79
+ CREATE INDEX "UsageDaily_aiProvider_date_idx" ON "UsageDaily"("aiProvider", "date");
80
+
81
+ -- CreateIndex
82
+ CREATE UNIQUE INDEX "UsageDaily_date_userId_organizationId_aiModel_key" ON "UsageDaily"("date", "userId", "organizationId", "aiModel");
83
+
84
+ -- CreateIndex
85
+ CREATE INDEX "AdminActionLog_brand_idx" ON "AdminActionLog"("brand");
86
+
87
+ -- CreateIndex
88
+ CREATE INDEX "AdminActionLog_organizationId_idx" ON "AdminActionLog"("organizationId");
89
+
90
+ -- CreateIndex
91
+ CREATE INDEX "AdminActionLog_requestId_idx" ON "AdminActionLog"("requestId");