You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Elijah Voigt a5b7c8d856 feat(quotesdb): implement API DB layer and all HTTP handlers
DB layer (src/bin/api/db/):
- native.rs: NativeRepository (tokio-rusqlite) implementing all CRUD ops,
  dynamic WHERE for filters, two-phase auth check for update, 13 unit tests
- d1.rs: D1Repository wasm32 stub (all methods return Internal error)
- connection.rs: open() helper — WAL + foreign_keys pragmas
- mod.rs: cfg-gate async_trait (Send on native, ?Send on wasm32)

Handlers (src/bin/api/handlers/mod.rs):
- All 7 routes: GET /api/, random, {id}, list, PUT create, POST update, DELETE
- Router order: random BEFORE {id} (prevents "random" matching as id)
- Auth: X-Auth-Code header validation → 403 on mismatch
- 13 handler unit tests with MockRepo

main.rs: opens DB, runs migrations, wraps in Arc<dyn Repo + Send + Sync>,
  binds on $PORT (default 3000)

Cargo.toml: tower dev-dep for ServiceExt::oneshot in tests

All 32 tests pass (26 api + 6 lib)

Tickets closed: 00aff0 a5049d 6e829e 28e7d9 886bfd 2ce22e 5dbb7d 05f8ae
                d792e2 5d9f5a b20b5a 175382 03bb91

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 months ago
..
ARCHITECTURE.md feat(quotesdb): implement API DB layer and all HTTP handlers 3 months ago
PLANNING.md feat(quotesdb): implement API DB layer and all HTTP handlers 3 months ago
README.md feat(quotesdb): implement API DB layer and all HTTP handlers 3 months ago

README.md

quotesdb API

Axum/Tokio REST API for the quotesdb project. Targets Cloudflare Workers (wasm32) in production; runs as a native server for local development and testing.

Endpoints

Method Path Description Auth
GET /api/ OpenAPI spec (JSON) None
GET /api/quotes Paginated list. Query: ?page=N&author=X&tag=Y None
GET /api/quotes/random Random quote None
GET /api/quotes/:id Quote by ID None
PUT /api/quotes Create a quote None
POST /api/quotes/:id Update a quote X-Auth-Code header
DELETE /api/quotes/:id Delete a quote X-Auth-Code header

Running locally

cargo run          # starts on http://localhost:3000

Building for Cloudflare Workers

cargo build --release --bin api --target wasm32-unknown-unknown

Testing

cargo test

Auth

Each quote has an auth_code (4-word passphrase) generated at creation time. Include it in the X-Auth-Code header for update and delete operations. Mismatch returns 403 Forbidden.