Skip to content

Commit 824fa3b

Browse files
feat(database): add migrations and idempotent seed data
1 parent ee13e63 commit 824fa3b

5 files changed

Lines changed: 557 additions & 1 deletion

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"db:migrate": "turbo db:migrate --filter=@veridion/database",
5252
"db:push": "turbo db:push --filter=@veridion/database",
5353
"db:seed": "turbo db:seed --filter=@veridion/database",
54+
"db:reset": "turbo db:reset --filter=@veridion/database",
5455
"db:studio": "turbo db:studio --filter=@veridion/database",
5556
"prepare": "husky || true",
5657
"commitlint": "commitlint --edit",

packages/database/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616
"db:generate": "npx prisma generate",
1717
"db:migrate": "prisma migrate dev",
1818
"db:push": "prisma db push",
19-
"db:seed": "tsx prisma/seed.ts",
19+
"db:seed": "prisma generate && tsx prisma/seed.ts",
20+
"db:reset": "prisma migrate reset --force",
2021
"db:studio": "prisma studio"
2122
},
23+
"prisma": {
24+
"seed": "prisma generate && tsx prisma/seed.ts"
25+
},
2226
"dependencies": {
2327
"@prisma/client": "^5.14.0"
2428
},
Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,311 @@
1+
-- CreateTable
2+
CREATE TABLE "User" (
3+
"id" TEXT NOT NULL,
4+
"email" TEXT NOT NULL,
5+
"passwordHash" TEXT NOT NULL,
6+
"displayName" TEXT,
7+
"avatarUrl" TEXT,
8+
"walletAddress" TEXT,
9+
"role" TEXT NOT NULL DEFAULT 'USER',
10+
"isActive" BOOLEAN NOT NULL DEFAULT true,
11+
"lastLoginAt" TIMESTAMP(3),
12+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
13+
"updatedAt" TIMESTAMP(3) NOT NULL,
14+
15+
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
16+
);
17+
18+
-- CreateTable
19+
CREATE TABLE "Session" (
20+
"id" TEXT NOT NULL,
21+
"userId" TEXT NOT NULL,
22+
"token" TEXT NOT NULL,
23+
"refreshToken" TEXT NOT NULL,
24+
"expiresAt" TIMESTAMP(3) NOT NULL,
25+
"ipAddress" TEXT,
26+
"userAgent" TEXT,
27+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
28+
29+
CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
30+
);
31+
32+
-- CreateTable
33+
CREATE TABLE "ApiKey" (
34+
"id" TEXT NOT NULL,
35+
"userId" TEXT NOT NULL,
36+
"name" TEXT NOT NULL,
37+
"key" TEXT NOT NULL,
38+
"permissions" TEXT[],
39+
"lastUsedAt" TIMESTAMP(3),
40+
"expiresAt" TIMESTAMP(3),
41+
"isActive" BOOLEAN NOT NULL DEFAULT true,
42+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
43+
44+
CONSTRAINT "ApiKey_pkey" PRIMARY KEY ("id")
45+
);
46+
47+
-- CreateTable
48+
CREATE TABLE "Organization" (
49+
"id" TEXT NOT NULL,
50+
"name" TEXT NOT NULL,
51+
"slug" TEXT NOT NULL,
52+
"description" TEXT,
53+
"logoUrl" TEXT,
54+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
55+
"updatedAt" TIMESTAMP(3) NOT NULL,
56+
57+
CONSTRAINT "Organization_pkey" PRIMARY KEY ("id")
58+
);
59+
60+
-- CreateTable
61+
CREATE TABLE "OrganizationMember" (
62+
"id" TEXT NOT NULL,
63+
"userId" TEXT NOT NULL,
64+
"organizationId" TEXT NOT NULL,
65+
"role" TEXT NOT NULL DEFAULT 'MEMBER',
66+
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
67+
68+
CONSTRAINT "OrganizationMember_pkey" PRIMARY KEY ("id")
69+
);
70+
71+
-- CreateTable
72+
CREATE TABLE "Project" (
73+
"id" TEXT NOT NULL,
74+
"name" TEXT NOT NULL,
75+
"description" TEXT,
76+
"repoUrl" TEXT,
77+
"chain" TEXT NOT NULL,
78+
"language" TEXT NOT NULL,
79+
"userId" TEXT NOT NULL,
80+
"organizationId" TEXT,
81+
"contractCount" INTEGER NOT NULL DEFAULT 0,
82+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
83+
"updatedAt" TIMESTAMP(3) NOT NULL,
84+
85+
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
86+
);
87+
88+
-- CreateTable
89+
CREATE TABLE "Contract" (
90+
"id" TEXT NOT NULL,
91+
"projectId" TEXT NOT NULL,
92+
"name" TEXT NOT NULL,
93+
"filePath" TEXT NOT NULL,
94+
"sourceCode" TEXT NOT NULL,
95+
"language" TEXT NOT NULL,
96+
"compilerVersion" TEXT,
97+
"hash" TEXT NOT NULL,
98+
"lineCount" INTEGER NOT NULL DEFAULT 0,
99+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
100+
"updatedAt" TIMESTAMP(3) NOT NULL,
101+
102+
CONSTRAINT "Contract_pkey" PRIMARY KEY ("id")
103+
);
104+
105+
-- CreateTable
106+
CREATE TABLE "Audit" (
107+
"id" TEXT NOT NULL,
108+
"projectId" TEXT NOT NULL,
109+
"status" TEXT NOT NULL DEFAULT 'PENDING',
110+
"commitHash" TEXT,
111+
"securityScore" INTEGER,
112+
"reportHash" TEXT,
113+
"reportUrl" TEXT,
114+
"transactionHash" TEXT,
115+
"chainStatus" TEXT,
116+
"startedAt" TIMESTAMP(3),
117+
"completedAt" TIMESTAMP(3),
118+
"error" TEXT,
119+
"metadata" JSONB,
120+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
121+
"updatedAt" TIMESTAMP(3) NOT NULL,
122+
123+
CONSTRAINT "Audit_pkey" PRIMARY KEY ("id")
124+
);
125+
126+
-- CreateTable
127+
CREATE TABLE "AuditFinding" (
128+
"id" TEXT NOT NULL,
129+
"auditId" TEXT NOT NULL,
130+
"pluginId" TEXT NOT NULL,
131+
"title" TEXT NOT NULL,
132+
"description" TEXT NOT NULL,
133+
"severity" TEXT NOT NULL,
134+
"filePath" TEXT NOT NULL,
135+
"lineStart" INTEGER NOT NULL,
136+
"lineEnd" INTEGER NOT NULL,
137+
"codeSnippet" TEXT,
138+
"recommendation" TEXT,
139+
"aiSummary" TEXT,
140+
"confidence" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
141+
"references" JSONB,
142+
"status" TEXT NOT NULL DEFAULT 'OPEN',
143+
"assignedToId" TEXT,
144+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
145+
"updatedAt" TIMESTAMP(3) NOT NULL,
146+
147+
CONSTRAINT "AuditFinding_pkey" PRIMARY KEY ("id")
148+
);
149+
150+
-- CreateTable
151+
CREATE TABLE "ScannerPlugin" (
152+
"id" TEXT NOT NULL,
153+
"name" TEXT NOT NULL,
154+
"displayName" TEXT NOT NULL,
155+
"version" TEXT NOT NULL,
156+
"description" TEXT NOT NULL,
157+
"severity" TEXT NOT NULL,
158+
"category" TEXT NOT NULL,
159+
"chains" TEXT[],
160+
"languages" TEXT[],
161+
"tags" TEXT[],
162+
"isEnabled" BOOLEAN NOT NULL DEFAULT true,
163+
"config" JSONB,
164+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
165+
"updatedAt" TIMESTAMP(3) NOT NULL,
166+
167+
CONSTRAINT "ScannerPlugin_pkey" PRIMARY KEY ("id")
168+
);
169+
170+
-- CreateTable
171+
CREATE TABLE "Notification" (
172+
"id" TEXT NOT NULL,
173+
"userId" TEXT NOT NULL,
174+
"title" TEXT NOT NULL,
175+
"message" TEXT NOT NULL,
176+
"type" TEXT NOT NULL DEFAULT 'INFO',
177+
"read" BOOLEAN NOT NULL DEFAULT false,
178+
"link" TEXT,
179+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
180+
181+
CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
182+
);
183+
184+
-- CreateTable
185+
CREATE TABLE "AuditLog" (
186+
"id" TEXT NOT NULL,
187+
"userId" TEXT,
188+
"action" TEXT NOT NULL,
189+
"entityType" TEXT NOT NULL,
190+
"entityId" TEXT NOT NULL,
191+
"metadata" JSONB,
192+
"ipAddress" TEXT,
193+
"userAgent" TEXT,
194+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
195+
196+
CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id")
197+
);
198+
199+
-- CreateIndex
200+
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
201+
202+
-- CreateIndex
203+
CREATE INDEX "User_email_idx" ON "User"("email");
204+
205+
-- CreateIndex
206+
CREATE INDEX "User_walletAddress_idx" ON "User"("walletAddress");
207+
208+
-- CreateIndex
209+
CREATE UNIQUE INDEX "Session_token_key" ON "Session"("token");
210+
211+
-- CreateIndex
212+
CREATE UNIQUE INDEX "Session_refreshToken_key" ON "Session"("refreshToken");
213+
214+
-- CreateIndex
215+
CREATE INDEX "Session_userId_idx" ON "Session"("userId");
216+
217+
-- CreateIndex
218+
CREATE INDEX "Session_token_idx" ON "Session"("token");
219+
220+
-- CreateIndex
221+
CREATE UNIQUE INDEX "ApiKey_key_key" ON "ApiKey"("key");
222+
223+
-- CreateIndex
224+
CREATE INDEX "ApiKey_userId_idx" ON "ApiKey"("userId");
225+
226+
-- CreateIndex
227+
CREATE INDEX "ApiKey_key_idx" ON "ApiKey"("key");
228+
229+
-- CreateIndex
230+
CREATE UNIQUE INDEX "Organization_slug_key" ON "Organization"("slug");
231+
232+
-- CreateIndex
233+
CREATE INDEX "OrganizationMember_organizationId_idx" ON "OrganizationMember"("organizationId");
234+
235+
-- CreateIndex
236+
CREATE UNIQUE INDEX "OrganizationMember_userId_organizationId_key" ON "OrganizationMember"("userId", "organizationId");
237+
238+
-- CreateIndex
239+
CREATE INDEX "Project_userId_idx" ON "Project"("userId");
240+
241+
-- CreateIndex
242+
CREATE INDEX "Project_organizationId_idx" ON "Project"("organizationId");
243+
244+
-- CreateIndex
245+
CREATE INDEX "Contract_projectId_idx" ON "Contract"("projectId");
246+
247+
-- CreateIndex
248+
CREATE INDEX "Contract_hash_idx" ON "Contract"("hash");
249+
250+
-- CreateIndex
251+
CREATE INDEX "Audit_projectId_idx" ON "Audit"("projectId");
252+
253+
-- CreateIndex
254+
CREATE INDEX "Audit_status_idx" ON "Audit"("status");
255+
256+
-- CreateIndex
257+
CREATE INDEX "AuditFinding_auditId_idx" ON "AuditFinding"("auditId");
258+
259+
-- CreateIndex
260+
CREATE INDEX "AuditFinding_pluginId_idx" ON "AuditFinding"("pluginId");
261+
262+
-- CreateIndex
263+
CREATE INDEX "AuditFinding_severity_idx" ON "AuditFinding"("severity");
264+
265+
-- CreateIndex
266+
CREATE UNIQUE INDEX "ScannerPlugin_name_key" ON "ScannerPlugin"("name");
267+
268+
-- CreateIndex
269+
CREATE INDEX "Notification_userId_read_idx" ON "Notification"("userId", "read");
270+
271+
-- CreateIndex
272+
CREATE INDEX "AuditLog_entityType_entityId_idx" ON "AuditLog"("entityType", "entityId");
273+
274+
-- CreateIndex
275+
CREATE INDEX "AuditLog_action_idx" ON "AuditLog"("action");
276+
277+
-- CreateIndex
278+
CREATE INDEX "AuditLog_createdAt_idx" ON "AuditLog"("createdAt");
279+
280+
-- AddForeignKey
281+
ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
282+
283+
-- AddForeignKey
284+
ALTER TABLE "ApiKey" ADD CONSTRAINT "ApiKey_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
285+
286+
-- AddForeignKey
287+
ALTER TABLE "OrganizationMember" ADD CONSTRAINT "OrganizationMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
288+
289+
-- AddForeignKey
290+
ALTER TABLE "OrganizationMember" ADD CONSTRAINT "OrganizationMember_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
291+
292+
-- AddForeignKey
293+
ALTER TABLE "Project" ADD CONSTRAINT "Project_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
294+
295+
-- AddForeignKey
296+
ALTER TABLE "Project" ADD CONSTRAINT "Project_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE SET NULL ON UPDATE CASCADE;
297+
298+
-- AddForeignKey
299+
ALTER TABLE "Contract" ADD CONSTRAINT "Contract_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
300+
301+
-- AddForeignKey
302+
ALTER TABLE "Audit" ADD CONSTRAINT "Audit_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
303+
304+
-- AddForeignKey
305+
ALTER TABLE "AuditFinding" ADD CONSTRAINT "AuditFinding_auditId_fkey" FOREIGN KEY ("auditId") REFERENCES "Audit"("id") ON DELETE CASCADE ON UPDATE CASCADE;
306+
307+
-- AddForeignKey
308+
ALTER TABLE "AuditFinding" ADD CONSTRAINT "AuditFinding_assignedToId_fkey" FOREIGN KEY ("assignedToId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
309+
310+
-- AddForeignKey
311+
ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Please do not edit this file manually
2+
# It should be added in your version control system (i.e. Git)
3+
provider = "postgresql"

0 commit comments

Comments
 (0)