@danielcok17/prisma-db 1.20.10 → 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
|
@@ -961,17 +961,85 @@ enum FolderPermission {
|
|
|
961
961
|
|
|
962
962
|
// Nový model pre logovanie admin akcií
|
|
963
963
|
model AdminActionLog {
|
|
964
|
-
id
|
|
965
|
-
action
|
|
966
|
-
targetUserId
|
|
967
|
-
adminEmail
|
|
968
|
-
details
|
|
969
|
-
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?
|
|
970
976
|
|
|
971
977
|
@@index([action])
|
|
972
978
|
@@index([targetUserId])
|
|
973
979
|
@@index([adminEmail])
|
|
974
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])
|
|
975
1043
|
}
|
|
976
1044
|
|
|
977
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");
|