Skip to main content

Overview

Null Pass uses PostgreSQL with Prisma ORM for database management. This document describes the database schema and relationships.

Prisma Schema

The complete schema is defined in prisma/schema.prisma:

Models

User

Core user account model. Fields:
  • id: CUID primary key
  • email: Unique email address
  • passwordHash: bcrypt hash (nullable for OAuth users)
  • avatar: Avatar URL (text field)
  • displayName: User display name
  • twoFactorEnabled: 2FA status
  • twoFactorSecret: TOTP secret (base32)
  • banned: Account ban flag
  • disabled: Account disable flag
  • migraited: Migration flag (LEGACY)
  • createdAt: Creation timestamp
  • updatedAt: Last update timestamp
Relations:
  • sessions: One-to-many with Session
  • serviceAccess: One-to-many with UserServiceEntitlement
  • auditLogs: One-to-many with AuditLog

Session

User session management. Fields:
  • id: CUID primary key
  • userId: Foreign key to User
  • ip: Encrypted IP address
  • token: JWT token (unique)
  • expiresAt: Expiration timestamp
  • createdAt: Creation timestamp
Indexes:
  • userId: For user session queries
  • expiresAt: For expiration cleanup
Cascade: Deleted when user is deleted

AuditLog

Audit trail for all actions. Fields:
  • id: CUID primary key
  • action: AuditAction enum
  • data: JSON metadata
  • userId: Foreign key to User
  • createdAt: Timestamp
Indexes:
  • userId: For user audit queries
  • action: For action type queries
  • createdAt: For time-based queries
Cascade: Deleted when user is deleted

UserServiceEntitlement

Service access entitlements. Fields:
  • id: CUID primary key
  • userId: Foreign key to User
  • service: ServiceIdentifier enum
  • tier: Access tier string
  • isPremium: Premium flag
  • accessFlags: JSON object
  • metadata: JSON object
  • connected: Connection status
  • customStorageLimit: Custom storage limit (bytes)
  • customApiKeyLimit: Custom API key limit
  • polarCustomerId: Polar customer ID
  • polarSubscriptionId: Polar subscription ID
  • polarSubscriptionStatus: Polar subscription status
  • createdAt: Creation timestamp
  • updatedAt: Last update timestamp
Unique Constraint: userId + service Indexes:
  • service: For service-based queries
Cascade: Deleted when user is deleted

Migrations

Migrations are managed with Prisma:

Database Operations

Prisma Client Usage

Indexes

Indexes are defined for performance:
  • sessions.userId: Fast user session lookup
  • sessions.expiresAt: Expiration cleanup queries
  • audit_logs.userId: User audit queries
  • audit_logs.action: Action type filtering
  • audit_logs.createdAt: Time-based queries
  • user_service_entitlements.service: Service filtering

Constraints

  • users.email: Unique constraint
  • sessions.token: Unique constraint
  • user_service_entitlements.userId_service: Unique constraint

Cascade Deletes

When a user is deleted:
  • All sessions are deleted
  • All audit logs are deleted
  • All service entitlements are deleted
This ensures data consistency and prevents orphaned records.