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

2.2 KiB

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).