Files
wursor/docs/decisions/0014-postgres-queryable.md
SinachPat df2315087d
Mirror to GitHub / mirror (push) Canceled after 0s
feat: Sprint 1 remainder — Postgres store, Docker client, warm pool, sessions route
- PostgresUserStore (Queryable) + migration + env-gated wiring
- DockerodeClient behind injected DockerEngine
- ImageManager, WarmPool, Dockerfile.wordpress, docker-compose
- POST /sessions spins up sandbox (503 when unconfigured)
- ADRs 0014-0015; 68 unit tests green
2026-08-15 20:18:34 +01:00

27 lines
1.2 KiB
Markdown

# 14. Postgres user store via a Queryable boundary; schema in SQL migrations
- **Status:** Accepted
- **Date:** 2026-08-15
## Context
ADR 0012 deferred Postgres behind the `UserStore` interface. Sprint 1 now ships the real implementation. Postgres is not available in the dev environment, so the store had to be testable without a database.
## Decision
`PostgresUserStore` uses `node-postgres` (`pg`) but depends on a minimal `Queryable` interface (`query(text, values)`) instead of `pg.Pool` directly. `UserStore` methods became async. The `users` table lives in `api/migrations/001_init.sql`. `index.ts` selects Postgres when `DATABASE_URL` is set, else the in-memory store.
### Options considered
- ORM (Prisma/Drizzle) with migrations.
- Raw `pg` behind a `Queryable` interface (chosen).
### Rejected
- ORM — adds tooling and a codegen step for a two-statement surface; the raw SQL is reviewable and the interface keeps tests database-free.
## Consequences
- `InMemoryUserStore` and `PostgresUserStore` share the same async `UserStore` contract; swapping is env-driven.
- Auth data is durable when `DATABASE_URL` is configured; the migration must be applied before first use.