57 lines
2.7 KiB
Markdown
57 lines
2.7 KiB
Markdown
# Implementer — F-009 Brands module
|
|
|
|
done -> work/artifacts/F-009/implementer.md
|
|
|
|
## Summary
|
|
Implemented brands as an independent backend module with slug URLs and SEO metadata, added product-brand assignment to catalog, and extended public product search with a brand filter.
|
|
|
|
## Changed files
|
|
- `project/src/modules/brands/domain/brand.ts`
|
|
- `project/src/modules/brands/domain/errors.ts`
|
|
- `project/src/modules/brands/domain/ports.ts`
|
|
- `project/src/modules/brands/application/brand-use-cases.ts`
|
|
- `project/src/modules/brands/infrastructure/pg-brand-repository.ts`
|
|
- `project/src/modules/brands/api/brands.routes.ts`
|
|
- `project/src/modules/brands/index.ts`
|
|
- `project/migrations/007_brands.js`
|
|
- `project/src/modules/catalog/domain/product.ts`
|
|
- `project/src/modules/catalog/domain/errors.ts`
|
|
- `project/src/modules/catalog/domain/ports.ts`
|
|
- `project/src/modules/catalog/application/product-use-cases.ts`
|
|
- `project/src/modules/catalog/infrastructure/pg-product-repository.ts`
|
|
- `project/src/modules/catalog/api/catalog.routes.ts`
|
|
- `project/src/app/build-app.ts`
|
|
- `project/src/app/tests/brands.itest.ts`
|
|
- `project/src/app/tests/catalog.itest.ts`
|
|
- `work/artifacts/F-009/architect.md`
|
|
- `backlog/features.json`
|
|
- `work/current.md`
|
|
|
|
## Acceptance traceability
|
|
1. Duplicate brand slug returns HTTP 409
|
|
- Implemented through `brands_brands.slug UNIQUE` and `BRAND_SLUG_EXISTS` mapping.
|
|
- Covered by `project/src/app/tests/brands.itest.ts`.
|
|
2. Products list filterable by brand
|
|
- `GET /products/search?brandSlug=<slug>` filters active products by stored `catalog_products.brand_id` joined to `brands_brands.slug`.
|
|
- Covered by `project/src/app/tests/catalog.itest.ts`.
|
|
3. Public URL is `/marca/<slug>`
|
|
- Implemented `GET /marca/:slug` and serialized `url: /marca/<slug>`.
|
|
- Covered by `project/src/app/tests/brands.itest.ts`.
|
|
4. `verify.sh` green
|
|
- Verified after implementation.
|
|
|
|
## Commands run
|
|
- `cd project && npm run typecheck` — PASS
|
|
- `cd project && npm test` — PASS: 59 passed, 31 skipped (DB integration skipped without `TEST_DATABASE_URL`)
|
|
- `cd project && npm run lint` — PASS after Prettier normalization
|
|
- `cd project && npm run build` — PASS
|
|
- `cd project && npm run lint:boundaries` — PASS: 79 files checked
|
|
- `./scripts/verify.sh` — PASS
|
|
|
|
## Notes
|
|
- No new npm dependencies.
|
|
- Brand mutation routes are admin-only via shared auth injected from the composition root.
|
|
- Public brand reads are unauthenticated.
|
|
- Catalog references `brands_brands` only at repository/SQL boundary; it does not import brands module internals.
|
|
- Documentation stage should update README/API notes because new user-facing brand endpoints, product brand assignment, and product error code were added.
|