@varaos/db 1.0.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 +12 -0
- package/prisma/migrations/20250723183101_init/migration.sql +77 -0
- package/prisma/migrations/20250729153007_add_integration_modal/migration.sql +25 -0
- package/prisma/migrations/20250802174848_add_onboarding_field_in_user_schema/migration.sql +2 -0
- package/prisma/migrations/20250805185410_add_workspace_ai_agents_and_enhancements/migration.sql +175 -0
- package/prisma/migrations/20250901084347_waitlist_added/migration.sql +18 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +271 -0
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "User" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"name" TEXT NOT NULL,
|
|
5
|
+
"image" TEXT,
|
|
6
|
+
"email" TEXT NOT NULL,
|
|
7
|
+
"password" TEXT,
|
|
8
|
+
"emailVerified" TIMESTAMP(3),
|
|
9
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
10
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
11
|
+
|
|
12
|
+
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
-- CreateTable
|
|
16
|
+
CREATE TABLE "Account" (
|
|
17
|
+
"id" TEXT NOT NULL,
|
|
18
|
+
"userId" TEXT NOT NULL,
|
|
19
|
+
"type" TEXT NOT NULL,
|
|
20
|
+
"provider" TEXT NOT NULL,
|
|
21
|
+
"providerAccountId" TEXT NOT NULL,
|
|
22
|
+
"refresh_token" TEXT,
|
|
23
|
+
"access_token" TEXT,
|
|
24
|
+
"expires_at" INTEGER,
|
|
25
|
+
"token_type" TEXT,
|
|
26
|
+
"scope" TEXT,
|
|
27
|
+
"id_token" TEXT,
|
|
28
|
+
"session_state" TEXT,
|
|
29
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
30
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
31
|
+
|
|
32
|
+
CONSTRAINT "Account_pkey" PRIMARY KEY ("id")
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
-- CreateTable
|
|
36
|
+
CREATE TABLE "VerificationToken" (
|
|
37
|
+
"id" TEXT NOT NULL,
|
|
38
|
+
"email" TEXT NOT NULL,
|
|
39
|
+
"token" TEXT NOT NULL,
|
|
40
|
+
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
41
|
+
|
|
42
|
+
CONSTRAINT "VerificationToken_pkey" PRIMARY KEY ("id")
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
-- CreateTable
|
|
46
|
+
CREATE TABLE "PasswordResetToken" (
|
|
47
|
+
"id" TEXT NOT NULL,
|
|
48
|
+
"email" TEXT NOT NULL,
|
|
49
|
+
"token" TEXT NOT NULL,
|
|
50
|
+
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
51
|
+
|
|
52
|
+
CONSTRAINT "PasswordResetToken_pkey" PRIMARY KEY ("id")
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
-- CreateIndex
|
|
56
|
+
CREATE UNIQUE INDEX "User_id_key" ON "User"("id");
|
|
57
|
+
|
|
58
|
+
-- CreateIndex
|
|
59
|
+
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
60
|
+
|
|
61
|
+
-- CreateIndex
|
|
62
|
+
CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId");
|
|
63
|
+
|
|
64
|
+
-- CreateIndex
|
|
65
|
+
CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
|
|
66
|
+
|
|
67
|
+
-- CreateIndex
|
|
68
|
+
CREATE UNIQUE INDEX "VerificationToken_email_token_key" ON "VerificationToken"("email", "token");
|
|
69
|
+
|
|
70
|
+
-- CreateIndex
|
|
71
|
+
CREATE UNIQUE INDEX "PasswordResetToken_token_key" ON "PasswordResetToken"("token");
|
|
72
|
+
|
|
73
|
+
-- CreateIndex
|
|
74
|
+
CREATE UNIQUE INDEX "PasswordResetToken_email_token_key" ON "PasswordResetToken"("email", "token");
|
|
75
|
+
|
|
76
|
+
-- AddForeignKey
|
|
77
|
+
ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "public"."integrations" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"userId" TEXT NOT NULL,
|
|
5
|
+
"provider" TEXT NOT NULL,
|
|
6
|
+
"providerAccountId" TEXT NOT NULL,
|
|
7
|
+
"integration" TEXT NOT NULL,
|
|
8
|
+
"accessToken" TEXT NOT NULL,
|
|
9
|
+
"refreshToken" TEXT,
|
|
10
|
+
"expiresAt" TIMESTAMP(3),
|
|
11
|
+
"scopes" JSONB NOT NULL,
|
|
12
|
+
"profile" JSONB NOT NULL,
|
|
13
|
+
"status" TEXT NOT NULL DEFAULT 'active',
|
|
14
|
+
"metadata" JSONB,
|
|
15
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
16
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
17
|
+
|
|
18
|
+
CONSTRAINT "integrations_pkey" PRIMARY KEY ("id")
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
-- CreateIndex
|
|
22
|
+
CREATE UNIQUE INDEX "integrations_userId_provider_integration_key" ON "public"."integrations"("userId", "provider", "integration");
|
|
23
|
+
|
|
24
|
+
-- AddForeignKey
|
|
25
|
+
ALTER TABLE "public"."integrations" ADD CONSTRAINT "integrations_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
package/prisma/migrations/20250805185410_add_workspace_ai_agents_and_enhancements/migration.sql
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- The `status` column on the `integrations` table would be dropped and recreated. This will lead to data loss if there is data in the column.
|
|
5
|
+
- A unique constraint covering the columns `[userId,provider,integration,workspaceId]` on the table `integrations` will be added. If there are existing duplicate values, this will fail.
|
|
6
|
+
|
|
7
|
+
*/
|
|
8
|
+
-- CreateEnum
|
|
9
|
+
CREATE TYPE "Role" AS ENUM ('user', 'support', 'business', 'superadmin', 'moderator', 'admin');
|
|
10
|
+
|
|
11
|
+
-- CreateEnum
|
|
12
|
+
CREATE TYPE "Status" AS ENUM ('active', 'suspended', 'deleted');
|
|
13
|
+
|
|
14
|
+
-- CreateEnum
|
|
15
|
+
CREATE TYPE "Plan" AS ENUM ('free', 'pro', 'enterprise');
|
|
16
|
+
|
|
17
|
+
-- DropIndex
|
|
18
|
+
DROP INDEX "User_id_key";
|
|
19
|
+
|
|
20
|
+
-- DropIndex
|
|
21
|
+
DROP INDEX "integrations_userId_provider_integration_key";
|
|
22
|
+
|
|
23
|
+
-- AlterTable
|
|
24
|
+
ALTER TABLE "User" ADD COLUMN "creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
25
|
+
ADD COLUMN "defaultWorkspaceId" TEXT,
|
|
26
|
+
ADD COLUMN "deletedAt" TIMESTAMP(3),
|
|
27
|
+
ADD COLUMN "language" TEXT,
|
|
28
|
+
ADD COLUMN "lastLogin" TIMESTAMP(3),
|
|
29
|
+
ADD COLUMN "lastPasswordChange" TIMESTAMP(3),
|
|
30
|
+
ADD COLUMN "metadata" JSONB,
|
|
31
|
+
ADD COLUMN "plan" "Plan" NOT NULL DEFAULT 'free',
|
|
32
|
+
ADD COLUMN "role" "Role" NOT NULL DEFAULT 'user',
|
|
33
|
+
ADD COLUMN "status" "Status" NOT NULL DEFAULT 'active',
|
|
34
|
+
ADD COLUMN "timezone" TEXT,
|
|
35
|
+
ADD COLUMN "tokenBalance" INTEGER NOT NULL DEFAULT 0,
|
|
36
|
+
ADD COLUMN "twoFactorEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
37
|
+
ADD COLUMN "twoFactorSecret" TEXT;
|
|
38
|
+
|
|
39
|
+
-- AlterTable
|
|
40
|
+
ALTER TABLE "integrations" ADD COLUMN "deletedAt" TIMESTAMP(3),
|
|
41
|
+
ADD COLUMN "workspaceId" TEXT,
|
|
42
|
+
DROP COLUMN "status",
|
|
43
|
+
ADD COLUMN "status" "Status" NOT NULL DEFAULT 'active';
|
|
44
|
+
|
|
45
|
+
-- CreateTable
|
|
46
|
+
CREATE TABLE "Workspace" (
|
|
47
|
+
"id" TEXT NOT NULL,
|
|
48
|
+
"name" TEXT NOT NULL,
|
|
49
|
+
"description" TEXT,
|
|
50
|
+
"ownerId" TEXT NOT NULL,
|
|
51
|
+
"status" "Status" NOT NULL DEFAULT 'active',
|
|
52
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
53
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
54
|
+
|
|
55
|
+
CONSTRAINT "Workspace_pkey" PRIMARY KEY ("id")
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
-- CreateTable
|
|
59
|
+
CREATE TABLE "integration_catalog" (
|
|
60
|
+
"id" TEXT NOT NULL,
|
|
61
|
+
"provider" TEXT NOT NULL,
|
|
62
|
+
"integration" TEXT NOT NULL,
|
|
63
|
+
"name" TEXT NOT NULL,
|
|
64
|
+
"showDuringOnboarding" BOOLEAN NOT NULL DEFAULT true,
|
|
65
|
+
"default" BOOLEAN NOT NULL DEFAULT false,
|
|
66
|
+
"iconUrl" TEXT,
|
|
67
|
+
"description" TEXT,
|
|
68
|
+
"docsUrl" TEXT,
|
|
69
|
+
"status" "Status" NOT NULL DEFAULT 'active',
|
|
70
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
71
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
72
|
+
|
|
73
|
+
CONSTRAINT "integration_catalog_pkey" PRIMARY KEY ("id")
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
-- CreateTable
|
|
77
|
+
CREATE TABLE "IntegrationSyncLog" (
|
|
78
|
+
"id" TEXT NOT NULL,
|
|
79
|
+
"integrationId" TEXT NOT NULL,
|
|
80
|
+
"syncStatus" TEXT NOT NULL,
|
|
81
|
+
"errorMessage" TEXT,
|
|
82
|
+
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
83
|
+
|
|
84
|
+
CONSTRAINT "IntegrationSyncLog_pkey" PRIMARY KEY ("id")
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
-- CreateTable
|
|
88
|
+
CREATE TABLE "AIAgent" (
|
|
89
|
+
"id" TEXT NOT NULL,
|
|
90
|
+
"name" TEXT NOT NULL,
|
|
91
|
+
"key" TEXT NOT NULL,
|
|
92
|
+
"description" TEXT,
|
|
93
|
+
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
94
|
+
"config" JSONB,
|
|
95
|
+
"workspaceId" TEXT,
|
|
96
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
97
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
98
|
+
|
|
99
|
+
CONSTRAINT "AIAgent_pkey" PRIMARY KEY ("id")
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
-- CreateTable
|
|
103
|
+
CREATE TABLE "TokenTransaction" (
|
|
104
|
+
"id" TEXT NOT NULL,
|
|
105
|
+
"userId" TEXT NOT NULL,
|
|
106
|
+
"agentId" TEXT,
|
|
107
|
+
"tokensUsed" INTEGER NOT NULL,
|
|
108
|
+
"action" TEXT NOT NULL,
|
|
109
|
+
"metadata" JSONB,
|
|
110
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
111
|
+
|
|
112
|
+
CONSTRAINT "TokenTransaction_pkey" PRIMARY KEY ("id")
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
-- CreateTable
|
|
116
|
+
CREATE TABLE "AuditLog" (
|
|
117
|
+
"id" TEXT NOT NULL,
|
|
118
|
+
"userId" TEXT,
|
|
119
|
+
"eventType" TEXT NOT NULL,
|
|
120
|
+
"description" TEXT,
|
|
121
|
+
"metadata" JSONB,
|
|
122
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
123
|
+
|
|
124
|
+
CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id")
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
-- CreateTable
|
|
128
|
+
CREATE TABLE "Subscription" (
|
|
129
|
+
"id" TEXT NOT NULL,
|
|
130
|
+
"userId" TEXT NOT NULL,
|
|
131
|
+
"plan" "Plan" NOT NULL,
|
|
132
|
+
"status" TEXT NOT NULL,
|
|
133
|
+
"startedAt" TIMESTAMP(3) NOT NULL,
|
|
134
|
+
"endedAt" TIMESTAMP(3),
|
|
135
|
+
"nextPayment" TIMESTAMP(3),
|
|
136
|
+
"metadata" JSONB,
|
|
137
|
+
|
|
138
|
+
CONSTRAINT "Subscription_pkey" PRIMARY KEY ("id")
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
-- CreateIndex
|
|
142
|
+
CREATE UNIQUE INDEX "Workspace_ownerId_key" ON "Workspace"("ownerId");
|
|
143
|
+
|
|
144
|
+
-- CreateIndex
|
|
145
|
+
CREATE UNIQUE INDEX "integration_catalog_provider_integration_key" ON "integration_catalog"("provider", "integration");
|
|
146
|
+
|
|
147
|
+
-- CreateIndex
|
|
148
|
+
CREATE UNIQUE INDEX "AIAgent_key_key" ON "AIAgent"("key");
|
|
149
|
+
|
|
150
|
+
-- CreateIndex
|
|
151
|
+
CREATE UNIQUE INDEX "integrations_userId_provider_integration_workspaceId_key" ON "integrations"("userId", "provider", "integration", "workspaceId");
|
|
152
|
+
|
|
153
|
+
-- AddForeignKey
|
|
154
|
+
ALTER TABLE "Workspace" ADD CONSTRAINT "Workspace_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
155
|
+
|
|
156
|
+
-- AddForeignKey
|
|
157
|
+
ALTER TABLE "integrations" ADD CONSTRAINT "integrations_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
158
|
+
|
|
159
|
+
-- AddForeignKey
|
|
160
|
+
ALTER TABLE "IntegrationSyncLog" ADD CONSTRAINT "IntegrationSyncLog_integrationId_fkey" FOREIGN KEY ("integrationId") REFERENCES "integrations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
161
|
+
|
|
162
|
+
-- AddForeignKey
|
|
163
|
+
ALTER TABLE "AIAgent" ADD CONSTRAINT "AIAgent_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
164
|
+
|
|
165
|
+
-- AddForeignKey
|
|
166
|
+
ALTER TABLE "TokenTransaction" ADD CONSTRAINT "TokenTransaction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
167
|
+
|
|
168
|
+
-- AddForeignKey
|
|
169
|
+
ALTER TABLE "TokenTransaction" ADD CONSTRAINT "TokenTransaction_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "AIAgent"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
170
|
+
|
|
171
|
+
-- AddForeignKey
|
|
172
|
+
ALTER TABLE "AuditLog" ADD CONSTRAINT "AuditLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
173
|
+
|
|
174
|
+
-- AddForeignKey
|
|
175
|
+
ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "public"."WaitList" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"email" TEXT NOT NULL,
|
|
5
|
+
"name" TEXT,
|
|
6
|
+
"company" TEXT,
|
|
7
|
+
"role" TEXT,
|
|
8
|
+
"teamSize" TEXT,
|
|
9
|
+
"useCase" TEXT,
|
|
10
|
+
"consentToUpdates" BOOLEAN NOT NULL,
|
|
11
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
12
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
13
|
+
|
|
14
|
+
CONSTRAINT "WaitList_pkey" PRIMARY KEY ("id")
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
-- CreateIndex
|
|
18
|
+
CREATE UNIQUE INDEX "WaitList_email_key" ON "public"."WaitList"("email");
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client-js"
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
datasource db {
|
|
6
|
+
provider = "postgresql"
|
|
7
|
+
url = env("DATABASE_URL")
|
|
8
|
+
directUrl = env("DIRECT_URL")
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/// User roles, scoped globally and workspace-wise if needed
|
|
12
|
+
enum Role {
|
|
13
|
+
user
|
|
14
|
+
support
|
|
15
|
+
business
|
|
16
|
+
superadmin
|
|
17
|
+
moderator
|
|
18
|
+
admin
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// Status enums for consistent use
|
|
22
|
+
enum Status {
|
|
23
|
+
active
|
|
24
|
+
suspended
|
|
25
|
+
deleted
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// Subscription plans
|
|
29
|
+
enum Plan {
|
|
30
|
+
free
|
|
31
|
+
pro
|
|
32
|
+
enterprise
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// Workspaces represent shared AI work environments
|
|
36
|
+
model Workspace {
|
|
37
|
+
id String @id @default(uuid())
|
|
38
|
+
name String
|
|
39
|
+
description String?
|
|
40
|
+
ownerId String @unique // Add UNIQUE here for one-to-one relation
|
|
41
|
+
status Status @default(active)
|
|
42
|
+
|
|
43
|
+
createdAt DateTime @default(now())
|
|
44
|
+
updatedAt DateTime @updatedAt
|
|
45
|
+
|
|
46
|
+
owner User @relation(fields: [ownerId], references: [id]) // defining side
|
|
47
|
+
integrations Integration[]
|
|
48
|
+
aiAgents AIAgent[]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
model User {
|
|
52
|
+
id String @id @default(uuid())
|
|
53
|
+
|
|
54
|
+
name String
|
|
55
|
+
image String?
|
|
56
|
+
|
|
57
|
+
email String @unique
|
|
58
|
+
|
|
59
|
+
password String?
|
|
60
|
+
|
|
61
|
+
emailVerified DateTime?
|
|
62
|
+
|
|
63
|
+
onboarding DateTime?
|
|
64
|
+
|
|
65
|
+
role Role @default(user)
|
|
66
|
+
|
|
67
|
+
timezone String?
|
|
68
|
+
language String?
|
|
69
|
+
|
|
70
|
+
status Status @default(active)
|
|
71
|
+
|
|
72
|
+
lastLogin DateTime?
|
|
73
|
+
lastPasswordChange DateTime?
|
|
74
|
+
twoFactorEnabled Boolean @default(false)
|
|
75
|
+
twoFactorSecret String?
|
|
76
|
+
|
|
77
|
+
metadata Json?
|
|
78
|
+
|
|
79
|
+
plan Plan @default(free)
|
|
80
|
+
tokenBalance Int @default(0)
|
|
81
|
+
creditsUsed Int @default(0)
|
|
82
|
+
|
|
83
|
+
accounts Account[]
|
|
84
|
+
integrations Integration[]
|
|
85
|
+
tokenTransactions TokenTransaction[]
|
|
86
|
+
auditLogs AuditLog[]
|
|
87
|
+
subscriptions Subscription[]
|
|
88
|
+
|
|
89
|
+
defaultWorkspaceId String?
|
|
90
|
+
|
|
91
|
+
// Inverse side of relation, no fields or references here!
|
|
92
|
+
defaultWorkspace Workspace? @relation()
|
|
93
|
+
|
|
94
|
+
createdAt DateTime @default(now())
|
|
95
|
+
updatedAt DateTime @updatedAt
|
|
96
|
+
deletedAt DateTime?
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/// OAuth or other third-party accounts linked to user
|
|
100
|
+
model Account {
|
|
101
|
+
id String @id @default(uuid())
|
|
102
|
+
userId String
|
|
103
|
+
type String
|
|
104
|
+
provider String
|
|
105
|
+
providerAccountId String
|
|
106
|
+
refresh_token String? @db.Text
|
|
107
|
+
access_token String? @db.Text
|
|
108
|
+
expires_at Int?
|
|
109
|
+
token_type String?
|
|
110
|
+
scope String?
|
|
111
|
+
id_token String? @db.Text
|
|
112
|
+
session_state String?
|
|
113
|
+
|
|
114
|
+
createdAt DateTime @default(now())
|
|
115
|
+
updatedAt DateTime @updatedAt
|
|
116
|
+
|
|
117
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
118
|
+
|
|
119
|
+
@@unique([provider, providerAccountId])
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/// Email verification tokens for account security
|
|
123
|
+
model VerificationToken {
|
|
124
|
+
id String @id @default(uuid())
|
|
125
|
+
email String
|
|
126
|
+
token String @unique
|
|
127
|
+
expiresAt DateTime
|
|
128
|
+
|
|
129
|
+
@@unique([email, token])
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// Password reset tokens
|
|
133
|
+
model PasswordResetToken {
|
|
134
|
+
id String @id @default(uuid())
|
|
135
|
+
email String
|
|
136
|
+
token String @unique
|
|
137
|
+
expiresAt DateTime
|
|
138
|
+
|
|
139
|
+
@@unique([email, token])
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/// User’s connected integrations scoped optionally by workspace
|
|
143
|
+
model Integration {
|
|
144
|
+
id String @id @default(cuid())
|
|
145
|
+
userId String
|
|
146
|
+
workspaceId String? // optional workspace scoping
|
|
147
|
+
provider String // e.g. 'google'
|
|
148
|
+
providerAccountId String // Unique provider account user id
|
|
149
|
+
integration String // e.g. 'gmail'
|
|
150
|
+
accessToken String // encrypted
|
|
151
|
+
refreshToken String? // encrypted
|
|
152
|
+
expiresAt DateTime?
|
|
153
|
+
scopes Json // OAuth scopes granted
|
|
154
|
+
profile Json // profile info
|
|
155
|
+
status Status @default(active)
|
|
156
|
+
metadata Json? // extra, e.g. connectedAt, nonce
|
|
157
|
+
|
|
158
|
+
createdAt DateTime @default(now())
|
|
159
|
+
updatedAt DateTime @updatedAt
|
|
160
|
+
deletedAt DateTime?
|
|
161
|
+
|
|
162
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
163
|
+
workspace Workspace? @relation(fields: [workspaceId], references: [id])
|
|
164
|
+
integrationSyncLog IntegrationSyncLog[]
|
|
165
|
+
|
|
166
|
+
@@unique([userId, provider, integration, workspaceId], name: "user_provider_integration_workspace")
|
|
167
|
+
@@map("integrations")
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// Master list of officially supported integrations/tools
|
|
171
|
+
model IntegrationCatalog {
|
|
172
|
+
id String @id @default(uuid())
|
|
173
|
+
provider String
|
|
174
|
+
integration String
|
|
175
|
+
name String
|
|
176
|
+
showDuringOnboarding Boolean @default(true)
|
|
177
|
+
default Boolean @default(false)
|
|
178
|
+
iconUrl String?
|
|
179
|
+
description String?
|
|
180
|
+
docsUrl String?
|
|
181
|
+
status Status @default(active)
|
|
182
|
+
|
|
183
|
+
createdAt DateTime @default(now())
|
|
184
|
+
updatedAt DateTime @updatedAt
|
|
185
|
+
|
|
186
|
+
@@unique([provider, integration])
|
|
187
|
+
@@map("integration_catalog")
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/// Log of sync activity for integrations
|
|
191
|
+
model IntegrationSyncLog {
|
|
192
|
+
id String @id @default(uuid())
|
|
193
|
+
integrationId String
|
|
194
|
+
syncStatus String // e.g. 'success', 'error', 'pending'
|
|
195
|
+
errorMessage String?
|
|
196
|
+
timestamp DateTime @default(now())
|
|
197
|
+
|
|
198
|
+
integration Integration @relation(fields: [integrationId], references: [id])
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/// Represents AI agents your platform offers
|
|
202
|
+
model AIAgent {
|
|
203
|
+
id String @id @default(uuid())
|
|
204
|
+
name String
|
|
205
|
+
key String @unique
|
|
206
|
+
description String?
|
|
207
|
+
active Boolean @default(true)
|
|
208
|
+
config Json? // JSON spec for agent config
|
|
209
|
+
|
|
210
|
+
workspaceId String? // scoped to workspace if applicable
|
|
211
|
+
workspace Workspace? @relation(fields: [workspaceId], references: [id])
|
|
212
|
+
|
|
213
|
+
createdAt DateTime @default(now())
|
|
214
|
+
updatedAt DateTime @updatedAt
|
|
215
|
+
|
|
216
|
+
tokenTransactions TokenTransaction[]
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/// Tracks per-user AI token usage and actions
|
|
220
|
+
model TokenTransaction {
|
|
221
|
+
id String @id @default(uuid())
|
|
222
|
+
userId String
|
|
223
|
+
agentId String?
|
|
224
|
+
tokensUsed Int
|
|
225
|
+
action String // descriptive action name, e.g. "code_generation"
|
|
226
|
+
metadata Json?
|
|
227
|
+
createdAt DateTime @default(now())
|
|
228
|
+
|
|
229
|
+
user User @relation(fields: [userId], references: [id])
|
|
230
|
+
agent AIAgent? @relation(fields: [agentId], references: [id])
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/// Security and system audit logs
|
|
234
|
+
model AuditLog {
|
|
235
|
+
id String @id @default(uuid())
|
|
236
|
+
userId String? // null if system-wide event
|
|
237
|
+
eventType String
|
|
238
|
+
description String?
|
|
239
|
+
metadata Json?
|
|
240
|
+
createdAt DateTime @default(now())
|
|
241
|
+
|
|
242
|
+
user User? @relation(fields: [userId], references: [id])
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/// User subscription and billing information
|
|
246
|
+
model Subscription {
|
|
247
|
+
id String @id @default(uuid())
|
|
248
|
+
userId String
|
|
249
|
+
plan Plan
|
|
250
|
+
status String // e.g. 'active', 'canceled', 'trialing'
|
|
251
|
+
startedAt DateTime
|
|
252
|
+
endedAt DateTime?
|
|
253
|
+
nextPayment DateTime?
|
|
254
|
+
metadata Json?
|
|
255
|
+
|
|
256
|
+
user User @relation(fields: [userId], references: [id])
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
model WaitList {
|
|
260
|
+
id String @id @default(uuid())
|
|
261
|
+
email String @unique
|
|
262
|
+
name String?
|
|
263
|
+
company String?
|
|
264
|
+
role String?
|
|
265
|
+
teamSize String?
|
|
266
|
+
useCase String?
|
|
267
|
+
consentToUpdates Boolean
|
|
268
|
+
|
|
269
|
+
createdAt DateTime @default(now())
|
|
270
|
+
updatedAt DateTime @updatedAt
|
|
271
|
+
}
|