Action Engine
Qué es Action Engine
Action Engine es infraestructura compartida para ejecutar acciones de negocio mediante un contrato tipado.
DYONA define QUÉ acción ejecutar y CON QUÉ contexto.
La aplicación consumidora decide CÓMO ejecutarla.
Action Engine no conoce fetch ni Axios, URLs, endpoints, JWT ni autenticación, backend ni reglas de negocio. Esas decisiones permanecen en la aplicación consumidora.
DyonaAction
type DyonaAction = {
id: string;
label: string;
icon?: string;
scope: 'global' | 'record';
requiresParameters?: boolean;
};
globalse ejecuta sin requerir un record seleccionado.recordse ejecuta sobre un record y requierecontext.record.requiresParametersindica que debe proveerse un objeto de parámetros antes de ejecutar. Esto se desarrolla en Action Dialog.
DyonaActionContext
type DyonaActionContext = {
sourceId?: string;
record?: Record<string, unknown>;
values?: Record<string, unknown>;
parameters?: Record<string, unknown>;
};
El contexto lleva la información que la aplicación necesita para ejecutar una acción. Una acción record requiere context.record; sourceId, values y parameters son contexto opcional entregado por quien llama.
Ejecutar una acción
Este ejemplo completo usa una acción de record Aprobar pedido. El executor solo simula lógica de aplicación: no inventa backend ni endpoint.
import {
executeDyonaAction,
type DyonaActionExecutor,
} from '@typhonsoftware/dyona-form';
const action = {
id: 'approve-order',
label: 'Aprobar pedido',
scope: 'record',
} as const;
const context = {
sourceId: 'orders',
record: {id: 1024, status: 'pending'},
};
const executor: DyonaActionExecutor = async ({context}) => {
// La lógica de negocio de la aplicación va aquí.
return {
success: true,
message: 'Pedido aprobado',
data: {
id: context.record?.id,
},
};
};
const result = await executeDyonaAction(action, context, executor);
Flujo de ejecución
DyonaAction
+
DyonaActionContext
↓
executeDyonaAction()
↓
DyonaActionExecutor
↓
DyonaActionResult
Acciones globales
Una acción global usa el mismo contrato, pero no requiere un record.
const globalAction = {
id: 'generate-order-summary',
label: 'Generar resumen de pedidos',
scope: 'global',
} as const;
const globalExecutor: DyonaActionExecutor = async () => ({
success: true,
message: 'Resumen de pedidos generado',
data: {totalOrders: 42},
});
await executeDyonaAction(
globalAction,
{sourceId: 'orders'},
globalExecutor,
);
DyonaActionResult
De forma introductoria, un resultado de acción puede incluir:
success: si la acción tuvo éxito.message: un mensaje de resultado para que la aplicación presente.fieldErrors: mensajes de backend por campo, indexados por nombre de campo.data: datos devueltos específicos de la aplicación.refresh: destinos que pueden necesitar actualizarse.
refresh y fieldErrors se explican con más detalle en Action Result + Refresh. Cuando este resultado se devuelve desde onSubmit o un onAction custom de DyonaForm, DyonaForm también presenta el feedback correspondiente de éxito, error general y error de campo.
Por qué importa
Los componentes actuales y futuros de DYONA pueden reutilizar el mismo contrato de acciones sin acoplarse a un backend. Cada aplicación consumidora conserva su transporte, autenticación y lógica de negocio, mientras comparte un límite de ejecución consistente.
Continuar aprendiendo
- Data Sources — otro contrato de infraestructura compartida.
- Probar Actions en el Lab →