Skip to content

Database Schema

Generated from backend/db/migrations/*.sql, applied in order.

users

ColumnTypeNotes
idUUIDPK, gen_random_uuid()
nameTEXT
emailVARCHAR(255)unique
password_hashTEXTbcrypt
is_verifiedBOOLEANdefault FALSE (unused by current routes)
created_atTIMESTAMPTZdefault NOW()

projects

ColumnTypeNotes
idUUIDPK
nameVARCHAR(255)
slugVARCHAR(255)unique
owner_idUUIDFK → users.id, ON DELETE CASCADE
descriptionTEXTnullable
created_at / updated_atTIMESTAMPTZupdated_at auto-touched by trigger

environments

ColumnTypeNotes
idUUIDPK
project_idUUIDFK → projects.id, ON DELETE CASCADE
nameVARCHAR(255)
slugVARCHAR(255)unique per project
sdk_keyUUIDdefault gen_random_uuid(), rotatable
iconTEXTdefault 'globe'
urlTEXTdrives the CORS allowlist
created_at / updated_atTIMESTAMPTZ

UNIQUE(project_id, slug).

flags

ColumnTypeNotes
idUUIDPK
project_idUUIDFK → projects.id, ON DELETE CASCADE
keyVARCHAR(255)unique per project
nameVARCHAR(255)
typeVARCHAR(50)CHECK IN ('boolean','string','number','json')
default_valueJSONB
descriptionTEXTnullable
created_at / updated_atTIMESTAMPTZ

UNIQUE(project_id, key).

flag_values

ColumnTypeNotes
idUUIDPK
flag_idUUIDFK → flags.id, ON DELETE CASCADE
environment_idUUIDFK → environments.id, ON DELETE CASCADE
is_enabledBOOLEANdefault FALSE
rollout_percentageINTEGERCHECK BETWEEN 0 AND 100, default 0
targeting_attributeVARCHAR(255)nullable
targeting_valueTEXTnullable
targeting_return_valueJSONBnullable
updated_atTIMESTAMPTZauto-touched by trigger

UNIQUE(flag_id, environment_id) — one value row per flag per environment.

audit_logs

ColumnTypeNotes
idUUIDPK
project_idUUIDFK → projects.id, ON DELETE CASCADE
flag_idUUIDFK → flags.id, ON DELETE CASCADE, nullable
environment_idUUIDFK → environments.id, ON DELETE CASCADE, nullable
user_idUUIDFK → users.id, ON DELETE CASCADE
change_summaryTEXT
old_value / new_valueTEXTnullable
reasonTEXTnullable, currently unused by callers
typeTEXTe.g. flag_toggle, key_rotation, project_creation
domainVARCHAR(50)CHECK IN ('project','environment','flag')
created_atTIMESTAMPTZ

Indexed by (project_id, created_at DESC) for fast per-project log listing.

Triggers

A shared set_updated_at() trigger function stamps updated_at = NOW() on update, applied to flag_values, flags, environments, and projects.

schema_migrations

Created on demand by backend/db/migrate.js, not a numbered migration itself — tracks which migration files have already been applied so re-running npm run migrate is safe.