Skip to content

feat(db): extract Database trait abstraction layer (Phase 1)#186

Merged
ajianaz merged 2 commits into
developfrom
feat/db-trait-phase1
Jun 15, 2026
Merged

feat(db): extract Database trait abstraction layer (Phase 1)#186
ajianaz merged 2 commits into
developfrom
feat/db-trait-phase1

Conversation

@ajianaz

@ajianaz ajianaz commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #166. Foundation for multi-backend DB support (#171).

Extracts all SQLite-specific SQL behind a generic Database trait in new crate trapfall-db. trapfall-core::Store becomes a thin facade delegating to Arc<dyn Database>.

Changes

  • New crate trapfall-db (crates/trapfall-db/):
    • Database trait — 40+ async methods covering all storage operations
    • SqliteBackend — implements trait, owns all 60+ raw SQL queries
    • Trait includes: projects, issues, events, alerts, search, auth, retention, cooldown, ping, metrics
    • StoredUser/StoredSession row types
  • trapfall-core::store — thin facade over Arc<dyn Database>
    • Public API unchanged: same method signatures, delegates to backend
    • Store::with_backend(Arc<dyn Database>) new constructor for Phase 2
    • Store::pool() escape hatch retained (search/mcp/metrics still raw SQL — Phase 3)
  • trapfall-core::auth — delegates to trait methods
    • User/Session re-exported from trapfall-db
  • Net -489 lines (SQL deduplicated into backend)

Why This Approach

Phase 1 goal: foundation without behavior change. Opsi "sempit" dipilih:

  • Trait cover Store methods (the main read/write path)
  • Store::pool() retained as escape hatch for trapfall-search, trapfall-mcp, retention, metrics yang masih query SQL langsung
  • Phase 3 (feat(db): implement Postgres backend (Phase 3) #168) akan dorong crate lain pindah ke trait sepenuhnya saat Postgres butuh mereka

Alternative wide refactor (all crates via trait) ditolak karena:

  • Besar effort + risiko regression tinggi
  • Belum ada caller non-SQL yang memaksa
  • Incremental migration lebih aman

Acceptance Criteria (from #166)

  • trapfall-db crate compiles and passes tests (5/5)
  • Store uses Arc<dyn Database> internally
  • Store::pool() retained for SQLite escape hatch (documented)
  • All existing tests pass (84/84 across workspace)
  • Zero behavior change

Test Plan

cargo test --workspace

Result: 84 passed, 0 failed.

Dependencies

Blocks: #167 (Phase 2), #168 (Phase 3), #169 (Phase 4), #170 (Phase 5)
Epic: #171

Closes #166. Foundation for multi-backend support (#171).

Changes:
- New crate  with generic  trait
  - 40+ methods: projects, issues, events, alerts, search, auth, retention
  -  impl moves all 60+ raw SQL queries out of core
  - Includes search, count_table, purge, cooldown, ping trait methods
-  becomes thin facade over
  - Zero behavior change: same public API, delegates to backend
  -  escape hatch retained for search/mcp/metrics (Phase 3)
-  delegates to trait methods
  - / re-exported from
- Tests: 84/84 pass across workspace (5 new in trapfall-db)

No  reference in trait surface. Backend-agnostic foundation
ready for Phase 2 (#167: connection factory) and Phase 3 (#168: Postgres).
@ajianaz ajianaz merged commit 59c88c3 into develop Jun 15, 2026
10 checks passed
@ajianaz ajianaz deleted the feat/db-trait-phase1 branch June 15, 2026 09:31
ajianaz added a commit that referenced this pull request Jun 15, 2026
- Bump version 0.0.4 → 0.0.5
- Update CHANGELOG with v0.0.5 section
- Includes: Database trait abstraction (#186) + connection factory (#167)
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.

refactor(db): extract Database trait abstraction layer (Phase 1)

1 participant