# Spec delta: catalog ## ADDED Requirements ### Requirement: Localized product content Product and category names/descriptions SHALL be stored as JSONB maps keyed by locale (`en`, `zh`). The API MUST return the full map; clients pick the display locale. #### Scenario: bilingual round-trip - **WHEN** a shop owner creates a product with name `{"en": "Mug", "zh": "马克杯"}` - **THEN** both public detail and shop-admin GET return the identical map ### Requirement: Publish lifecycle Products SHALL have status `draft | published | unpublished`. Only `published` products appear in public list/detail. #### Scenario: publish then unpublish - **WHEN** a product is published - **THEN** it appears in `GET /api/products` - **WHEN** it is unpublished - **THEN** public detail returns 404 and it disappears from listings #### Scenario: publish requires sellable SKU - **WHEN** publishing a product with no active SKU having price > 0 - **THEN** the API returns 400 ### Requirement: Shop isolation Shop-role users SHALL only see and mutate their own shop's products under `/api/shop/products`. #### Scenario: cross-shop access denied - **WHEN** shop owner A requests `/api/shop/products/{id}` of shop B - **THEN** the API returns 404 ### Requirement: SKU pricing Each SKU SHALL carry `price_minor` (integer minor units) and an ISO `currency` code; stock is a non-negative integer. #### Scenario: negative stock rejected - **WHEN** upserting a SKU with stock < 0 - **THEN** the API returns 400