Database Schema
Comprehensive Prisma relational schema reference for users, contract documents, risks, solutions, and API credentials.
OutRiskAI utilizes PostgreSQL managed via Prisma ORM (prisma/schema.prisma). The database incorporates relational tables alongside vector extensions for semantic contract search.
To apply database migrations locally, run pnpm prisma migrate dev. To inspect the database using Prisma Studio, run pnpm prisma studio.
Core Entity Relationship Model
┌──────────────┐ 1:N ┌──────────────────┐
│ User ├────────────────►│ ContractDocument │
└──────┬───────┘ └────────┬─────────┘
│ 1:N │ 1:N
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ ApiKey │ │ ContractRisk │
└──────────────┘ └────────┬─────────┘
│ 1:N
▼
┌──────────────────┐
│ RiskSolution │
└──────────────────┘Primary Prisma Models
1. User (User)
Stores account identities, authentication credentials, and user roles:
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime?
image String?
password String?
role Role @default(USER)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
documents ContractDocument[]
apiKeys ApiKey[]
}
enum Role {
USER
LAWYER
ADMIN
}2. Contract Document (ContractDocument)
Represents ingested contract assets, extracted text, metadata, and background processing states:
model ContractDocument {
id String @id @default(cuid())
userId String
title String
description String?
documentUrl String
documentText String @db.Text
status DocumentStatus @default(PENDING)
promisor String?
promisee String?
value Float?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
risks ContractRisk[]
}
enum DocumentStatus {
PENDING
ACCEPTED
REJECTED
}3. Contract Risk (ContractRisk)
Stores identified risk liabilities, original clause text, and severity ratings:
model ContractRisk {
id String @id @default(cuid())
documentId String
title String
text String @db.Text
severity RiskSeverity @default(MEDIUM)
category String?
document ContractDocument @relation(fields: [documentId], references: [id], onDelete: Cascade)
solutions RiskSolution[]
}
enum RiskSeverity {
HIGH
MEDIUM
LOW
}4. Risk Solution (RiskSolution)
Contains recommended alternative contract language and negotiation guidance for each risk:
model RiskSolution {
id String @id @default(cuid())
riskId String
solution String @db.Text
risk ContractRisk @relation(fields: [riskId], references: [id], onDelete: Cascade)
}5. API Key Credentials (ApiKey)
Stores hashed API secrets and permission scopes for the Public REST API:
model ApiKey {
id String @id @default(cuid())
userId String
name String
keyHash String @unique
prefix String
scopes String[] @default(["documents:read", "documents:write"])
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}Next Steps
Risk analysis results GET
Returns the generated summary, identified risks and suggested solutions. Available once the processing status is completed. Requires the documents:read scope.
Architecture Overview
Technical architecture, Next.js 16 stack, PostgreSQL pgvector setup, and microservices design in OutRiskAI.