@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
package/prisma/app.prisma
CHANGED
|
@@ -341,14 +341,17 @@ model Answer {
|
|
|
341
341
|
}
|
|
342
342
|
|
|
343
343
|
model MessageFile {
|
|
344
|
-
id
|
|
345
|
-
answerId
|
|
346
|
-
fileName
|
|
347
|
-
fileType
|
|
348
|
-
base64Data
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
|
962
|
-
action
|
|
963
|
-
targetUserId
|
|
964
|
-
adminEmail
|
|
965
|
-
details
|
|
966
|
-
createdAt
|
|
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");
|