javascript · nodejs · typescript · finance · nestjs · supabase · drizzleorm
Arrancando una API de NestJS para finanzas personales
La mayoría de los tutoriales de NestJS que se encuentran en internet suelen quedarse en operaciones CRUD básicas o en simples aplicaciones de lista de tareas (TODO). Vayamos más allá de estos ejemplos para principiantes y construyamos algo real y práctico que se pueda usar en producción.
Qué vamos a construir
Vamos a construir una API de Finanzas Personales desde cero. Esta serie va a guiar la creación de una REST API lista para producción para gestionar ingresos, gastos y tipos de cuentas—todo lo necesario para llevar el control del dinero con confianza.
Cada artículo es una lectura de 3 a 4 minutos enfocada en un aspecto específico de la aplicación. Al final, se tendrá una API completamente funcional que se podrá extender o integrar con cualquier frontend.
Descripción general de la arquitectura
Nuestra API va a seguir una arquitectura modular y escalable:
-
NestJS como framework de backend (TypeScript, dependency injection, decorators)
-
Supabase para el hosting de la base de datos PostgreSQL y la autenticación
-
Drizzle ORM para queries type-safe y migrations de la base de datos
-
Arquitectura REST con un modelado de recursos claro
La aplicación se va a organizar en módulos por feature:
-
auth: autenticación y autorización de usuarios -
accounts: tipos de cuenta: efectivo, débito y crédito -
transactions: seguimiento de ingresos y gastos -
categories: categorización de transacciones
Vamos a usar semantic versioning a lo largo de esta serie. Por ejemplo, al final de esta publicación se tendrá la v0.1.0. Cambios menores, como agregar un constraint, van a subir la versión a v0.1.1, y así sucesivamente hasta llegar a la v1.0.0—una API lista para producción.
Este enfoque ayuda a dividir problemas grandes en pasos manejables, lo que facilita mucho la planificación y la ejecución.
Configuración del proyecto
Arranquemos nuestra aplicación de NestJS:
# Install the Nest CLI globally
npm i -g @nestjs/cli
# Create a new project
nest new finance-api
# Choose your preferred package manager (npm, yarn, or pnpm)
La CLI va a generar una estructura de proyecto limpia con:
-
Configuración de TypeScript
-
Un module, controller y service básicos
-
Configuración de testing con Jest
-
Configuraciones de ESLint y Prettier
Estructura del proyecto
Después de la configuración, vamos a organizar el código siguiendo las best practices de NestJS:
src/
├── auth/ # Authentication module
├── accounts/ # Accounts module
├── transactions/ # Transactions module
├── categories/ # Categories module
├── common/ # Shared utilities, decorators, guards
│ ├── decorators/
│ ├── guards/
│ ├── interceptors/
│ └── filters/
├── config/ # Configuration module
├── database/ # Database connection and Drizzle setup
│ ├── migrations/
│ └── schema/
│ └── seeds/
├── app.module.ts
└── main.ts
Decisiones técnicas
¿Por qué Supabase?
Supabase ofrece:
-
Base de datos PostgreSQL administrada con backups automáticos
-
Autenticación integrada (email/password, OAuth, magic links)
-
Suscripciones en tiempo real (opcional para futuras features)
-
REST API autogenerada (aunque se va a construir una propia)
-
Free tier perfecto para desarrollo
¿Por qué Drizzle ORM?
Drizzle ofrece:
-
Type safety completo de TypeScript sin decorators
-
Liviano y performante (más rápido que TypeORM)
-
Sintaxis similar a SQL, fácil de aprender
-
Sistema de migrations amigable con el control de versiones
-
Integración perfecta con la arquitectura modular de NestJS
Alternativa considerada: Prisma (es genial, pero Drizzle da más control sobre las queries y tiene mejor performance para relaciones complejas).
Vamos a hablar de cada una de estas herramientas en detalle en artículos dedicados. Por ahora, esto es una visión general del proyecto que se está construyendo. Al final, se puede usar como guía y elegir la opción preferida.
Reflexiones finales
Esto es lo que ya se tiene:
✅ Un proyecto de NestJS limpio y listo para desarrollo
✅ Comprensión de la arquitectura general
✅ Una estructura de carpetas clara para mantener el código organizado
✅ Conocimiento de por qué se eligieron Supabase y Drizzle
Sé que esta publicación es simple, pero estamos dando pasos pequeños para construir de forma gradual en lugar de apresurarnos. Espero que esta serie sirva como guía para futuros proyectos y ofrezca un framework para lograr esos grandes objetivos.
El código hasta el momento se puede revisar en el siguiente enlace:
🔗 Código: [Repositorio de GitHub]