Skip to main content
Version: v1.0.0(int)

Users & membership

Identity lives on platform.users; per-tenant membership and role live on platform.organization_users.

ER diagram

platform.users

One row per Firebase user. Identity-only — anything per-org lives on organization_users.

ColumnTypeNotes
idUUID PKReferenced by user_invitations.invited_by and similar.
firebase_uidVARCHAR(128)UNIQUE. Auth provider's stable ID.
emailVARCHAR(320)UNIQUE.
display_nameVARCHAR(255)
is_activeBOOLNOT NULL. Default true.
last_login_atTIMESTAMPTZUpdated on each GET /user hit.
created_atTIMESTAMPTZNOT NULL. Default NOW().
updated_atTIMESTAMPTZNOT NULL. Default NOW(). Auto-updated by trigger.

platform.organization_users

One row per (user, org). Role lives here.

ColumnTypeNotes
idUUID PK
user_idUUID FKplatform.users(id) ON DELETE CASCADE.
org_idUUID FKplatform.organizations(id) ON DELETE CASCADE.
roleorg_roleNOT NULL. ENUM (owner, admin, member, viewer).
is_activeBOOLNOT NULL. Default true.
joined_atTIMESTAMPTZNOT NULL. Default NOW().
last_active_atTIMESTAMPTZNULL until first activity. Updated on every request scoped to this org.
created_atTIMESTAMPTZNOT NULL. Default NOW().
updated_atTIMESTAMPTZNOT NULL. Default NOW(). Auto-updated by trigger.

UNIQUE (user_id, org_id).