Resumen de Implementación
Esta sección describe las decisiones arquitectónicas, elecciones tecnológicas y prácticas de desarrollo que guían el desarrollo de la plataforma Percus.
Filosofía
Percus está construido con estos principios fundamentales:
- Calidad Primero: Alta cobertura de pruebas, linting estricto, revisiones de código
- Diseño Orientado al Dominio: La lógica de negocio impulsa la arquitectura
- Serverless Primero: Enfoque en entrega de valor, no gestión de infraestructura
- Seguridad por Diseño: Autenticación, encriptación y registro de auditoría desde el día uno
- Mejora Progresiva: Empezar simple, agregar complejidad cuando sea necesario
Stack Tecnológico
Backend
Runtime y Lenguaje:
- AWS Lambda con .NET 10 (C#)
- Arquitectura serverless para escalamiento automático y optimización de costos
- .NET 10 elegido por mejor rendimiento en arranque en frío (~850ms-1s)
¿Por qué AWS Lambda + .NET?
- Cero gestión de infraestructura
- Escalamiento automático (de 0 a miles de ejecuciones concurrentes)
- Pago solo por uso real
- .NET proporciona tipado fuerte, herramientas maduras y excelente rendimiento
- Soporte nativo de async/await para operaciones I/O escalables
Base de Datos:
- Amazon Aurora Serverless v2 con PostgreSQL 15
- Auto-escala de 0.5 a 128 ACU según la carga
- Despliegue Multi-AZ para alta disponibilidad
- Respaldos automatizados y recuperación point-in-time
¿Por qué PostgreSQL en lugar de MySQL?
- Soporte superior de JSON (tipo JSONB con indexación)
- Búsqueda de texto completo incorporada
- Tipos array y compuestos
- Mejor soporte con Entity Framework Core
- Características de consulta más avanzadas (CTEs, funciones de ventana)
ORM:
- Entity Framework Core
- Consultas type-safe con LINQ
- Migraciones automatizadas para evolución de esquema
- Seguimiento de cambios y patrón unit of work
Almacenamiento:
- Amazon S3 para plantillas, assets y videos generados
- CloudFront CDN para entrega global de contenido
- URLs firmadas para acceso seguro a contenido privado
API:
- API Gateway (REST API)
- Throttling, monitoreo y caché incorporados
- Integración con patrón Lambda proxy
Frontend
Framework:
- Next.js 15 (App Router) con TypeScript
- Server-side rendering (SSR) para mejor SEO y rendimiento
- Generación estática (SSG) para páginas cacheables
- Desplegado en Vercel para deployment sin configuración
Estilos:
- Tailwind CSS para desarrollo rápido de UI
- Sistema de diseño personalizado con paleta de colores definida
- Enfoque responsive-first
Gestión de Estado:
- TanStack Query (React Query) para estado del servidor
- Zustand para estado del cliente
- Caché automático, refetch y actualizaciones optimistas
Formularios y Validación:
- React Hook Form para formularios eficientes
- Zod para validación de esquemas
- Datos de formulario type-safe con TypeScript
Patrones Arquitectónicos
Diseño Orientado al Dominio (DDD)
Organizamos el sistema alrededor de dominios de negocio, no capas técnicas.
Contextos Delimitados:
La plataforma está dividida en 4 contextos delimitados independientes:
-
Contexto de Identidad y Acceso
- Organizaciones, usuarios, roles, permisos
- Autenticación y autorización
-
Contexto de Gestión de Campañas
- Proyectos (campañas de marketing)
- Plantillas (estructuras de video con versionado)
-
Contexto de Integración
- Credenciales de API
- Configuraciones de webhooks
- Configuración de entrega por email
-
Contexto de Analítica
- Eventos de generación de videos
- Seguimiento de engagement (vistas, completados)
Cada contexto tiene su propio:
- Modelo de dominio (entidades, value objects, agregados)
- Reglas de negocio e invariantes
- Contexto de base de datos (Entity Framework)
- Función Lambda (microservicio)
¿Por qué DDD?
- Alinea el código con el lenguaje de negocio
- Límites claros reducen el acoplamiento
- Más fácil de entender, probar y mantener
- Los miembros del equipo pueden trabajar independientemente en diferentes contextos
Arquitectura Limpia
Seguimos el principio de inversión de dependencias con capas claras:
┌─────────────────────────────────┐
│ Capa API (Lambda) │ ← HTTP, JSON, DTOs
├─────────────────────────────────┤
│ Capa Aplicación (Casos Uso) │ ← Orquestación, validación
├─────────────────────────────────┤
│ Capa Dominio (Entidades) │ ← Lógica negocio, invariantes
├─────────────────────────────────┤
│ Infraestructura (EF, S3, etc.) │ ← Persistencia, servicios externos
└─────────────────────────────────┘
Responsabilidades de Capa:
Capa Dominio:
- Entidades con reglas de negocio
- Value objects para validación
- Agregados que hacen cumplir invariantes
- Eventos de dominio para comunicación
- Sin dependencias de otras capas
Capa Aplicación:
- Casos de uso (uno por acción de usuario)
- Servicios de dominio (lógica de negocio compleja)
- Verificaciones de autorización
- Coordinación de transacciones
Capa Infraestructura:
- DbContexts de Entity Framework
- Repositorios (acceso a datos)
- Cliente S3 (almacenamiento de archivos)
- Clientes de API externas
Capa API:
- Handlers de función Lambda
- DTOs de request/response
- Validación de entrada
- Manejo de errores y logging
Beneficios:
- Testeable (dominio sin dependencias)
- Flexible (cambiar infraestructura sin tocar dominio)
- Mantenible (clara separación de responsabilidades)
Arquitectura de Microservicios
Cada contexto delimitado se despliega como una función Lambda independiente:
- Servicio de Identidad: Autenticación y gestión de usuarios
- Servicio de Campañas: Proyectos y plantillas
- Servicio de Integración: Credenciales API y webhooks
- Servicio de Analítica: Seguimiento de eventos y métricas
Comunicación:
- Síncrona: Llamadas API directas (cuando es necesario)
- Asíncrona: Eventos de dominio (preferido para cross-context)
¿Por qué Microservicios?
- Despliegue y escalamiento independientes
- Autonomía del equipo (cada equipo posee un servicio)
- Flexibilidad tecnológica (puede usar diferentes lenguajes si es necesario)
- Aislamiento de fallos (falla de un servicio no tumba todo el sistema)
Prácticas de Desarrollo
Desarrollo Dirigido por Pruebas (TDD)
Escribimos pruebas antes de la implementación.
Requisitos de Cobertura:
- General: 90% mínimo
- Capa dominio: >95% (lógica de negocio es crítica)
- Capa aplicación: >90%
- Capa infraestructura: >85%
- Capa API: >90%
- Frontend: >90%
Tipos de Pruebas:
Pruebas Unitarias (Rápidas, Aisladas):
- Entidades y value objects de dominio
- Casos de uso con dependencias simuladas
- Funciones puras y utilidades
Pruebas de Integración (Base de Datos, Servicios Externos):
- Consultas de repositorio (usando Testcontainers para PostgreSQL real)
- Endpoints de API (usando WebApplicationFactory)
- Flujos de usuario end-to-end (usando Playwright)
¿Por qué Alta Cobertura?
- Confianza en refactorización
- Documentación de comportamiento
- Detección temprana de regresiones
- Fuerza mejor diseño (código testeable es usualmente mejor código)
Desarrollo Dominio-Primero
Orden de Implementación (Estricto):
- Capa Dominio (Pruebas → Implementación → Cobertura >95% → Lint limpio)
- Capa Aplicación (Pruebas → Implementación → Cobertura >90% → Lint limpio)
- Capa Infraestructura (Pruebas → Implementación → Cobertura >85% → Lint limpio)
- Capa API (Pruebas → Implementación → Cobertura >90% → Lint limpio)
- Frontend (Pruebas → Implementación → Cobertura >90% → Lint limpio)
Regla: No pasar a la siguiente capa hasta que la actual esté 100% completa.
¿Por qué Dominio-Primero?
- La lógica de negocio es el código más valioso
- Si el dominio está mal, todo lo demás está mal
- Probar dominio es más fácil (sin dependencias)
- Proporciona base sólida para otras capas
Estándares de Calidad de Código
Linting (Forzado en CI/CD):
- Backend:
dotnet format --verify-no-changes - Frontend: ESLint + Prettier
- Sin merge si el linting falla
Análisis Estático:
- Backend: StyleCop, ReSharper
- Frontend: TypeScript modo estricto
- Seguridad: Snyk, Dependabot para escaneo de vulnerabilidades
Revisiones de Código:
- Todo código debe revisarse antes del merge
- Verificaciones automatizadas (pruebas, lint, cobertura) deben pasar
- Al menos una aprobación requerida
Compuertas de Calidad (Bloquean Merge Si):
- ❌ Cobertura de pruebas cae por debajo del 90%
- ❌ Cualquier falla de prueba
- ❌ Errores de lint
- ❌ Errores de TypeScript
- ❌ Vulnerabilidades de seguridad (altas/críticas)
Decisiones Arquitectónicas Clave
Autenticación: Google Workspace SSO
Decisión: Usar Google OAuth para toda autenticación (sin contraseñas).
Razonamiento:
- Sin carga de gestión de contraseñas (sin hashing, flujos de reset, riesgo de brechas)
- Conveniente para usuarios empresariales (mayoría tiene cuentas Google)
- Google maneja MFA y auditorías de seguridad
- Gratis para implementación OAuth básica
Implementación:
- NextAuth.js en frontend
- Tokens JWT para autorización de API
- Creación de usuario en primer login
Base de Datos: Aurora Serverless PostgreSQL
Decisión: Usar Aurora Serverless v2 con PostgreSQL 15.
Razonamiento:
- Auto-escalamiento: Escala capacidad de cómputo automáticamente (0.5-128 ACU)
- Costo-efectivo: Pago solo por capacidad usada
- Alta disponibilidad: Multi-AZ con failover automático
- Beneficios PostgreSQL: Mejor soporte JSON, búsqueda texto completo, características avanzadas
vs DynamoDB:
- Modelo relacional se ajusta mejor a nuestro dominio
- Consultas complejas son más simples (JOINs, GROUP BY)
- Transacciones a través de múltiples tablas
vs PostgreSQL Auto-hospedado:
- Sin gestión de servidor
- Escalamiento automático
- Respaldos y HA incorporados
ORM: Entity Framework Core
Decisión: Usar Entity Framework Core para todo acceso a base de datos.
Razonamiento:
- Type safety: Modelos C# mapeados a tablas de base de datos
- Migraciones: Control de versiones para esquema de base de datos
- Consultas LINQ: Fuertemente tipadas, verificadas en tiempo de compilación
- Seguimiento de cambios: Detección automática de dirty y actualizaciones
Estrategia de Migración:
- Desarrolladores crean migraciones localmente:
dotnet ef migrations add - Migraciones almacenadas en Git
- GitHub Actions ejecuta migraciones durante despliegue
- Lambda de Migración de respaldo para ejecuciones manuales
¿Por qué no SQL crudo o Dapper?
- EF proporciona más productividad (menos código repetitivo)
- Las migraciones son críticas para evolución de esquema
- Trade-off: Ligeramente más lento, pero vale la pena por mantenibilidad
Despliegue: Serverless + IaC
Decisión: Usar Terraform para infraestructura como código.
Razonamiento:
- Reproducible: Misma infraestructura en staging y producción
- Control de versiones: Cambios rastreados en Git
- Multi-cloud: Puede migrar fuera de AWS si es necesario
- Modular: Módulos reutilizables para patrones comunes
CI/CD:
- GitHub Actions para toda automatización
- Push a
develop→ Despliegue a staging - Push a
main→ Despliegue a producción - Pruebas automatizadas, linting, verificaciones de cobertura
Monitoreo: CloudWatch + Sentry
Decisión: Usar CloudWatch para infraestructura, Sentry para errores de aplicación.
CloudWatch:
- Logs, métricas, alarmas de Lambda
- Logs de requests de API Gateway
- Rendimiento de consultas de base de datos
Sentry:
- Seguimiento de errores de frontend
- Monitoreo de excepciones de backend
- Seguimiento de releases, source maps
Alertas:
- Slack/Email cuando los errores aumentan
- PagerDuty para problemas críticos (producción caída)
Arquitectura de Seguridad
Defensa en Profundidad
Capa 1: Protección Edge
- CloudFront + AWS WAF
- Protección DDoS, rate limiting
- Restricciones geográficas (si es necesario)
Capa 2: API Gateway
- Throttling de requests (100 req/min por usuario)
- Validación de API key
- Límites de tamaño de request/response
Capa 3: Aplicación
- Validación de token JWT
- Control de acceso basado en roles (RBAC)
- Aislamiento de datos a nivel de organización
Capa 4: Datos
- Encriptación en reposo (AWS KMS)
- Encriptación en tránsito (TLS 1.3)
- Credenciales de base de datos en AWS Secrets Manager
Capa 5: Auditoría
- Todas las acciones críticas registradas
- Seguimiento de actividad de usuario
- Retención de log de auditoría: 1 año
Preparación para Cumplimiento
GDPR:
- Exportación de datos bajo solicitud
- Eliminación de datos bajo solicitud (soft delete + anonimizar)
- Seguimiento de consentimiento
- Derecho al olvido
SOC 2:
- Controles de acceso (RBAC)
- Registro de auditoría
- Encriptación (reposo + tránsito)
- Plan de respuesta a incidentes
Objetivos de Rendimiento
Tiempo de Respuesta API:
- Menos de 500ms para percentil 95
- Menos de 1s para percentil 99
Carga de Página Frontend:
- Menos de 2 segundos para dashboard
- Menos de 3 segundos para detalles de proyecto
Consultas de Base de Datos:
- Menos de 100ms para consultas simples
- Menos de 500ms para analítica compleja
Generación de Video:
- Menos de 10 segundos para plantilla típica
- Menos de 30 segundos para plantillas complejas
Disponibilidad:
- 99.9% SLA de uptime
- Despliegue Multi-AZ para redundancia
Optimización de Costos
Beneficios Serverless:
- Pago solo por uso real (sin servidores inactivos)
- Escalamiento automático (sin sobre-aprovisionamiento)
- Sin overhead operacional
Costos Estimados (Mensuales):
- MVP (100 usuarios): ~$200
- Escala (1,000 usuarios): ~$800
- Empresa (10,000 usuarios): ~$3,000
Controles de Costo:
- Concurrencia reservada en Lambdas críticos
- Aurora auto-pause cuando está inactivo (desarrollo)
- Políticas de ciclo de vida S3 (archivar videos antiguos)
- Caché de CloudFront (reducir requests a origen)
Estrategia de Escalabilidad
Escalamiento Horizontal:
- Lambda: Automático, hasta límites de cuenta
- Aurora: Agregar read replicas para cargas read-heavy
- S3: Almacenamiento ilimitado
Escalamiento Vertical:
- Lambda: Aumentar asignación de memoria (también aumenta CPU)
- Aurora: Escalar capacidad ACU (0.5 → 128 ACU)
Caché:
- CloudFront: Cachear assets estáticos (plantillas, imágenes)
- API Gateway: Cachear respuestas GET (1-5 minutos)
- Aplicación: Redis/ElastiCache si es necesario (Fase 2+)
Optimización de Base de Datos:
- Índices en claves foráneas y campos de búsqueda
- Particionado para tablas grandes (eventos de analítica)
- Vistas materializadas para analítica compleja
Mejoras Futuras
Fase 2 (6-12 meses):
- Notificaciones en tiempo real (WebSockets)
- Analítica avanzada (pruebas A/B, mapas de calor)
- Marketplace de plantillas
- Soporte multi-idioma (Español, Portugués)
Fase 3 (12-24 meses):
- Características impulsadas por IA (auto-generar scripts)
- App móvil (iOS/Android)
- Integraciones avanzadas (Salesforce, HubSpot)
- Opción white-label para clientes enterprise
Resumen
Puntos Clave:
✅ Arquitectura Serverless: Lambda + Aurora para escalamiento automático y optimización de costos
✅ Diseño Orientado al Dominio: 4 contextos delimitados con límites claros
✅ Arquitectura Limpia: Capas Dominio → Aplicación → Infraestructura → API
✅ Desarrollo Test-First: Requisito de cobertura 90%, enfoque dominio-primero
✅ Estándares de Calidad: Linting forzado, revisiones de código requeridas, compuertas de calidad automatizadas
✅ Seguridad por Diseño: OAuth, encriptación, RBAC, registro de auditoría desde el día uno
✅ Stack Moderno: .NET 10, Next.js 15, PostgreSQL 15, TypeScript
Esta arquitectura nos permite:
- Construir rápidamente (serverless, herramientas modernas)
- Escalar eficientemente (auto-escalamiento, microservicios)
- Mantener calidad (pruebas, linting, revisiones)
- Entregar valor (enfoque en dominio, no infraestructura)
Siguiente: Ver documentación de planificación detallada en el repositorio percus-backoffice (carpeta .plan/).