Ir al contenido

Arquitectura

CentralForms es una plataforma centralizada de formularios dinámicos que permite desacoplar la lógica de formularios de sitios web, portales, landings y aplicaciones consumidoras.

El sistema permite:

  • Definir formularios desde backend.
  • Exponer formularios mediante API REST.
  • Consumir formularios desde múltiples aplicaciones externas.
  • Renderizar formularios dinámicamente mediante SDK JavaScript.
  • Procesar submissions de forma centralizada.
  • Persistir envíos para auditoría y trazabilidad.
  • Ejecutar destinos configurables como email, webhook y futuras integraciones.

Vista general del sistema

CentralForms sigue una arquitectura desacoplada. Las aplicaciones consumidoras interactúan con un frontend o SDK, la API central gestiona seguridad y orquestación, las capas internas procesan y persisten la información, y los datos se envían a destinos configurables.

Arquitectura conceptual

1. Aplicación consumidora solicita formulario mediante GET.
2. API valida seguridad y retorna estructura + CSRF.
3. Usuario envía datos mediante POST.
4. API valida, procesa y persiste.
5. Se ejecutan destinos configurados: email, webhook u otros.

La arquitectura está organizada por responsabilidades para separar presentación, lógica de aplicación, dominio e infraestructura.

Arquitectura por capas

CapaComponenteResponsabilidad
Capa externaAplicaciones consumidorasSitios web, portales, aplicaciones internas y landings que consumen CentralForms.
Capa frontendEmbed JS / SDKIntegra el formulario en el frontend, renderiza campos dinámicos y ejecuta solicitudes GET/POST.
Capa APIControllersRecibe solicitudes HTTP y expone endpoints públicos y administrativos.
Capa APIControllers y configuración HTTPRecibe requests, aplica headers, rate limiting y delega validaciones de negocio/seguridad a servicios de aplicación.
Capa de aplicaciónForm ServiceObtiene definiciones de formularios y coordina la lógica funcional.
Capa de aplicaciónSubmission ServiceProcesa y almacena los envíos.
Capa de aplicaciónSecurity ServiceCentraliza validaciones de seguridad y reglas de acceso.
Capa de aplicaciónCSRF ServiceGenera, persiste, valida e invalida tokens CSRF.
Capa de dominioEntidadesDefine entidades como Consumer, Form, FormField, Submission, FormDestination, CsrfToken e IntegrationLog.
Capa de infraestructuraBase de datosPersiste formularios, envíos, tokens, destinos y logs.
Capa de infraestructuraEmail ServiceEnvía correos y notificaciones.
Capa de infraestructuraWebhook ServiceEjecuta integraciones HTTP con sistemas externos.

La solución está separada en cuatro proyectos principales:

CentralForms.Api
CentralForms.Application
CentralForms.Domain
CentralForms.Infrastructure
ProyectoResponsabilidad
CentralForms.ApiControllers, Swagger, CORS, Rate Limiting, Health Check y archivos estáticos del SDK.
CentralForms.ApplicationDTOs, interfaces, casos de uso y lógica de aplicación.
CentralForms.DomainEntidades del dominio.
CentralForms.InfrastructureEF Core, repositorios, servicios externos, SMTP, HTTP webhooks e integration logs.
ComponenteResponsabilidadObservaciones
CentralForms APIExpone endpoints REST y orquesta validaciones.Incluye Swagger/OpenAPI y Health Check.
SDK / Embed JSConsume la API y renderiza formularios dinámicos.Soporta validación visual, callbacks y renovación CSRF.
Servicios de aplicaciónImplementan lógica de negocio y procesamiento.No exponen entidades directamente.
Servicios de seguridadValidan API Key, Origin, CSRF y reglas de acceso.Se ejecutan antes de la lógica de negocio.
Base de datosPersiste formularios, campos, submissions, tokens y logs.SQL Server.
Email ServiceEnvía notificaciones SMTP.Se ejecuta como destino configurado.
Webhook ServiceEnvía submissions a sistemas externos.Usa FormDestination.Value como URL destino.
Destination DispatcherEjecuta destinos en background con scope DI independiente.Evita capturar el DbContext original del request HTTP.
ResponsabilidadAPIApplicationDomainInfrastructure
Recibir solicitudes HTTPNoNoNo
Exponer endpoints RESTNoNoNo
Documentar Swagger/OpenAPINoNoNo
Validar contrato de entradaNoNo
Aplicar reglas de negocioNoNo
Definir entidadesNoNoNo
Persistir datosNoNoNo
Enviar correosNoNoNo
Ejecutar webhooksNoNoNo
Registrar integration logsNoNo
Servir SDK JSNoNoNo
DecisiónDescripciónImpacto
Seguridad por capasAPI Key, Origin y CSRF se validan antes de la lógica de negocio.Reduce exposición de formularios públicos.
Separación por capasLas responsabilidades se separan entre API, aplicación, dominio e infraestructura.Facilita mantenimiento, pruebas y evolución.
Multi-tenant lógicoUn sistema soporta múltiples consumers mediante consumerCode.Permite reutilización para clientes, marcas y aplicaciones.
Procesamiento asíncronoEmail y Webhook se ejecutan en modo Fire & Forget.No bloquean la respuesta al usuario.
Uso de DTOsNo se exponen entidades directamente.Permite controlar el contrato API.
CSRF statefulEl token CSRF se genera en GET, se persiste y se valida en POST.Reduce riesgo de reutilización y falsificación de envíos.
Persistencia antes de integraciónLa submission se guarda antes de ejecutar email/webhook.Garantiza trazabilidad aun si una integración falla.
Integration LogsCada destino genera trazabilidad de ejecución.Permite diagnóstico operativo de email y webhook.

