Saltar al contenido
juancespedes.dev
Todos los proyectos
Caso de estudioAnonimizado

Plataforma de un foro corporativo, del registro al certificado

Diseñé, construí y operé en solitario la plataforma de un foro del sector energético, con agenda, credencial digital con QR, encuestas, 156 certificados PDF auditados y memorias del evento, todo con inicio de sesión corporativo.

Ficha del proyecto

Rol
Desarrollador full-stack y operador único, del diseño a la guardia el día del evento
Periodo
jul de 2026 a sept de 2026
Enlaces públicos
Sistema interno: el código es privado, y los nombres, datos y diagramas se omitieron o se recrearon.
  • 163

    invitados recibieron su QR personal por correo, verificado uno a uno antes del envíoFuente: Registro del envío masivo, agosto de 2026
  • 156

    certificados PDF generados y revisados por dos auditores automáticos independientesFuente: Scripts de generación y auditoría de certificados, agosto de 2026
  • 9 días

    entre el primer commit y el día del foro, con el sistema operando en vivoFuente: Historial de git, julio y agosto de 2026

El problema

El área de comunicaciones de una generadora organizaba su primer foro corporativo y necesitaba resolver todo el ciclo del evento en una sola herramienta, desde difundir la agenda y los ponentes hasta registrar y acreditar a los invitados, medir la satisfacción y entregar certificados y memorias.

Mi rol

  • Diseñé la experiencia a partir de las piezas gráficas oficiales, midiendo colores y medidas directamente de los PDF.
  • Construí la SPA, el servidor, la autenticación corporativa y los envíos de correo.
  • Desplegué en Linux con nginx y systemd endurecido, y estuve de guardia el día del foro.
  • Después del evento generé los certificados, publiqué la galería y agregué un módulo de tarjetas de presentación digitales.

Restricciones

  • Nueve días entre el primer commit y el día del foro.
  • Cientos de asistentes entrando a la vez desde la misma red corporativa.
  • Datos personales mínimos, porque el servidor no debía conocer nombres ni documentos de identidad.
  • Una sola persona a cargo del desarrollo, el despliegue y la operación.

Decisiones

  1. 01

    Inicio de sesión corporativo con OIDC y PKCE

    Los invitados ya tenían cuenta en el directorio de la empresa. Microsoft Entra ID resolvió identidad y roles sin crear contraseñas nuevas, y Microsoft Graph envió los correos desde el buzón institucional.

    Descartado

    • Un registro propio con correo y contraseña
  2. 02

    El servidor solo conoce identificadores opacos

    Certificados y descargas se sirven con manifiestos de identificador a archivo, generados fuera del servidor. Nadie puede pedir el certificado de otra persona porque la ruta no recibe parámetros.

    Descartado

    • Guardar nombres y documentos en la base de datos del servidor
  3. 03

    La encuesta se libera con el reloj del servidor

    La dirección de la encuesta de satisfacción solo llega al navegador cuando el reloj del servidor pasa la hora de cierre, así nadie la responde antes de que termine el foro.

    Descartado

    • Ocultarla con un temporizador en el navegador
  4. 04

    Operaciones peligrosas con dos llaves

    El envío masivo tiene modo simulacro, tope de destinatarios y reanudación, y abrirlo a todos los invitados exige cambiar dos variables a la vez.

    Descartado

    • Un script que envía directamente a toda la lista

Arquitectura

Una SPA en React habla con un servidor Express que concentra la seguridad HTTP, la autenticación con Microsoft Entra ID y los envíos con Microsoft Graph. Certificados y memorias se generan en la estación de trabajo y llegan al servidor como artefactos verificados.
  1. Asistentes

    • SPA del foroAgenda, credencial con QR, encuestas y certificados
  2. Borde

    • nginxTLS y límite de peticiones por zona
  3. Servidor

    • Servidor ExpressCSP, CSRF, sesiones y rutas sin parámetros libres
    • Compuerta de encuestasDecide con el reloj del servidor
    • Tarjetas de presentaciónSQLite
  4. Microsoft 365

    • Microsoft Entra IDOIDC con PKCE y roles
    • Microsoft GraphCorreos de inscripción y QR
  5. Estación de trabajo

    • Generadores en PythonCertificados PDF y memorias, con auditoría

Cómo se mueven los datos

  1. SPA del forohacianginxHTTPS
  2. nginxhaciaServidor ExpressNavegaciones y API
  3. Servidor ExpresshaciaMicrosoft Entra IDInicio de sesión
  4. Servidor ExpresshaciaMicrosoft GraphCorreo transaccional
  5. Compuerta de encuestashaciaSPA del foroEncuesta solo después del cierre
  6. Generadores en PythonhaciaServidor ExpressArtefactos por manifiesto

Resultados

  • El sistema operó en vivo el día del foro sin guardar datos personales en el servidor.
  • Cada uno de los 163 códigos QR se decodificó antes de enviarlo, y el envío se hizo una sola vez.
  • Se publicaron 156 certificados y 77 fotos, con descargas de memorias en streaming (el paquete más grande pesaba 1,33 GB).
  • Los incidentes de producción quedaron resueltos y documentados con su causa.

Qué haría distinto

  • Ensayaría la carga del día del evento con tráfico simulado desde una sola IP, en lugar de dimensionar solo con cálculos.
  • Separaría desde el inicio lo que debía seguir vivo después del evento, como las tarjetas de presentación, de lo que era efímero.

Tecnologías

  • React
  • TypeScript
  • Vite
  • Node.js
  • Express
  • Microsoft Entra ID
  • Microsoft Graph
  • SQLite
  • Python
  • Playwright
  • nginx
  • systemd