Skip to content

Migration: Fauna → Postgres

Strategy:

  • Progressive migration guarded by Statsig flags per entity (see lib/flags/index.js)
  • Dual-read/dual-path via GraphQL context and resolvers; Postgres path uses services with Supabase client and decoded JWT (RLS-safe)

Switches:

  • Global: faunaStopped kill switch if needed @deprecated - Use per-entity flags instead
  • Per-entity: faunaMigration* flags (vehicles, orders, plans, settings, widgets, payments, invoices, users, user_tenants, etc.)

Context creation (createResolversContext.js):

  • Validates tokens via getTokens
  • If Postgres enabled + user migration flags, calls authMiddleware to create Supabase client, determines tenant/role, and instantiates services via createTenantServices
  • Dataloaders: Postgres loaders when enabled, otherwise Fauna loaders

Data movement:

  • Migration scripts under scripts/fauna-migration/* and fauna*.fsl
  • Ensure Prisma schema parity, indices, and RLS policies

Cutover checklist:

  1. Enable entity flags in lower env, validate reads/writes
  2. Run backfill/migration scripts
  3. Switch write path to Postgres-only for the entity
  4. Monitor via Sentry/Axiom; roll back flags if needed