Tabla de Contenidos

05 - Validación e invariancias

Con el CRUD de catálogos y productos del hito 04, la API ya existe y es exactamente la del contrato; lo que falta es rechazar correctamente lo que no admite. Este hito aplica el tema 03 — Validación e invariancias: dos preguntas distintas, respondidas en lugares distintos.

Pregunta Dónde se responde Mecanismo Respuesta
¿Cumple la petición el formato del contrato? La petición de entrada, en la capa de presentación Jakarta Validation 400 con campo y motivo
¿El estado propuesto es válido para el negocio? El dominio Invariantes en los modelos Excepción de dominio, mapeada al error del contrato

1. Constraints en el contrato

  1. Ampliar openapi.yaml (v0.1.1) con lo que la API admite: los constraints se redactan en el propio documento, porque describen el contrato, no el código.
Esquema Constraint
CatalogRequest.name minLength 1 · maxLength 80
CatalogRequest.description maxLength 240
ProductRequest.name minLength 1 · maxLength 80
ProductRequest.description maxLength 240
ProductRequest.price minimum 0.01 · maximum 999999.99
ProductRequest.stock minimum 0 · maximum 100000
ProductRequest.catalogId minimum 1
  1. Regenerar, con el generador preparado para ello (opciones en el tema 02): los constraints llegan al esqueleto como anotaciones Jakarta Validation, y la validación se dispara en el punto declarado por el propio contrato.

2. El 400 coherente con el contrato

3. Invariantes con value objects

La petición válida según el contrato puede seguir proponiendo un estado imposible para el negocio: el precio y el stock deben protegerse en el dominio.

  1. Crear los value objects del catálogo en domain, según la especificación: Money (precio: decimal mayor que cero, escala de 2) y Stock (entero no negativo). Cada uno valida en su construcción y lanza la excepción de dominio propia.
  2. El modelo Product pasa a componerse con ellos; la creación y la modificación de productos construyen primero los value objects: si una invariante falla, el estado inválido nunca llega a la persistencia.
  3. El mismo dato puede aparecer en las dos fronteras: minimum en el contrato (formato) y la validación del Money (invariante). No es redundancia: protegen fronteras distintas, como explica el tema.
La invariante no se confía a la validación de la petición: el value object la garantiza para cualquier código que construya un Money, no solo para el flujo que llega validado.

4. Pruebas

Criterios de prueba de este nivel, según el tema: qué probar y qué aislar.

Comprobación

Siguiente hito: hito 06 — Módulos: pedidos y API pública.