@varaos/db 1.1.14 → 1.1.16
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 +1 -1
- package/prisma/migrations/20251231113444_add_account_billing_usage_security_foundations/migration.sql +170 -0
- package/prisma/migrations/20260103095101_add_user_storage_quota_fields/migration.sql +3 -0
- package/prisma/migrations/20260103095321_add_user_file_storage_tracking/migration.sql +21 -0
- package/prisma/schema.prisma +172 -11
package/package.json
CHANGED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
-- CreateEnum
|
|
2
|
+
CREATE TYPE "public"."AuthType" AS ENUM ('credentials', 'oauth', 'hybrid');
|
|
3
|
+
|
|
4
|
+
-- AlterEnum
|
|
5
|
+
-- This migration adds more than one value to an enum.
|
|
6
|
+
-- With PostgreSQL versions 11 and earlier, this is not possible
|
|
7
|
+
-- in a single migration. This can be worked around by creating
|
|
8
|
+
-- multiple migrations, each migration adding only one value to
|
|
9
|
+
-- the enum.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
ALTER TYPE "public"."Plan" ADD VALUE 'starter';
|
|
13
|
+
ALTER TYPE "public"."Plan" ADD VALUE 'business';
|
|
14
|
+
|
|
15
|
+
-- AlterTable
|
|
16
|
+
ALTER TABLE "public"."Subscription" ADD COLUMN "razorpayCustomerId" TEXT,
|
|
17
|
+
ADD COLUMN "razorpayPlanId" TEXT,
|
|
18
|
+
ADD COLUMN "razorpaySubscriptionId" TEXT;
|
|
19
|
+
|
|
20
|
+
-- AlterTable
|
|
21
|
+
ALTER TABLE "public"."TokenTransaction" ADD COLUMN "billingPeriod" TEXT,
|
|
22
|
+
ADD COLUMN "integration" TEXT,
|
|
23
|
+
ADD COLUMN "source" TEXT,
|
|
24
|
+
ADD COLUMN "workspaceId" TEXT;
|
|
25
|
+
|
|
26
|
+
-- AlterTable
|
|
27
|
+
ALTER TABLE "public"."User" ADD COLUMN "authType" "public"."AuthType" NOT NULL DEFAULT 'oauth',
|
|
28
|
+
ADD COLUMN "avatarOverrideUrl" TEXT,
|
|
29
|
+
ADD COLUMN "passwordStrength" TEXT;
|
|
30
|
+
|
|
31
|
+
-- CreateTable
|
|
32
|
+
CREATE TABLE "public"."UserSession" (
|
|
33
|
+
"id" TEXT NOT NULL,
|
|
34
|
+
"userId" TEXT NOT NULL,
|
|
35
|
+
"ip" TEXT,
|
|
36
|
+
"userAgent" TEXT,
|
|
37
|
+
"lastUsed" TIMESTAMP(3) NOT NULL,
|
|
38
|
+
"revoked" BOOLEAN NOT NULL DEFAULT false,
|
|
39
|
+
"revokedAt" TIMESTAMP(3),
|
|
40
|
+
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
41
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
42
|
+
|
|
43
|
+
CONSTRAINT "UserSession_pkey" PRIMARY KEY ("id")
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
-- CreateTable
|
|
47
|
+
CREATE TABLE "public"."UserEmail" (
|
|
48
|
+
"id" TEXT NOT NULL,
|
|
49
|
+
"userId" TEXT NOT NULL,
|
|
50
|
+
"email" TEXT NOT NULL,
|
|
51
|
+
"verified" BOOLEAN NOT NULL DEFAULT false,
|
|
52
|
+
"primary" BOOLEAN NOT NULL DEFAULT false,
|
|
53
|
+
"type" TEXT,
|
|
54
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
55
|
+
|
|
56
|
+
CONSTRAINT "UserEmail_pkey" PRIMARY KEY ("id")
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
-- CreateTable
|
|
60
|
+
CREATE TABLE "public"."UsageAggregate" (
|
|
61
|
+
"id" TEXT NOT NULL,
|
|
62
|
+
"userId" TEXT NOT NULL,
|
|
63
|
+
"workspaceId" TEXT,
|
|
64
|
+
"billingPeriod" TEXT NOT NULL,
|
|
65
|
+
"source" TEXT NOT NULL,
|
|
66
|
+
"tokensUsed" INTEGER NOT NULL,
|
|
67
|
+
"requestCount" INTEGER NOT NULL,
|
|
68
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
69
|
+
|
|
70
|
+
CONSTRAINT "UsageAggregate_pkey" PRIMARY KEY ("id")
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
-- CreateTable
|
|
74
|
+
CREATE TABLE "public"."SecurityEvent" (
|
|
75
|
+
"id" TEXT NOT NULL,
|
|
76
|
+
"userId" TEXT,
|
|
77
|
+
"type" TEXT NOT NULL,
|
|
78
|
+
"ip" TEXT,
|
|
79
|
+
"userAgent" TEXT,
|
|
80
|
+
"success" BOOLEAN NOT NULL,
|
|
81
|
+
"metadata" JSONB,
|
|
82
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
83
|
+
|
|
84
|
+
CONSTRAINT "SecurityEvent_pkey" PRIMARY KEY ("id")
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
-- CreateTable
|
|
88
|
+
CREATE TABLE "public"."Invoice" (
|
|
89
|
+
"id" TEXT NOT NULL,
|
|
90
|
+
"userId" TEXT NOT NULL,
|
|
91
|
+
"subscriptionId" TEXT,
|
|
92
|
+
"razorpayInvoiceId" TEXT NOT NULL,
|
|
93
|
+
"amount" INTEGER NOT NULL,
|
|
94
|
+
"currency" TEXT NOT NULL,
|
|
95
|
+
"status" TEXT NOT NULL,
|
|
96
|
+
"periodStart" TIMESTAMP(3) NOT NULL,
|
|
97
|
+
"periodEnd" TIMESTAMP(3) NOT NULL,
|
|
98
|
+
"pdfUrl" TEXT,
|
|
99
|
+
"metadata" JSONB,
|
|
100
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
101
|
+
|
|
102
|
+
CONSTRAINT "Invoice_pkey" PRIMARY KEY ("id")
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
-- CreateTable
|
|
106
|
+
CREATE TABLE "public"."BillingEvent" (
|
|
107
|
+
"id" TEXT NOT NULL,
|
|
108
|
+
"provider" TEXT NOT NULL,
|
|
109
|
+
"eventType" TEXT NOT NULL,
|
|
110
|
+
"eventId" TEXT NOT NULL,
|
|
111
|
+
"payload" JSONB NOT NULL,
|
|
112
|
+
"processed" BOOLEAN NOT NULL DEFAULT false,
|
|
113
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
114
|
+
|
|
115
|
+
CONSTRAINT "BillingEvent_pkey" PRIMARY KEY ("id")
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
-- CreateTable
|
|
119
|
+
CREATE TABLE "public"."PaymentMethod" (
|
|
120
|
+
"id" TEXT NOT NULL,
|
|
121
|
+
"userId" TEXT NOT NULL,
|
|
122
|
+
"provider" TEXT NOT NULL,
|
|
123
|
+
"type" TEXT NOT NULL,
|
|
124
|
+
"brand" TEXT,
|
|
125
|
+
"last4" TEXT,
|
|
126
|
+
"expMonth" INTEGER,
|
|
127
|
+
"expYear" INTEGER,
|
|
128
|
+
"isDefault" BOOLEAN NOT NULL DEFAULT true,
|
|
129
|
+
"metadata" JSONB,
|
|
130
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
131
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
132
|
+
|
|
133
|
+
CONSTRAINT "PaymentMethod_pkey" PRIMARY KEY ("id")
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
-- CreateIndex
|
|
137
|
+
CREATE INDEX "UserSession_userId_idx" ON "public"."UserSession"("userId");
|
|
138
|
+
|
|
139
|
+
-- CreateIndex
|
|
140
|
+
CREATE UNIQUE INDEX "UserEmail_email_key" ON "public"."UserEmail"("email");
|
|
141
|
+
|
|
142
|
+
-- CreateIndex
|
|
143
|
+
CREATE UNIQUE INDEX "UsageAggregate_userId_workspaceId_billingPeriod_source_key" ON "public"."UsageAggregate"("userId", "workspaceId", "billingPeriod", "source");
|
|
144
|
+
|
|
145
|
+
-- CreateIndex
|
|
146
|
+
CREATE INDEX "SecurityEvent_userId_createdAt_idx" ON "public"."SecurityEvent"("userId", "createdAt");
|
|
147
|
+
|
|
148
|
+
-- CreateIndex
|
|
149
|
+
CREATE UNIQUE INDEX "BillingEvent_eventId_key" ON "public"."BillingEvent"("eventId");
|
|
150
|
+
|
|
151
|
+
-- CreateIndex
|
|
152
|
+
CREATE INDEX "BillingEvent_provider_eventType_idx" ON "public"."BillingEvent"("provider", "eventType");
|
|
153
|
+
|
|
154
|
+
-- CreateIndex
|
|
155
|
+
CREATE INDEX "Subscription_razorpayCustomerId_idx" ON "public"."Subscription"("razorpayCustomerId");
|
|
156
|
+
|
|
157
|
+
-- CreateIndex
|
|
158
|
+
CREATE INDEX "Subscription_razorpaySubscriptionId_idx" ON "public"."Subscription"("razorpaySubscriptionId");
|
|
159
|
+
|
|
160
|
+
-- AddForeignKey
|
|
161
|
+
ALTER TABLE "public"."UserSession" ADD CONSTRAINT "UserSession_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
162
|
+
|
|
163
|
+
-- AddForeignKey
|
|
164
|
+
ALTER TABLE "public"."UserEmail" ADD CONSTRAINT "UserEmail_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
165
|
+
|
|
166
|
+
-- AddForeignKey
|
|
167
|
+
ALTER TABLE "public"."Invoice" ADD CONSTRAINT "Invoice_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
168
|
+
|
|
169
|
+
-- AddForeignKey
|
|
170
|
+
ALTER TABLE "public"."PaymentMethod" ADD CONSTRAINT "PaymentMethod_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "public"."UserFile" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"userId" TEXT NOT NULL,
|
|
5
|
+
"path" TEXT NOT NULL,
|
|
6
|
+
"size" BIGINT NOT NULL,
|
|
7
|
+
"mimeType" TEXT NOT NULL,
|
|
8
|
+
"category" TEXT NOT NULL,
|
|
9
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
10
|
+
|
|
11
|
+
CONSTRAINT "UserFile_pkey" PRIMARY KEY ("id")
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
-- CreateIndex
|
|
15
|
+
CREATE INDEX "UserFile_userId_idx" ON "public"."UserFile"("userId");
|
|
16
|
+
|
|
17
|
+
-- CreateIndex
|
|
18
|
+
CREATE INDEX "UserFile_category_idx" ON "public"."UserFile"("category");
|
|
19
|
+
|
|
20
|
+
-- AddForeignKey
|
|
21
|
+
ALTER TABLE "public"."UserFile" ADD CONSTRAINT "UserFile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
package/prisma/schema.prisma
CHANGED
|
@@ -34,10 +34,18 @@ enum Status {
|
|
|
34
34
|
|
|
35
35
|
enum Plan {
|
|
36
36
|
free
|
|
37
|
+
starter
|
|
37
38
|
pro
|
|
39
|
+
business
|
|
38
40
|
enterprise
|
|
39
41
|
}
|
|
40
42
|
|
|
43
|
+
enum AuthType {
|
|
44
|
+
credentials
|
|
45
|
+
oauth
|
|
46
|
+
hybrid
|
|
47
|
+
}
|
|
48
|
+
|
|
41
49
|
enum MessageRole {
|
|
42
50
|
user
|
|
43
51
|
assistant
|
|
@@ -65,9 +73,12 @@ enum ReactionType {
|
|
|
65
73
|
/// ─────────────────────────────────────────────
|
|
66
74
|
|
|
67
75
|
model User {
|
|
68
|
-
id
|
|
69
|
-
name
|
|
70
|
-
|
|
76
|
+
id String @id @default(uuid())
|
|
77
|
+
name String
|
|
78
|
+
|
|
79
|
+
image String? // provider image
|
|
80
|
+
avatarOverrideUrl String?
|
|
81
|
+
|
|
71
82
|
email String @unique
|
|
72
83
|
password String?
|
|
73
84
|
emailVerified DateTime?
|
|
@@ -86,6 +97,13 @@ model User {
|
|
|
86
97
|
creditsUsed Int @default(0)
|
|
87
98
|
deletedAt DateTime?
|
|
88
99
|
|
|
100
|
+
authType AuthType @default(oauth)
|
|
101
|
+
|
|
102
|
+
passwordStrength String? // weak | medium | strong
|
|
103
|
+
|
|
104
|
+
storageUsed BigInt @default(0) // bytes
|
|
105
|
+
storageLimit BigInt @default(524288000) // 500 MB (beta)
|
|
106
|
+
|
|
89
107
|
accounts Account[]
|
|
90
108
|
integrations Integration[]
|
|
91
109
|
tokenTransactions TokenTransaction[]
|
|
@@ -99,13 +117,65 @@ model User {
|
|
|
99
117
|
Onboarding Onboarding?
|
|
100
118
|
ChatSession ChatSession[]
|
|
101
119
|
|
|
102
|
-
createdAt
|
|
103
|
-
updatedAt
|
|
104
|
-
posts
|
|
120
|
+
createdAt DateTime @default(now())
|
|
121
|
+
updatedAt DateTime @updatedAt
|
|
122
|
+
posts Post[]
|
|
123
|
+
userSessions UserSession[]
|
|
124
|
+
paymentMethods PaymentMethod[]
|
|
125
|
+
userEmails UserEmail[]
|
|
126
|
+
invoices Invoice[]
|
|
127
|
+
userFiles UserFile[]
|
|
105
128
|
|
|
106
129
|
@@index([status])
|
|
107
130
|
}
|
|
108
131
|
|
|
132
|
+
model UserFile {
|
|
133
|
+
id String @id @default(uuid())
|
|
134
|
+
userId String
|
|
135
|
+
|
|
136
|
+
path String // local path or CDN URL
|
|
137
|
+
size BigInt // bytes
|
|
138
|
+
mimeType String
|
|
139
|
+
category String // avatar | memory | export | attachment
|
|
140
|
+
|
|
141
|
+
createdAt DateTime @default(now())
|
|
142
|
+
|
|
143
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
144
|
+
|
|
145
|
+
@@index([userId])
|
|
146
|
+
@@index([category])
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
model UserSession {
|
|
150
|
+
id String @id @default(uuid())
|
|
151
|
+
userId String
|
|
152
|
+
ip String?
|
|
153
|
+
userAgent String?
|
|
154
|
+
lastUsed DateTime
|
|
155
|
+
|
|
156
|
+
revoked Boolean @default(false)
|
|
157
|
+
revokedAt DateTime?
|
|
158
|
+
|
|
159
|
+
expiresAt DateTime
|
|
160
|
+
createdAt DateTime @default(now())
|
|
161
|
+
|
|
162
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
163
|
+
|
|
164
|
+
@@index([userId])
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
model UserEmail {
|
|
168
|
+
id String @id @default(uuid())
|
|
169
|
+
userId String
|
|
170
|
+
email String @unique
|
|
171
|
+
verified Boolean @default(false)
|
|
172
|
+
primary Boolean @default(false)
|
|
173
|
+
type String? // billing | security | notifications
|
|
174
|
+
createdAt DateTime @default(now())
|
|
175
|
+
|
|
176
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
177
|
+
}
|
|
178
|
+
|
|
109
179
|
model Account {
|
|
110
180
|
id String @id @default(uuid())
|
|
111
181
|
userId String
|
|
@@ -261,14 +331,34 @@ model AIAgent {
|
|
|
261
331
|
ChatSession ChatSession[]
|
|
262
332
|
}
|
|
263
333
|
|
|
334
|
+
model UsageAggregate {
|
|
335
|
+
id String @id @default(uuid())
|
|
336
|
+
userId String
|
|
337
|
+
workspaceId String?
|
|
338
|
+
billingPeriod String
|
|
339
|
+
source String // chat | automation | api
|
|
340
|
+
tokensUsed Int
|
|
341
|
+
requestCount Int
|
|
342
|
+
updatedAt DateTime @updatedAt
|
|
343
|
+
|
|
344
|
+
@@unique([userId, workspaceId, billingPeriod, source])
|
|
345
|
+
}
|
|
346
|
+
|
|
264
347
|
model TokenTransaction {
|
|
265
|
-
id String
|
|
348
|
+
id String @id @default(uuid())
|
|
266
349
|
userId String
|
|
267
350
|
agentId String?
|
|
268
351
|
tokensUsed Int
|
|
269
352
|
action String
|
|
270
|
-
|
|
271
|
-
|
|
353
|
+
|
|
354
|
+
source String? // chat | automation | api
|
|
355
|
+
workspaceId String?
|
|
356
|
+
integration String?
|
|
357
|
+
|
|
358
|
+
billingPeriod String? // e.g. "2025-01" (YYYY-MM)
|
|
359
|
+
|
|
360
|
+
metadata Json?
|
|
361
|
+
createdAt DateTime @default(now())
|
|
272
362
|
|
|
273
363
|
user User @relation(fields: [userId], references: [id])
|
|
274
364
|
agent AIAgent? @relation(fields: [agentId], references: [id])
|
|
@@ -519,6 +609,19 @@ model AuditLog {
|
|
|
519
609
|
@@index([userId, createdAt])
|
|
520
610
|
}
|
|
521
611
|
|
|
612
|
+
model SecurityEvent {
|
|
613
|
+
id String @id @default(uuid())
|
|
614
|
+
userId String?
|
|
615
|
+
type String // login | logout | password_change | session_revoked
|
|
616
|
+
ip String?
|
|
617
|
+
userAgent String?
|
|
618
|
+
success Boolean
|
|
619
|
+
metadata Json?
|
|
620
|
+
createdAt DateTime @default(now())
|
|
621
|
+
|
|
622
|
+
@@index([userId, createdAt])
|
|
623
|
+
}
|
|
624
|
+
|
|
522
625
|
/// ─────────────────────────────────────────────
|
|
523
626
|
/// BILLING / WAITLIST / JOBS / ONBOARDING
|
|
524
627
|
/// ─────────────────────────────────────────────
|
|
@@ -527,13 +630,71 @@ model Subscription {
|
|
|
527
630
|
id String @id @default(uuid())
|
|
528
631
|
userId String
|
|
529
632
|
plan Plan
|
|
530
|
-
status String
|
|
633
|
+
status String // active | trialing | past_due | canceled
|
|
531
634
|
startedAt DateTime
|
|
532
635
|
endedAt DateTime?
|
|
533
636
|
nextPayment DateTime?
|
|
534
|
-
|
|
637
|
+
|
|
638
|
+
razorpayCustomerId String?
|
|
639
|
+
razorpaySubscriptionId String?
|
|
640
|
+
razorpayPlanId String?
|
|
641
|
+
|
|
642
|
+
metadata Json?
|
|
535
643
|
|
|
536
644
|
user User @relation(fields: [userId], references: [id])
|
|
645
|
+
|
|
646
|
+
@@index([razorpayCustomerId])
|
|
647
|
+
@@index([razorpaySubscriptionId])
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
model Invoice {
|
|
651
|
+
id String @id @default(uuid())
|
|
652
|
+
userId String
|
|
653
|
+
subscriptionId String?
|
|
654
|
+
razorpayInvoiceId String
|
|
655
|
+
amount Int
|
|
656
|
+
currency String
|
|
657
|
+
status String // paid | open | failed | refunded
|
|
658
|
+
periodStart DateTime
|
|
659
|
+
periodEnd DateTime
|
|
660
|
+
pdfUrl String?
|
|
661
|
+
metadata Json?
|
|
662
|
+
|
|
663
|
+
createdAt DateTime @default(now())
|
|
664
|
+
|
|
665
|
+
user User @relation(fields: [userId], references: [id])
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
model BillingEvent {
|
|
669
|
+
id String @id @default(uuid())
|
|
670
|
+
provider String // razorpay
|
|
671
|
+
|
|
672
|
+
eventType String
|
|
673
|
+
eventId String @unique // razorpay event ID
|
|
674
|
+
|
|
675
|
+
payload Json
|
|
676
|
+
processed Boolean @default(false)
|
|
677
|
+
createdAt DateTime @default(now())
|
|
678
|
+
|
|
679
|
+
@@index([provider, eventType])
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
model PaymentMethod {
|
|
683
|
+
id String @id @default(uuid())
|
|
684
|
+
userId String
|
|
685
|
+
provider String // razorpay | stripe | paypal
|
|
686
|
+
type String // card
|
|
687
|
+
brand String?
|
|
688
|
+
last4 String?
|
|
689
|
+
expMonth Int?
|
|
690
|
+
expYear Int?
|
|
691
|
+
isDefault Boolean @default(true)
|
|
692
|
+
metadata Json?
|
|
693
|
+
|
|
694
|
+
createdAt DateTime @default(now())
|
|
695
|
+
updatedAt DateTime @updatedAt
|
|
696
|
+
|
|
697
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
537
698
|
}
|
|
538
699
|
|
|
539
700
|
model WaitList {
|