CentralForms centraliza la definición, exposición, validación, persistencia y despacho de formularios. No reemplaza sistemas propietarios de clientes ni plataformas externas de CRM, ERP o automatización.

Quedan fuera del alcance base de esta arquitectura:

  • Admin Panel completo para gestión visual de formularios.
  • Autenticación administrativa con usuarios, roles y permisos.
  • Reintentos automáticos avanzados para integraciones fallidas.
  • Dead-letter queue.
  • Motor avanzado de plantillas.
  • Procesamiento sincrónico de email o webhook.
  • Orquestación compleja de flujos externos.
  • Gestión de campañas o automatizaciones comerciales.

Todas las solicitudes pasan por validaciones de seguridad antes de acceder a la lógica de negocio.

Flujo de validación de seguridad

1. Validar API Key.
2. Validar Origin cuando el header viene informado.
3. Validar CSRF, solo en POST.
4. Validar datos del formulario.
5. Procesar lógica de negocio.

El flujo GET obtiene la definición de un formulario dinámico junto con un token CSRF para el envío posterior.

Flujo GET formulario

Obtener la estructura del formulario, sus campos configurados y un token CSRF válido para proteger el flujo POST.

GET /api/forms/{consumerCode}/{formCode}
  1. El usuario accede a una página que integra CentralForms.

  2. El SDK o frontend realiza una solicitud GET al endpoint:

    /api/forms/{consumerCode}/{formCode}
  3. La API recibe la solicitud y valida la API Key del consumidor.

  4. La API valida que el Origin esté autorizado cuando el header viene informado.

  5. Si las validaciones son correctas, la API solicita al servicio de aplicación la definición del formulario.

  6. El servicio obtiene el formulario y sus campos desde la base de datos.

  7. La API genera un token CSRF para proteger futuros envíos.

  8. El token CSRF se almacena con estado activo.

  9. La API responde al frontend con:

    • Definición del formulario.
    • Campos configurados.
    • Token CSRF.
  10. El SDK o frontend renderiza el formulario dinámicamente al usuario.

ElementoDescripción
Definición del formularioTítulo, descripción y metadatos del formulario.
CamposLista ordenada de campos con tipo, obligatoriedad, placeholder y opciones.
Token CSRFToken stateful de un solo uso para validar el envío POST.
CódigoErrorDescripción
401API Key inválida o ausenteLa API Key no fue enviada o no coincide con el hash almacenado.
401Consumer inactivoEn el código actual se maneja como acceso no autorizado.
403Origin no permitidoEl dominio de la aplicación consumidora no está autorizado cuando el header Origin viene informado.
404Formulario no encontradoEl consumer o formulario solicitado no existe o no está disponible.
500Error interno del servidorError inesperado durante consulta, validación o generación del token.
  • Todas las validaciones de seguridad se ejecutan antes de acceder a la lógica de negocio.
  • Este flujo no registra submissions.
  • La información retornada es de solo lectura.
  • El token CSRF generado será utilizado en el flujo POST.
  • La generación y almacenamiento del CSRF es el único cambio de estado de este flujo.
  • Todas las comunicaciones deben realizarse sobre HTTPS en ambientes reales.

El flujo POST valida, procesa y almacena el envío de un formulario dinámico.

Flujo POST submission

Validar la solicitud, persistir la submission y delegar la ejecución de destinos configurados como email o webhook.

