Files
vmall/openspec/changes/archive/2026-09-17-replace-mock-api-wave-6/specs/brand/spec.md
T
james e457339847 chore(openspec): archive wave 6 and close the migration tracker
The merge creates the brand capability (two requirements) and extends the
catalog browse requirement with the brand filter, the sales sort and a real
sold count. openspec validate --all --strict stays green at 14 specs.

With every box now checked, docs/TBD-migrate-wave.md is deleted, as its own
instructions require. Its two durable notes move to the README instead of
disappearing with it:

- `nuxt build` does not typecheck, so a green build is not the type gate the
  verification section claimed. AGENTS.md told me to treat it as one, which is
  why waves 1-5 over-reported "builds pass" as evidence.
- the list of what stays deliberately mock: addresses, coupons, favourites,
  account stats, the seckill/collective/integral pages, reviews, and the
  fixed-data adapter itself, which the adapter spec requires for rollback.

The README's verification block also gains the real test count (29, not 16).
2026-09-17 17:36:22 +00:00

1.7 KiB

Spec Delta

Purpose

The product brand registry: a bilingual, admin-managed list of manufacturers that products reference, shoppers filter listings by, and the storefront shows on a product.

ADDED Requirements

Requirement: Public brand list

GET /api/brands SHALL return the brands without authentication, ordered by their stored position, each with an id, slug and bilingual name. Products SHALL carry a nullable brand_id referring to that list, and GET /api/products SHALL accept a brand_id filter that composes with the existing category, shop and keyword filters.

Scenario: filter a listing by brand

  • WHEN a shopper filters the catalog by a brand
  • THEN only that brand's published products are returned, and the filter combines with a category filter rather than replacing it

Scenario: a product without a brand

  • WHEN a product has no brand assigned
  • THEN it is still listed and its brand_id is null rather than pointing at an invented brand

Requirement: Brand management

A platform admin SHALL replace the brand list with PUT /api/admin/brands, which validates each entry, applies as one transaction and reindexes positions from the submitted order; the write SHALL require the platform_admin role. Each entry SHALL carry a slug and non-empty en and zh names, and a rejected list SHALL leave the stored brands untouched.

Scenario: replace round-trips

  • WHEN an admin replaces the brands and then reads them publicly
  • THEN the public list matches, in the submitted order

Scenario: incomplete bilingual name is refused

  • WHEN an admin submits a brand with only en text
  • THEN the request fails and the stored brands are unchanged