131 lines
5.0 KiB
Markdown
131 lines
5.0 KiB
Markdown
# TODO — Recipe Manager
|
|
|
|
**Last Updated:** 2026-03-25
|
|
**Current Milestone:** v1.0 — Recipe Import
|
|
|
|
---
|
|
|
|
## ✅ MVP (v0.1) Status
|
|
|
|
MVP is functionally complete (core app + docs + tests).
|
|
|
|
### Completed
|
|
- Backend API (recipes + tags)
|
|
- Frontend UI (list/detail/form/cook mode)
|
|
- Search + tag management + error handling
|
|
- Dockerfiles + docker-compose
|
|
- API docs + user guide + README setup
|
|
- ADR-001 (sql.js decision)
|
|
|
|
### Deferred / Manual Host Validation
|
|
- [ ] Manual Docker host test (`docker compose up`) on host machine with Docker installed
|
|
|
|
---
|
|
|
|
## 🎯 Active Tasks — v1.0 Recipe Import
|
|
|
|
### Phase 1: URL Import Foundation
|
|
- [x] Add backend import endpoint: `POST /api/import/url`
|
|
- [x] Implement Schema.org Recipe JSON-LD parser service
|
|
- [x] Normalize parsed recipe into internal Recipe draft format
|
|
- [x] Add import endpoint tests (valid recipe page, non-recipe page, malformed JSON-LD)
|
|
|
|
### Phase 2: Import UI
|
|
- [x] Add “Import from URL” UI page/form in frontend
|
|
- [x] Show parsed preview (title, ingredients, steps, source URL)
|
|
- [x] Allow edit-before-save flow, then save to existing create recipe API
|
|
- [x] Add frontend error states (invalid URL, parse failure, timeout)
|
|
|
|
### Phase 3: Fallback Parsing + Hardening
|
|
- [x] Add heuristic fallback parser when Schema.org missing
|
|
- [x] Add timeout/retry + user-friendly import failure messages
|
|
- [x] Add logging/telemetry for import success/failure reasons
|
|
|
|
### Phase 4: Browser Extension (after URL import stable)
|
|
- [x] Scaffold browser extension project (Manifest v3)
|
|
- [x] Add “Send to Recipe Manager” action to call import API
|
|
- [x] Add extension settings for Recipe Manager base URL
|
|
|
|
---
|
|
|
|
## 🚀 High Priority Improvements (Post-code-review)
|
|
|
|
### Phase 1: Configuration & Reliability
|
|
- [x] Add environment-based configuration (dotenv, env vars for PORT, DB_PATH, CORS_ORIGIN)
|
|
- [x] Wrap RecipeRepository.create in database transaction (BEGIN/COMMIT)
|
|
- [x] Wrap RecipeRepository.update in database transaction
|
|
- [x] Optimize duplicate detection in import (use Set for O(1) lookup)
|
|
- [x] Add health check endpoint (/api/health)
|
|
- [x] Add dirty flag to avoid unnecessary periodic database saves
|
|
- [x] Enable foreign key constraints (PRAGMA foreign_keys = ON)
|
|
|
|
### Phase 2: Security
|
|
- [x] Add API key authentication middleware (shared secret for write endpoints)
|
|
- [x] Add rate limiting to import endpoints (express-rate-limit)
|
|
- [x] Update CORS to be configurable (wildcard only in development)
|
|
- [x] Fix image URL handling: ensure relative paths converted to /images/ absolute
|
|
- [ ] (Optional) Restrict harness routes to localhost or add auth
|
|
|
|
### Phase 3: Testing
|
|
- [x] Add tests for PUT /api/recipes/:id
|
|
- [x] Add tests for DELETE /api/recipes/:id
|
|
- [x] Add tests for tag CRUD (GET/POST/PUT/DELETE)
|
|
- [x] Add tests for tag assignment/removal to recipes
|
|
- [x] Add unit tests for CopyMeThatHtmlParser (edge cases, malformed HTML)
|
|
- [x] Add unit tests for CopyMeThatTxtParser
|
|
- [x] Add unit tests for CopyMeThatImportService (duplicate detection, error handling)
|
|
- [x] Add integration tests for file upload endpoint (POST /api/import/local)
|
|
- [x] Fix TypeScript build errors (node16 resolution, monkey-patch types)
|
|
|
|
### Phase 4: Code Quality & Observability
|
|
- [ ] Extract asyncHandler middleware to reduce route boilerplate
|
|
- [ ] Add request logging (morgan)
|
|
- [ ] Replace console.log with proper logger (debug module)
|
|
- [ ] Add pagination links to recipe list response
|
|
- [ ] Add full-text search (FTS5) for title/description/ingredients/tags (defer if time)
|
|
|
|
## ✅ Completed in this session (2026-03-29)
|
|
- Implemented all Phase 1 & 2 tasks (config, auth, rate limiting, health check, transactions, dirty flag, FK constraints, image URL fix)
|
|
- Added comprehensive tests for recipes (PUT/DELETE) and tags (update/delete/assignment)
|
|
- Fixed critical bug in tag assignment routes (parameter order)
|
|
- Enabled foreign key constraints for data integrity
|
|
- Fixed TypeScript build errors:
|
|
- monkey-patch return type for db.run
|
|
- added `.js` extensions to all cross-module imports (node16 resolution)
|
|
- added explicit types for callbacks in test files
|
|
- All backend tests passing (46 tests) and `npm run build` succeeds
|
|
|
|
## 📋 Backlog (Post-v1)
|
|
|
|
### v1.1
|
|
- [ ] Recipe scaling (adjust servings)
|
|
- [ ] Print styles
|
|
- [ ] Advanced search filters
|
|
- [ ] Random recipe suggestion
|
|
|
|
### v2.0 (AI Features)
|
|
- [ ] AI ingredient substitutions
|
|
- [ ] Meal planning
|
|
- [ ] Shopping list generation
|
|
- [ ] Fintrove cost tracking integration
|
|
|
|
---
|
|
|
|
## 🚧 Blocked / Needs Decision
|
|
|
|
- **CopyMeThat export path:** confirm whether Anne/Elizabeth can export directly, or we rely on URL import + browser extension.
|
|
- **Tag filtering in recipe list:** currently UI-only, backend filter by tag_id pending.
|
|
|
|
---
|
|
|
|
## Notes for Agents
|
|
|
|
- Work from top to bottom in the **Active Tasks — v1.0** section.
|
|
- Pick the **first unchecked task** only.
|
|
- One task = one commit.
|
|
- If blocked: mark task with reason and continue next unblocked task only with explicit note.
|
|
|
|
---
|
|
|
|
_This is the authoritative task queue for harness iterations._
|