2024
Formación
NestJS
Socket.io
Jest
MongoDB

El contexto

Quizzam es una API backend REST desarrollada con NestJS, que demuestra el dominio de patrones de arquitectura de software modernos. Este proyecto fue desarrollado desde cero como parte de una formación, 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