Skip to content

Schema Overview

  • Current (main): PostgreSQL 16 running in Docker on the VPS
  • Target (spike/cf-runtime): Neon (serverless PostgreSQL)

The database schema is defined in src/db/schema.ts using Drizzle ORM’s schema definition DSL. Migrations are generated and managed with drizzle-kit.

The database contains these table groups:

TablePurpose
buyersBuyer user profiles (Lucia user table)
sessionsLucia session store (FK → buyers)
otp_codesOne-time password hashes
favoritesSaved units per buyer
consentsGDPR consent audit trail
document_downloadsTracked document downloads
TablePurpose
unitsProperty units
unit_imagesUnit image gallery
agentsSales agent profiles
pagesCMS content pages
portal_settingsPortal branding and config (legacy, being replaced by portals)
TablePurpose
organizationsReal estate developer entities
projectsReal estate projects
portalsPortal branding/config (replaces portal_settings)
portal_domainsCustom domains per portal
usersAdmin identities (agents, developers)
membershipsOrganization membership and roles
agent_project_assignmentsAgent-to-project assignments
admin_sessionsAdmin Lucia session store
admin_login_tokensMagic-link tokens
audit_eventsImmutable audit log
jobsBackground job queue
EnumValues
interest_typepersonal_use, investment, general_interest, other
preferred_languagede, en
consent_purposedata_processing, newsletter, analytics, document_downloads
document_typefloor_plan, expose, energy_certificate, brochure, other
otp_channelemail, whatsapp
biological_sexfemale, male, diverse, intersex, prefer_not_to_say
unit_statusavailable, reserved, sold
unit_image_labelfloorplan, floorplan_3d, exterior, interior, site_plan, other
project_statusactive, archived
user_typebuyer, agent, developer
membership_roledeveloper, agent
audit_actor_roleoperator, developer, agent, buyer
job_typeopenimmo.import, image.label, ecb.refresh
job_statusqueued, running, done, failed
portal_domain_statuspending, active, failed
organizations 1──N projects
projects 1──N portals
portals 1──N portal_domains
projects 1──N units
projects 1──N buyers
projects 1──N pages
organizations 1──N agents
users N──M organizations (via memberships)
users N──M projects (via agent_project_assignments)
buyers 1──N favorites
buyers 1──N consents
buyers 1──N document_downloads