|
| 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; |
0 commit comments