feat(architecture): add finance repository adapters

This commit is contained in:
2026-03-08 22:14:09 +04:00
parent 4ecafcfe23
commit f6d1f34acf
17 changed files with 994 additions and 383 deletions

View File

@@ -0,0 +1,76 @@
# HOUSEBOT-024: Repository Adapters for Application Ports
## Summary
Move persistence concerns behind explicit ports so application use-cases remain framework-free and bot delivery code stops querying Drizzle directly.
## Goals
- Define repository contracts in `packages/ports` for finance command workflows.
- Move concrete Drizzle persistence into an adapter package.
- Rewire bot finance commands to depend on application services instead of direct DB access.
## Non-goals
- Full persistence migration for every feature in one shot.
- Replacing Drizzle or Supabase.
- Changing finance behavior or settlement rules.
## Scope
- In: finance command repository ports, application service orchestration, Drizzle adapter, bot composition updates.
- Out: reminder scheduler adapters and mini app query adapters.
## Interfaces and Contracts
- Port: `FinanceRepository`
- Application service:
- member lookup
- open/close cycle
- rent rule save
- utility bill add
- statement generation with persisted settlement snapshot
- Adapter: Drizzle-backed repository implementation bound to a household.
## Domain Rules
- Domain money and settlement logic stay in `packages/domain` and `packages/application`.
- Application may orchestrate repository calls but cannot import DB/schema modules.
- Bot command handlers may translate Telegram context to use-case inputs, but may not query DB directly.
## Data Model Changes
- None.
## Security and Privacy
- Authorization remains in bot delivery layer using household membership/admin data from the application service.
- No new secrets or data exposure paths.
## Observability
- Existing command-level success/error logging behavior remains unchanged.
- Statement persistence remains deterministic and idempotent per cycle snapshot replacement.
## Edge Cases and Failure Modes
- Missing cycle, rent rule, or members should still return deterministic user-facing failures.
- Adapter wiring mistakes should fail in typecheck/build, not at runtime.
- Middleware or bot delivery bugs must not bypass application-level repository boundaries.
## Test Plan
- Unit: application service tests with repository stubs.
- Integration: Drizzle adapter exercised through bot/e2e flows.
- E2E: billing smoke test continues to pass after the refactor.
## Acceptance Criteria
- [ ] `packages/application` imports ports, not concrete DB code.
- [ ] `apps/bot/src/finance-commands.ts` contains no Drizzle/schema access.
- [ ] Finance command behavior remains green in repo tests and smoke flow.
## Rollout Plan
- Introduce finance repository ports first.
- Keep purchase ingestion adapter migration as a follow-up if needed.