Files
mercadodevida/work/artifacts/F-100/architect.md
2026-08-21 13:28:14 +02:00

33 lines
2.2 KiB
Markdown

# F-100 — Arquitectura: generación automática de SKU a partir del título
## Estado actual
- En `POST /products` (catálogo) se crea una variante por defecto con `sku = "SKU-MV-${productId}"`.
- El admin no expone la edición del SKU en `PriceStockSection` (sólo EAN, precios, stock).
- No hay endpoint de "sugerir SKU" en el backend.
## Decisiones
1. **Helper puro** `src/modules/catalog/domain/sku.ts`:
- `generateSkuFromTitle(title)`: normaliza el título (mayúsculas, sin diacríticos, sin caracteres no alfanuméricos, guiones separadores, recorte a 100 chars). Devuelve `MV-<SLUG>`.
- `uniqueSku(base, existing: Set<string>)`: si el base está ocupado, prueba `base-2`, `base-3`, … hasta encontrar uno libre.
2. **Backend**:
- Cambiar la creación de producto para usar el SKU derivado del título en lugar del UUID; mantener `uniqueSku` para resolver colisiones.
- Endpoint nuevo `POST /admin/products/sku:generate` con body `{ title: string }``{ sku: string }`. Útil para preview antes de crear.
- Permitir que el admin edite el SKU en la sección "Precios y Stock" (PriceStockSection). Persistencia vía `PATCH /products/:id/variants/:variantId`.
3. **Admin UI** (`apps/admin`):
- `api-client.ts`: `productsApi.generateSku(title)` y `productsApi.updateVariant(id, vid, { sku })`.
- Sección "Precios y Stock": muestra el SKU actual como input editable con botón "Regenerar" que llama al endpoint.
- Página de creación de producto: llama a `generateSku` al blur del nombre para previsualizar el SKU.
4. **Validación**:
- SKU: `^[A-Za-z0-9-]+$`, 1..100 chars (alineado con `newVariantSchema`).
- El endpoint `/admin/products/sku:generate` sólo da sugerencias; el cliente decide.
- Duplicados: PostgreSQL ya rechaza por `UNIQUE` en `product_variants.sku`. Aclarar el error al admin con un mensaje claro.
## Tests
- `sku.test.ts` (6-8): normalización, acentos, longitudes, collision in `uniqueSku`.
- Añadir test al repositorio Variantes (e2e) si el repo expone `findBySku`: comprobar que se devuelve un SKU existente para validar.
## Fuera de alcance
- Sin servicio externo de SKU.
- Sin relajar la unicidad.
- Sin afectar a las variantes ya creadas (migración no requerida).