Pasos del Flujo
- Interacción del Cliente (Capa de Presentación): La interacción del usuario ocurre en un componente React (
page.tsxocontainer/opcional) dentro de una aplicaciónapps/*. - Llamada a Server Action (Punto de Entrada API): El componente invoca una función Server Action importada (
@core/actions). Esta función está marcada con'use server'. - Validación de Entrada (Action): La Server Action valida la entrada cruda recibida del cliente usando esquemas Yup compartidos (
@core/validation). Si la validación falla, devuelve un error inmediatamente (típicamente unActionResultconsuccess: falseyvalidationErrors). - Instanciar e Iniciar Máquina (Action): Si la validación tiene éxito, la Action:
- Resuelve cualquier dependencia necesaria, como la implementación correcta del Service usando su factory (
@core/services/[domain]/serviceMap.ts). - Instancia (
interpret) la máquina XState relevante (@core/machines), proporcionando la instancia del servicio resuelta y potencialmente otras configuraciones a través delcontextinicial. - Inicia el intérprete de la máquina.
- Envía el evento inicial (ej.,
{ type: 'CREATE', input: validatedInput }) a la máquina, pasando la entrada validada (ej., desdeInferTypede Yup). - Escucha/espera a que la máquina alcance un estado final.
- Resuelve cualquier dependencia necesaria, como la implementación correcta del Service usando su factory (
- Orquestar Lógica (Machine): La máquina XState transiciona a través de sus estados basada en eventos y su contexto interno. Su rol principal es la orquestación.
- Preparar Entrada de Servicio e Invocar (Machine): Dentro de estados específicos (a menudo usando servicios
invokeo accionesentry/exit), la máquina:- Construye el DTO de Entrada del Servicio apropiado (definido en
services/[domain]/domain/[Domain]Types.ts) usando datos de su contexto (como elvalidatedInputrecibido en el evento inicial). - Llama al método apropiado en la implementación del Servicio (pasado vía contexto) usando el DTO preparado (ej.,
context.userService.createUser(serviceInputDto)).
- Construye el DTO de Entrada del Servicio apropiado (definido en
- Procesar Salida de Servicio y Actualizar Contexto (Machine): Cuando la llamada al servicio invocada se completa:
- La máquina recibe el DTO de Salida del Servicio (definido en
services/[domain]/domain/[Domain]Types.ts). - Basándose en la estructura de este DTO de salida, la máquina actualiza su contexto interno (ej., extrayendo la entidad
Usercreada desdeoutputDto.usery almacenándola encontext.user, o almacenando un mensaje de error de un DTO de salida fallido encontext.error).
- La máquina recibe el DTO de Salida del Servicio (definido en
- Alcanzar Estado Final (Machine): La máquina eventualmente transiciona a un estado terminal (ej.,
success,failure), indicado portype: 'final'. - Devolver Resultado Estructurado (Action → Client): La Server Action, habiendo esperado el estado final de la máquina:
- Inspecciona el estado final y el contexto de la máquina.
- Formatea el resultado en un objeto
ActionResultestándar (ej.,{ success: true, data: finalMachineContext.user }o{ success: false, error: finalMachineContext.error }). - Devuelve este
ActionResultal componente cliente que realizó la llamada.
Roles Claros:
- Client (
apps/*): Renderiza UI (mappnext/ds-tw), captura entrada del usuario, llama a Actions, muestra resultados/errores desdeActionResult. - Action (
@core/actions): Límite de la API. Valida entrada (Yup), resuelve dependencias (Services), interpreta e inicia la Machine, espera resultado, formateaActionResult. - Machine (
@core/machines): Orquesta el flujo (XState). Mapea entrada validada a DTOs de Servicio, invoca métodos del Servicio, procesa DTOs de salida del Servicio, gestiona estado/contexto interno. - Service (
@core/services): Ejecuta tareas discretas. Define contrato (Interface + DTOs endomain/), implementa lógica (Classes enimplementations/), interactúa con DB/APIs externas.
Ejemplo Abreviado: Flujo Crear Usuario (Action → Machine → Service)
Este ejemplo simplificado demuestra el flujo central: Action valida e inicia la máquina, la máquina prepara un DTO y llama al servicio, el servicio realiza el trabajo usando su contrato definido, y el resultado fluye de regreso. 1. Tipos Base (@core/types)
@core/validation)
@core/services/user/domain)
@core/services/user/implementations)
@core/services/user/serviceMap.ts & index.ts)
@core/machines)
@core/actions)
apps/[appName]/app/.../page.tsx)
Resumen de Rutas de Importación de Ejemplo
Importaciones Típicas mostrando estructura correcta y uso de DTO