OpenFoodFactsProductDataProvider registered as a typed HttpClient,
giving CW-STORY-04.3's barcode flow a real provider. Response models
stay internal to Infrastructure; failures are caught narrowly and
logged via a source-generated LoggerMessage delegate.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
IProductDataProvider abstraction per AGENTS.md §9; ProductService.
ResolveBarcodeAsync does local-first lookup with provider fallback
and persists accepted results. No real provider registered yet
(CW-STORY-04.4) — flow is fully tested via a fake provider.
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>
Brand, Product (aggregate root for ProductIdentifier), ProductIdentifier,
and HouseholdProductPreference, per AGENTS.md §5.2/5.3. Built ahead of
MVP-tagged epics per DEC-010 (explicit founder direction to work epics
in strict numeric order).
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>