El contexto
Quizzam es una API backend REST desarrollada con NestJS, que demuestra el dominio de patrones de arquitectura. Este proyecto fue desarrollado con un enfoque particular en la arquitectura modular y la separación de responsabilidades.
NestJS fue elegido en lugar de Node.js puro por su arquitectura predefinida y su soporte nativo de TypeScript, facilitando el desarrollo en equipo y garantizando una mejor mantenibilidad del código. A diferencia de Node.js que carece de una arquitectura de software estándar, NestJS impone reglas y convenciones que estructuran el proyecto.
La aplicación implementa una arquitectura que permite cambiar entre diferentes bases de datos (MongoDB, Firebase) sin modificar la lógica de negocio, con un adaptador In-Memory para las pruebas. El patrón CQRS separa las operaciones de lectura y escritura, lo que puede mejorar el rendimiento, la escalabilidad y la seguridad de una aplicación (aunque en nuestro caso, es un pequeño proyecto ficticio que no escala).
El sistema de autenticación también es flexible, soportando JWT y Firebase Auth según la configuración. Pruebas E2E completas con Supertest y pruebas unitarias con Jest garantizan la calidad del código.
Lo que aprendí :
- Arquitectura y Patrones:
- Patrón Ports & Adapters: abstracción de base de datos (MongoDB, Firebase) con adaptador In-Memory para pruebas
- CQRS (Command Query Responsibility Segregation): separación de operaciones de lectura/escritura para mejorar rendimiento, escalabilidad y seguridad
- Inversión de Control (IoC) e Inyección de Dependencias (DI) vía NestJS
- Arquitectura modular: organización en módulos funcionales (Quiz, User, Auth, Chat)
- Tecnologías Backend:
- NestJS: framework progresivo con soporte TypeScript nativo
- TypeScript: tipado estático para mejor mantenibilidad
- Express: servidor HTTP para rutas REST
- Socket.io: comunicación en tiempo real para chat y ejecución de quiz
- Gestión de Datos:
- Soporte multi-base de datos: MongoDB, Firebase Firestore, con adaptador In-Memory para pruebas
- Patrón Repository: abstracción del acceso a datos
- Selección dinámica de base de datos vía variables de entorno
- Autenticación y Seguridad:
- Autenticación JWT: tokens basados en email/contraseña
- Firebase Authentication: servicio de autenticación gestionado
- Bcrypt: hash seguro de contraseñas
- Middleware de autenticación: protección de rutas API
- Pruebas y Calidad:
- Pruebas End-to-End (E2E): pruebas completas de la API con Supertest
- Pruebas unitarias: pruebas aisladas de componentes y servicios con Jest
- Mocks y Stubs: simulación de dependencias para pruebas
- Helpers de prueba reutilizables: AuthHelper, QuizHelper
- Herramientas y DevOps:
- Docker: containerización de MongoDB para desarrollo
- Nx: monorepo para gestionar múltiples proyectos
- Swagger: documentación automática de la API
- Class-validator y class-transformer: validación de DTOs
