Skip to main content

Pasos del Flujo

  1. Interacción del Cliente (Capa de Presentación): La interacción del usuario ocurre en un componente React (page.tsx o container/ opcional) dentro de una aplicación apps/*.
  2. 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'.
  3. 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 un ActionResult con success: false y validationErrors).
  4. 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 del context inicial.
    • 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., desde InferType de Yup).
    • Escucha/espera a que la máquina alcance un estado final.
  5. 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.
  6. Preparar Entrada de Servicio e Invocar (Machine): Dentro de estados específicos (a menudo usando servicios invoke o acciones entry/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 el validatedInput recibido 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)).
  7. 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 User creada desde outputDto.user y almacenándola en context.user, o almacenando un mensaje de error de un DTO de salida fallido en context.error).
  8. Alcanzar Estado Final (Machine): La máquina eventualmente transiciona a un estado terminal (ej., success, failure), indicado por type: 'final'.
  9. 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 ActionResult estándar (ej., { success: true, data: finalMachineContext.user } o { success: false, error: finalMachineContext.error }).
    • Devuelve este ActionResult al 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 desde ActionResult.
  • Action (@core/actions): Límite de la API. Valida entrada (Yup), resuelve dependencias (Services), interpreta e inicia la Machine, espera resultado, formatea ActionResult.
  • 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 en domain/), implementa lógica (Classes en implementations/), 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)
2. Esquema de Validación (@core/validation)
3. Definición del Servicio (@core/services/user/domain)
4. Implementación del Servicio (@core/services/user/implementations)
5. Resolución del Servicio (@core/services/user/serviceMap.ts & index.ts)
6. Máquina XState (@core/machines)
7. Server Action (@core/actions)
8. Página UI (apps/[appName]/app/.../page.tsx)

Resumen de Rutas de Importación de Ejemplo

Importaciones Típicas mostrando estructura correcta y uso de DTO