chore: complete v1.0 MVP milestone
Archive roadmap, requirements, and phase directories to milestones/. Evolve PROJECT.md with validated requirements and key decisions. Reorganize ROADMAP.md with milestone grouping. Delete REQUIREMENTS.md (fresh for next milestone).
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
---
|
||||
phase: 01-foundation-and-collection
|
||||
plan: 02
|
||||
subsystem: api
|
||||
tags: [hono, drizzle, zod, sqlite, crud, tdd, image-upload]
|
||||
|
||||
requires:
|
||||
- phase: 01-foundation-and-collection/01
|
||||
provides: SQLite schema, shared Zod schemas, test helper, Hono server scaffold
|
||||
provides:
|
||||
- Item CRUD service layer with category join
|
||||
- Category CRUD service with Uncategorized reassignment on delete
|
||||
- Computed totals (per-category and global weight/cost/count)
|
||||
- Image upload endpoint with type/size validation
|
||||
- Hono API routes with Zod request validation
|
||||
- Integration tests for all API endpoints
|
||||
affects: [01-03, 01-04]
|
||||
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns: [service-layer-di, hono-context-db-injection, tdd-red-green]
|
||||
|
||||
key-files:
|
||||
created:
|
||||
- src/server/services/item.service.ts
|
||||
- src/server/services/category.service.ts
|
||||
- src/server/services/totals.service.ts
|
||||
- src/server/routes/items.ts
|
||||
- src/server/routes/categories.ts
|
||||
- src/server/routes/totals.ts
|
||||
- src/server/routes/images.ts
|
||||
- tests/services/item.service.test.ts
|
||||
- tests/services/category.service.test.ts
|
||||
- tests/services/totals.test.ts
|
||||
- tests/routes/items.test.ts
|
||||
- tests/routes/categories.test.ts
|
||||
modified:
|
||||
- src/server/index.ts
|
||||
|
||||
key-decisions:
|
||||
- "Service functions accept db as first parameter with production default for testability"
|
||||
- "Routes use Hono context variables for DB injection enabling integration tests with in-memory SQLite"
|
||||
- "Totals computed via SQL aggregates on every read, never cached"
|
||||
|
||||
patterns-established:
|
||||
- "Service layer DI: all service functions take db as first param, defaulting to production db"
|
||||
- "Route testing: inject test DB via Hono context middleware, use app.request() for integration tests"
|
||||
- "Category delete safety: guard against deleting id=1, reassign items before delete"
|
||||
|
||||
requirements-completed: [COLL-01, COLL-02, COLL-03, COLL-04]
|
||||
|
||||
duration: 3min
|
||||
completed: 2026-03-14
|
||||
---
|
||||
|
||||
# Phase 1 Plan 02: Backend API Summary
|
||||
|
||||
**Item/category CRUD with Zod-validated Hono routes, computed totals via SQL aggregates, image upload, and 30 passing tests via TDD**
|
||||
|
||||
## Performance
|
||||
|
||||
- **Duration:** 3 min
|
||||
- **Started:** 2026-03-14T21:37:37Z
|
||||
- **Completed:** 2026-03-14T21:40:54Z
|
||||
- **Tasks:** 2
|
||||
- **Files modified:** 13
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- Complete item CRUD service layer with category join queries
|
||||
- Category CRUD with Uncategorized reassignment on delete (transaction-safe)
|
||||
- Per-category and global weight/cost/count totals via SQL SUM/COUNT aggregates
|
||||
- Hono API routes with Zod request validation for all endpoints
|
||||
- Image upload endpoint with file type and size validation
|
||||
- 30 tests passing (20 unit + 10 integration) built via TDD
|
||||
|
||||
## Task Commits
|
||||
|
||||
Each task was committed atomically:
|
||||
|
||||
1. **Task 1: Service layer with tests (RED)** - `f906779` (test)
|
||||
2. **Task 1: Service layer implementation (GREEN)** - `22757a8` (feat)
|
||||
3. **Task 2: API routes, image upload, integration tests** - `029adf4` (feat)
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
- `src/server/services/item.service.ts` - Item CRUD business logic with category join
|
||||
- `src/server/services/category.service.ts` - Category CRUD with reassignment on delete
|
||||
- `src/server/services/totals.service.ts` - Per-category and global totals aggregation
|
||||
- `src/server/routes/items.ts` - Hono routes for /api/items with Zod validation
|
||||
- `src/server/routes/categories.ts` - Hono routes for /api/categories with delete protection
|
||||
- `src/server/routes/totals.ts` - Hono route for /api/totals
|
||||
- `src/server/routes/images.ts` - Image upload with type/size validation
|
||||
- `src/server/index.ts` - Registered all API routes
|
||||
- `tests/services/item.service.test.ts` - 7 unit tests for item CRUD
|
||||
- `tests/services/category.service.test.ts` - 7 unit tests for category CRUD
|
||||
- `tests/services/totals.test.ts` - 4 unit tests for totals aggregation
|
||||
- `tests/routes/items.test.ts` - 6 integration tests for item API
|
||||
- `tests/routes/categories.test.ts` - 4 integration tests for category API
|
||||
|
||||
## Decisions Made
|
||||
|
||||
- Service functions accept `db` as first parameter with production default for dependency injection and testability
|
||||
- Routes use Hono context variables (`c.get("db")`) for DB injection, enabling integration tests with in-memory SQLite without mocking
|
||||
- Totals computed via SQL aggregates on every read per RESEARCH.md recommendation (never cached)
|
||||
- `updateItemSchema.omit({ id: true })` used for PUT routes since id comes from URL params
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
None - plan executed exactly as written.
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
None.
|
||||
|
||||
## User Setup Required
|
||||
|
||||
None - no external service configuration required.
|
||||
|
||||
## Next Phase Readiness
|
||||
|
||||
- All backend API endpoints ready for frontend consumption (Plan 01-03)
|
||||
- Service layer provides clean interface for TanStack Query hooks
|
||||
- Test infrastructure supports both unit and integration testing patterns
|
||||
|
||||
## Self-Check: PASSED
|
||||
|
||||
All 12 created files verified present. All 3 task commits verified in git log.
|
||||
|
||||
---
|
||||
*Phase: 01-foundation-and-collection*
|
||||
*Completed: 2026-03-14*
|
||||
Reference in New Issue
Block a user