feat(F-006): users profile, addresses and RBAC

- users module: profile + address CRUD behind use cases (users_profiles,
  users_addresses)
- roles customer/admin on identity_users; role resolved from DB per request
- shared auth contract (Authenticate, requireRole, requireOwnerOrAdmin)
  injected from composition root; users never imports identity
- authorization runs before existence checks; address SQL scoped by user_id
- @fastify/cookie registered once at app root (cross-module)
- migrations 003_identity_roles + 004_users (reversible)
- no new npm dependencies; tests: unit 52, integration 22

Gates: reviewer/security/qa APPROVED; verify.sh green
This commit is contained in:
rikrdo
2026-08-15 09:27:38 +02:00
parent 75293f39bc
commit 546971280f
37 changed files with 1732 additions and 161 deletions

View File

@@ -1,16 +1,16 @@
# Current work
- Active feature: none (idle)
- Last closed: F-005Identity: register, login, sessions
- Next suggested: F-006Users: profile, addresses, RBAC (depends on F-005, satisfied)
- Last closed: F-006Users: profile, addresses, RBAC
- Next suggested: F-007check `backlog/features.json` for the first `pending` ticket whose dependencies are satisfied
- Runtime status: reset via scripts/agent_status.py
- verify.sh: green at close
## F-005 closure notes
- Identity module hexagonal: domain/application/infrastructure/api under src/modules/identity
- Sessions server-side: cookie carries opaque 512-bit token; identity_sessions stores only SHA-256 hash
- argon2id (OWASP params) behind PasswordHasher port; timing equalized 401 (no enumeration)
- Rate limit: 10 consecutive failures per email -> 429 + Retry-After (15 min cooldown), in-memory behind interface
- Cookie: HttpOnly + Secure (COOKIE_SECURE, default true) + SameSite=Lax
- Migration 002_identity reversible; integration suite updated for full revert (count:0)
- Gates: reviewer/security/qa APPROVED. Commits include specs, artifacts, code, docs.
## F-006 closure notes
- Users module hexagonal: profile + address CRUD behind use cases; tables `users_profiles`, `users_addresses`
- Roles customer/admin on `identity_users` (migration 003); role resolved from DB on every request
- Shared auth contract (`src/shared/auth.ts`): `Authenticate`, `requireRole`, `requireOwnerOrAdmin` — users never imports identity; composition root injects the authenticator
- Authorization runs before existence checks (403 first, no enumeration); address SQL scoped by user_id
- `@fastify/cookie` registered once at app root (cross-module infrastructure)
- No new npm dependencies; README documents endpoint table, access rules, and new auth codes (UNAUTHORIZED/FORBIDDEN)
- Gates: reviewer/security/qa APPROVED. Tests: unit 52, integration 22 (PostgreSQL 16)