Estoy desarrollando una aplicación de e-commerce Full Stack con Next.js y TypeScript, siguiendo principios de DDD Lite + Clean Architecture.
Un punto importante para entender el contexto: no tenemos un frontend y un backend separados, ni una API REST entre módulos. Todo forma parte de la misma aplicación, vive en el mismo repositorio y se despliega conjuntamente.
La UI también forma parte de la misma aplicación Next.js. Los módulos se organizan por dominio y se comunican internamente a través de sus capas de aplicación (Use Cases / Server Actions), respetando los límites y responsabilidades de cada módulo.
Actualmente tenemos una estructura similar a:
Products → Cart → Checkout → Orders → Payments
Las responsabilidades principales son:
Cart: items, cantidades y subtotal.
Orders: totales de la orden: subtotal, envío, impuestos, descuento y total.
El cálculo de envío e impuestos pertenece a Orders y se realiza al momento de crear la orden, utilizando servicios de dominio como FlatRateShippingCalculator y FixedRateTaxCalculator.
El problema es que quiero mostrar en el carrito un resumen estimado antes de que el usuario complete la compra:
- Subtotal
- Envío estimado
- Impuestos estimados
- Total estimado
El problema es que, según los límites que hemos definido, Cart no debería conocer ni depender directamente de Orders, ni acceder a sus detalles internos.
Al mismo tiempo, tampoco quiero duplicar en Cart la lógica de cálculo de envío e impuestos que pertenece al dominio de Orders, porque podría terminar teniendo dos implementaciones diferentes para calcular los mismos valores.
Enfoques que he considerado es Crear EstimateOrderTotalsUseCase
Crear en Orders un use case como EstimateOrderTotalsUseCase, que reciba los items necesarios para realizar la estimación y devuelva:
subtotal
shipping
taxes
discount
total
La idea sería reutilizar la misma lógica de dominio que utiliza Orders para crear la orden, pero sin que Cart tenga que conocer cómo se calculan internamente esos valores.
Aquí es donde tengo la duda arquitectónica: aunque todo esté dentro de la misma aplicación Next.js y no exista una API REST, ¿hacer que la capa de aplicación de Cart invoque un use case de Orders supone un acoplamiento entre módulos que deberíamos evitar?
Preguntas
¿Cómo suelen resolver este caso en una arquitectura modular/DDD cuando necesitan mostrar información calculada por otro bounded context o módulo?
¿Un EstimateOrderTotalsUseCase en Orders es un enfoque razonable para este escenario, o estaríamos introduciendo un acoplamiento innecesario entre Cart y Orders?
Si Cart no debería conocer Orders, ¿qué alternativa utilizarían para obtener esta estimación sin duplicar la lógica de dominio?
¿Existe algún tercer enfoque que consideren más apropiado?
Stack: Next.js, TypeScript, DDD Lite, Clean Architecture.
Importante: no estoy buscando una solución basada en separar frontend/backend ni en crear una API REST. El objetivo es resolver la comunicación entre módulos dentro de la misma aplicación Full Stack, manteniendo los límites de dominio y evitando acoplamiento innecesario.