Sistema de Notificaciones Electrónicas
Sistema de notificaciones electrónicas que reemplazó un sistema anterior con fallas y menos funciones. Lo diseñé y construí solo, arquitectura incluida, y lo usan unas 30.000 personas.
Antes
La institución comunicaba novedades a su personal con un sistema anterior: un monolito en .NET (ASPX) con menos funciones, que guardaba las notificaciones como HTML con los logos embebidos en Base64. Ese contenido chocaba con el F5 de la red y el sistema fallaba seguido.
Qué había que resolver
Había que enviar comunicaciones con contenido controlado a audiencias grandes y variables, con borradores, adjuntos y envío de correo en segundo plano.
Qué hace.
Las capacidades principales del sistema.
Editor estructurado
Lexical produce un documento JSON en lugar de HTML. Cada notificación enviada guarda un snapshot liviano.
Plantillas canónicas
El servidor resuelve el contenido desde la plantilla activa y rechaza cuerpos alterados por el cliente.
Audiencias y lotes
Destinatarios por segmentos, inclusiones y exclusiones, o en lotes revisables antes de enviar.
Borradores versionados
Concurrencia optimista para que dos ediciones no se pisen.
Adjuntos por fragmentos
Carga en partes con hash calculado en un web worker. PDF generado bajo demanda.
Sesión BFF
Cookie opaca con CSRF; los tokens quedan del lado del servidor.
Worker de correo
Lease, límite de tasa, reintentos y circuit breaker.
Permisos por usuario
Aplicados en la interfaz y en la API, integrados con un sistema externo del área informática.
Cómo está armado
- 01INTERFAZReact · TanStack Query · Lexical
- 02BFF / APIASP.NET Core · sesión + CSRF
- 03SERVICIOSplantillas · audiencias · lotes
- 04DATOSSQL Server · SP · TVP
- 05WORKERcola de correo
Decisiones técnicas.
Qué se eligió y qué implica.
- 01
Contenido en JSON, no en HTML
El editor (Lexical) guarda cada notificación como un documento JSON y el sistema conserva un snapshot de lo que se envió.
→ El F5 ya no bloquea el contenido, y cada envío queda persistido y auditable.
- 02
Audiencias y lotes incrementales
Los destinatarios se arman combinando búsquedas sobre muchas paramétricas y se suman de forma incremental, con inclusiones, exclusiones y lotes revisables.
→ Se pueden armar audiencias de miles de personas sin traer todo de una vez.
- 03
Subida de adjuntos por fragmentos
Los archivos se suben en partes, con un hash calculado en un web worker.
→ Las cargas grandes ya no se cortan en el F5 de la red.
- 04
Sesión BFF con tokens en el servidor
El login devuelve una cookie opaca; la sesión y los tokens se guardan protegidos en SQL.
→ El JavaScript del navegador no maneja tokens. A cambio hay estado de sesión que operar y CSRF que validar.
- 05
Contenido resuelto en backend
En modo plantilla, el servidor ignora el cuerpo enviado y toma tipo y contenido de la plantilla activa.
→ El contenido oficial no depende del navegador; editor y servidor tienen que coordinarse.
- 06
Negocio en SQL con SP y TVP
Audiencias, destinatarios y archivos se resuelven en procedimientos almacenados con parámetros tabla.
→ Las operaciones de volumen corren cerca de los datos, con reglas repartidas entre C# y SQL.
El sistema anterior guardaba las notificaciones como HTML y el F5 de la red lo bloqueaba. Lo rediseñé para que el contenido viaje como JSON.
- 01Editor con Lexical que guarda un documento JSON, y un snapshot liviano de cada notificación para persistencia y auditoría.
- 02Búsqueda de destinatarios entre muchas paramétricas y miles de personas, sumando resultados de forma incremental. De ahí salieron las audiencias y los lotes, la parte que más disfruté.
- 03Subida de archivos por fragmentos para que el F5 no corte las cargas.
- 04Sesión BFF y permisos por usuario en la interfaz y en la API, integrados con un sistema externo del área informática.
Cómo usé IA
Lo desarrollé con agentes de código: Cursor, MCPs, Skills y un AGENTS.md con las reglas del proyecto. Definí la arquitectura, dirigí la implementación y revisé los cambios.
Resultado
Reemplazó al sistema anterior y hoy lo usan unas 30.000 personas. En lo observado, los envíos masivos a decenas de miles de destinatarios tardan alrededor de un minuto; no es una medición formal.
- El repositorio incluye tests de frontend (Vitest) y de backend (MSTest).