# Index: Catalog Domain design: `docs/domains/catalog.md`. Specs: `openspec/specs/product/`, `category/`, `brand/`. ## Backend (`apps/api`) | File | Holds | |---|---| | `src/modules/product/service.rs` | public list/detail, merchant CRUD, publish/unpublish, SKU upsert, template link validation | | `src/modules/product/repo.rs` | SKU attach + sold_count aggregation | | `src/modules/category/` | public category tree | | `src/modules/brand/` | public list; admin whole-list replacement | | `migrations/0003_catalog.sql`, `0005_seed_category_tree.sql`, `0008_brands.sql` | schema + seeds | ## Shared contract `types.ts`: `Product`, `Sku`, `Category`, `Brand`, `ProductStatus`. `api.ts`: `listProducts`, `getProduct`, `listCategories`, `listBrands`, `shop.*` product/SKU methods, `admin.replaceBrands`. ## Frontends - Mall: `pages/index.vue` (floors), `pages/search.vue`, `pages/goods/[id].vue`, `components/ui/ProductCard.vue` - Shop-admin: `pages/products/{index,new,[id]}.vue`, `components/ProductForm.vue` - Admin: `pages/brands.vue`