javascript · nodejs · typescript · finance · nestjs · supabase · drizzleorm

Arrancando una API de NestJS para finanzas personales

4 min de lectura

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]

💡
Próximo artículo: vamos a configurar Supabase