POST /api/forms/{consumerCode}/{formCode}/submit
  1. El usuario completa el formulario y lo envía desde la interfaz.

  2. El SDK o frontend realiza una solicitud POST al endpoint:

    /api/forms/{consumerCode}/{formCode}/submit
  3. La solicitud incluye:

    • X-Api-Key
    • X-CSRF-Token
    • Origin
    • Content-Type: application/json
  4. La API recibe la solicitud y valida la API Key del consumidor.

  5. La API valida el Origin cuando el header viene informado para asegurar que proviene de un dominio autorizado.

  6. La API valida el token CSRF, verificando:

    • Existencia.
    • Vigencia.
    • No reutilización.
    • Correspondencia con el consumer y formulario.
  7. La API valida los campos enviados según las reglas definidas en el formulario:

    • Campos requeridos.
    • Formatos.
    • Tipos de datos.
  8. Si las validaciones son correctas, la API envía los datos al servicio de aplicación para su procesamiento.

  9. El servicio de aplicación persiste la Submission en la base de datos.

  10. El sistema marca el token CSRF como utilizado.

  11. El servicio de aplicación delega la ejecución de destinos al DestinationDispatcher.

  12. El DestinationDispatcher ejecuta destinos configurados en background:

    • Email Service.
    • Webhook Service.
  13. La API responde con estado exitoso:

    200 OK
  14. El SDK o frontend muestra una confirmación al usuario.

ValidaciónDescripción
API KeyVerifica que el consumer esté autenticado.
Consumer activoVerifica que el consumer pueda operar.
OriginVerifica que el dominio esté autorizado cuando el header viene informado.
CSRF TokenVerifica existencia, vigencia, uso único y correspondencia con consumer/formulario.
CamposVerifica requeridos, formatos y tipos de datos.
CódigoErrorDescripción
400Campos inválidos o requeridos faltantesUno o más campos no cumplen las reglas del formulario.
401API Key inválida o ausenteLa API Key no fue enviada o no coincide con el hash almacenado.
401Consumer inactivoEn el código actual se maneja como acceso no autorizado.
403Origin no permitidoEl dominio de la aplicación consumidora no está autorizado cuando el header Origin viene informado.
403CSRF inválido, expirado o reutilizadoEl token no existe, expiró, fue reutilizado o no corresponde al formulario/consumer.
404Formulario no encontradoEl consumer o formulario solicitado no existe o no está disponible.
429Rate limit superadoSe excedió el límite de solicitudes permitido para submit.
500Error interno del servidorError inesperado durante validación, persistencia o procesamiento.
  • Todas las validaciones de seguridad se ejecutan antes de cualquier procesamiento de negocio.
  • El token CSRF es obligatorio y debe haber sido generado previamente en el flujo GET.
  • La submission se guarda antes de ejecutar integraciones externas.
  • Los destinos Email y Webhook se ejecutan de forma asíncrona.
  • Email y Webhook no bloquean la respuesta inmediata al usuario.
  • Un 200 OK significa que la submission fue validada y persistida, no que las integraciones externas hayan finalizado correctamente.
  • El resultado de email y webhook debe revisarse en IntegrationLogs.
  • Todas las comunicaciones deben realizarse sobre HTTPS en ambientes reales.

Procesamiento, email, webhook y persistencia

Sección titulada «Procesamiento, email, webhook y persistencia»

El procesamiento de submissions prioriza persistencia y trazabilidad. Las integraciones externas se ejecutan de forma desacoplada para evitar que errores o latencias externas afecten la respuesta principal.

1. Validación completada.
2. Persistencia de submission.
3. Ejecución asíncrona de destinos.
4. Respuesta al cliente.
AspectoDescripción
Entidad principalSubmissions
Datos almacenadosConsumer, formulario, datos JSON, metadata y fecha de creación.
ReglaLa submission se guarda antes de ejecutar integraciones externas.
BeneficioTrazabilidad, auditoría y posibilidad de reprocesamiento futuro.
AspectoDescripción
PropósitoEnviar notificaciones por correo electrónico basadas en el envío del formulario.
ConfiguraciónDestinatarios, asunto, plantilla y variables dinámicas.
EjecuciónAsíncrona, no bloqueante.
FallosSe registran en IntegrationLogs y no afectan el 200 OK si la submission ya fue persistida.
AspectoDescripción
PropósitoEnviar submissions a sistemas externos mediante HTTP.
ConfiguraciónURL destino, método POST y headers personalizados si aplica.
EjecuciónAsíncrona, no bloqueante.
Casos de usoCRM, ERP, automatizaciones, integraciones de clientes.
CasoResultado
Submission persistida + email fallaPOST puede responder 200 OK; el error queda en IntegrationLogs.
Submission persistida + webhook fallaPOST puede responder 200 OK; el error queda en IntegrationLogs.
Fallo antes de persistirPOST no debe responder éxito.
Destino inválidoSe registra como Skipped o Failed según la validación.