Database Schema
FSS uses PostgreSQL as its primary database with Prisma ORM for type-safe database operations.
Overview
The database schema includes the following main entities:
- Users - User accounts and authentication
- Products - Product catalog
- Orders - Order management
- Payments - Payment records
- Audit Logs - Security and activity logging
Database Connection
Environment Variables
# PostgreSQL connection
DATABASE_URL=postgresql://username:password@host:5432/database
# Connection pool settings
DATABASE_POOL_SIZE=10
DATABASE_POOL_TIMEOUT=30000
Prisma Configuration
// prisma.config.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient({
log: process.env.NODE_ENV === 'development'
? ['query', 'info', 'warn', 'error']
: ['error'],
});
User Model
model User {
id String @id @default(uuid())
email String @unique
password String
name String?
role UserRole @default(USER)
emailVerified Boolean @default(false)
mfaEnabled Boolean @default(false)
mfaSecret String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sessions Session[]
orders Order[]
auditLogs AuditLog[]
}
enum UserRole {
USER
ADMIN
}
Session Model
model Session {
id String @id @default(uuid())
userId String
token String @unique
device String?
ip String?
expiresAt DateTime
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
Product Model
model Product {
id String @id @default(uuid())
name String
description String?
price Decimal @db.Decimal(10, 2)
stock Int @default(0)
sku String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
orderItems OrderItem[]
}
Order Model
model Order {
id String @id @default(uuid())
userId String
status OrderStatus @default(PENDING)
total Decimal @db.Decimal(10, 2)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
items OrderItem[]
payment Payment?
}
enum OrderStatus {
PENDING
PROCESSING
SHIPPED
DELIVERED
CANCELLED
REFUNDED
}
model OrderItem {
id String @id @default(uuid())
orderId String
productId String
quantity Int
price Decimal @db.Decimal(10, 2)
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
product Product @relation(fields: [productId], references: [id])
}
Payment Model
model Payment {
id String @id @default(uuid())
orderId String @unique
amount Decimal @db.Decimal(10, 2)
currency String @default("USD")
status PaymentStatus @default(PENDING)
provider String // "stripe" or "paypal"
providerId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
order Order @relation(fields: [orderId], references: [id])
}
enum PaymentStatus {
PENDING
PROCESSING
COMPLETED
FAILED
REFUNDED
CANCELLED
}
Audit Log Model
model AuditLog {
id String @id @default(uuid())
userId String?
action String
resource String
resourceId String?
details Json?
ip String?
userAgent String?
createdAt DateTime @default(now())
}
Database Migrations
Create Migration
npx prisma migrate dev --name migration_name
Reset Database
npx prisma migrate reset
Generate Prisma Client
npx prisma generate
Push Schema Changes
npx prisma db push
Related Documentation
- Project Structure - Database in project layout
- Authentication - User authentication
- Security Best Practices - Database security