Hasta aquí la tienda era un solo bloque por capas. Este hito aplica el tema 04 — Monolito modular: se añade el segundo problema de negocio, pedidos, y con él la organización en módulos — cada uno protege su interior y expone una API pública. Los pedidos reservan el stock del catálogo por esa API: la primera colaboración síncrona entre módulos de la práctica.
| Pieza | Cambio en este hito |
|---|---|
| Contrato | v0.2.0: las operaciones de pedidos |
| Estructura | Paquetes catalog y orders como módulos; API pública del catálogo |
| Verificación | Límites entre módulos con Spring Modulith; capas internas con ArchUnit |
openapi.yaml (v0.2.0) las operaciones de pedidos y regenerar:| Operación | Petición | Respuestas |
|---|---|---|
| Crear pedido | POST /api/orders · OrderRequest | 201 · 400 · 404 · 409 |
| Ficha de pedido | GET /api/orders/{id} | 200 · 404 |
| Cancelar | POST /api/orders/{id}/cancel | 200 · 404 · 409 |
OrderRequest (userId y líneas), OrderLineRequest (productId, quantity), OrderLine (productId, quantity, unitPrice) y Order (id, userId, state, lines, total).userId de OrderRequest es provisional: no hay usuarios todavía y el comprador se indica en el cuerpo. En el hito 08 la identidad vendrá del token y el campo desaparecerá del contrato.
git mv, para conservar el historial): el catálogo queda dentro de shop.catalog; el pedido nace directamente en shop.orders; la raíz de composición — ShopApplication y la configuración de arranque — queda en el paquete base.CatalogApi del esquema de la especificación, expuesta en catalog.api. Por ella cruzan al pedido las capacidades que necesita — reservar las unidades de una línea, dejando capturado el precio del momento, y liberar las reservadas al cancelar —, con sus datos y sus errores. La forma exacta de esa API — firmas, datos, qué excepciones cruzan el límite — es diseño de cada quien; lo fijo es el resultado: si una línea falla, el stock queda como estaba y no se crea nada.orders lo compone cada quien con las piezas del tema 04 — REST propio, casos de uso, servicio y persistencia JDBC —. Las tablas orders y order_lines de la especificación entran en el init.sql (reiniciar el volumen de MariaDB para recargar la semilla); el precio de cada línea se guarda capturado (unit_price de la especificación).CREATED; cancelar un pedido ya cancelado es un estado imposible del dominio de pedidos, que responde 409. También se mapean los errores del catálogo que llegan al pedido: 404 para producto desconocido, 409 para stock insuficiente.
La verificación de módulos pasa a correr con cada build, según el tema 04: los límites entre módulos con Spring Modulith y las reglas de capas dentro de cada módulo con ArchUnit. Opcional: generar la documentación de módulos con el Documenter del tema.
CANCELLED; cancelar dos veces falla.orders solo consume la API pública del catálogo: lo comprueba la verificación, no la buena voluntad.hito-06.Siguiente hito: hito 07 — Persistencia con JPA.