PriceController exposes a prices index (sortable by name/price/recency),
per-product price history with manual observation logging, and real
price insight on the product details page, replacing the placeholder
text left from CW-EPIC-04. Completes CW-EPIC-05.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Camera-based barcode scan page using the native BarcodeDetector API
(no bundler in this project, so no vendored scanning library) with a
manual-entry fallback for unsupported browsers. Adds the
/products/barcode/{barcode} and /api/products/barcode/{barcode}
routes ProductController was missing, plus an "Add to my list" action
on product details. Verified live against the real Open Food Facts
API end to end. "Record price" deferred to CW-EPIC-05, which doesn't
exist yet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
IProductService/ProductService return display-ready DTOs (BrandName/
ConceptName resolved via join) rather than raw Product entities.
ProductController routes match AGENTS.md §11; price/insight fields
deferred until CW-EPIC-05 exists.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add toggle/skip/delete with optimistic concurrency handling and jQuery
progressive enhancement (CW-STORY-03.4), then a mobile-first touch-target
and quick-add polish pass (CW-STORY-03.5).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>