Skip to content

refactor(server): brand TxDb, inject Clock, extract FoldersService#42

Merged
allisson merged 1 commit into
mainfrom
improve
May 15, 2026
Merged

refactor(server): brand TxDb, inject Clock, extract FoldersService#42
allisson merged 1 commit into
mainfrom
improve

Conversation

@allisson
Copy link
Copy Markdown
Owner

  • TxDb branded type (db/tx.ts) + asTx() — every write-path service signature and the quota advisory-lock helpers now require TxDb, making accidental calls on app.db a compile error. Closes a latent gap where pg_advisory_xact_lock would silently no-op without a surrounding transaction.
  • app.clock decorator (plugins/clock.ts) owns every time-sensitive read: session expiry, TOTP windows, recovery token expiry, auth idle check, cleanup interval. Tests use fixedClock/advanceableClock instead of spying on Date.now, which never saw the V8-internal clock new Date() uses.
  • FoldersService extracted from inline route logic, mirroring items/trash/shares shape; folder writes now run inside db.transaction(...).
  • requireOwner/requireWriter/requireReader on vaults/access.ts consolidate the role-gate pattern duplicated across services.
  • Drop duplicate PG 23505 try/catch in register and create-share; global error handler is the single mapping point.

- TxDb branded type (db/tx.ts) + asTx() — every write-path service
  signature and the quota advisory-lock helpers now require TxDb,
  making accidental calls on app.db a compile error. Closes a
  latent gap where pg_advisory_xact_lock would silently no-op
  without a surrounding transaction.
- app.clock decorator (plugins/clock.ts) owns every time-sensitive
  read: session expiry, TOTP windows, recovery token expiry, auth
  idle check, cleanup interval. Tests use fixedClock/advanceableClock
  instead of spying on Date.now, which never saw the V8-internal
  clock new Date() uses.
- FoldersService extracted from inline route logic, mirroring
  items/trash/shares shape; folder writes now run inside
  db.transaction(...).
- requireOwner/requireWriter/requireReader on vaults/access.ts
  consolidate the role-gate pattern duplicated across services.
- Drop duplicate PG 23505 try/catch in register and create-share;
  global error handler is the single mapping point.
@allisson allisson merged commit 8caeefd into main May 15, 2026
1 check passed
@allisson allisson deleted the improve branch May 15, 2026 20:57
@allisson allisson mentioned this pull request May 18, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant