Skip to content

jjcmjavascript/backend-expense-record

Repository files navigation

¡Bienvenido! Este es un template de backend robusto y listo para usar, construido con NestJS, que te permitirá arrancar tus proyectos rápidamente.

NestJS TypeScript Prisma Prettier


📋 Tabla de Contenidos

  1. Primeros Pasos
  2. Uso
  3. Características Principales
  4. Estructura del Proyecto
  5. Scripts Disponibles
  6. Licencia

🏁 Primeros Pasos

✅ Requisitos Previos

Asegúrate de tener instalado lo siguiente en tu entorno de desarrollo:

⚙️ Instalación

  1. Clona el repositorio:

    git clone
    cd proyect
  2. Instala las dependencias:

    npm install

🔑 Variables de Entorno (.env)

Este proyecto utiliza variables de entorno para la configuración. Para empezar, copia el archivo de ejemplo:

cp .env.example .env

Ahora, abre el archivo .env y configúralo. Aquí tienes una explicación de las variables más importantes:

  • DATABASE_URL: ¡Esencial! Esta es la cadena de conexión para tu base de datos PostgreSQL, usada por Prisma.
    • Formato: postgresql://USER:PASSWORD@HOST:PORT/DATABASE
  • JWT_SECRET: ¡Crítico para la seguridad! Es la clave secreta que se usa para firmar los JSON Web Tokens (JWT). Debe ser una cadena larga y aleatoria.
  • JWT_EXPIRES_IN: Define el tiempo de vida de los tokens JWT (ej. 60s, 1h, 7d).
  • SSO_API_URL y SSO_API_KEY: Si te integras con un servicio de Single Sign-On (SSO), aquí van la URL de la API y la clave de autorización.

🚀 Uso

▶️ Ejecutar la Aplicación

  • Modo Desarrollo (con hot-reload):

    npm run dev

    Este comando vigila los cambios en los archivos y reinicia la aplicación automáticamente. ¡Ideal para desarrollar!

  • Modo Producción:

    npm run start

    Este comando primero se asegura de que las migraciones de la base de datos estén aplicadas y luego inicia el servidor de forma optimizada para producción.


✨ Características Principales

🔒 Autenticación (Login)

El flujo de autenticación está diseñado para integrarse con un servicio de Single Sign-On (SSO).

  1. Petición del Cliente: El frontend envía una petición POST al endpoint /auth/login. En el cuerpo de la petición, debe incluir un code de autorización obtenido del SSO.

  2. Validación con el SSO: El AuthSignInService toma ese code y lo envía al servicio de SSO para validarlo.

  3. Búsqueda o Creación de Usuario: Si el code es válido, el SSO devuelve los datos del usuario (nombre, email, RUT). El servicio UserFindOrCreateService busca si ya existe un usuario con ese email y RUT en la base de datos. Si no existe, lo crea.

  4. Generación de JWT: Con los datos del usuario, se genera un JSON Web Token (JWT). Este token contiene información clave como el ID del usuario, su nombre, email y roles, y está firmado digitalmente con el JWT_SECRET.

  5. Respuesta al Cliente: El servidor responde con el access_token (el JWT). El cliente debe guardar este token y enviarlo en la cabecera Authorization de las peticiones a rutas protegidas (ej. Authorization: Bearer <token>).

El AuthGuard es un guardián que protege las rutas que requieren autenticación, verificando la validez del JWT en cada petición.

🗃️ Prisma ORM

Usamos Prisma para interactuar con la base de datos de una forma moderna y segura.

  • Schema de Prisma: El modelo de datos está definido en src/shared/services/prisma/schema.prisma. Cada vez que modifiques este archivo, necesitas generar una nueva migración.

  • Crear una Migración: Para reflejar los cambios de tu schema.prisma en la base de datos, crea una nueva migración:

    # Reemplaza <nombre-descriptivo> con algo como 'add-product-table'
    npx prisma migrate dev --name <nombre-descriptivo>

    Este comando también ejecuta npx prisma generate para actualizar el Cliente de Prisma con los nuevos modelos.

  • Aplicar Migraciones: Para aplicar las migraciones pendientes en un entorno (como producción), usa:

    npx prisma migrate deploy

📂 Estructura del Proyecto

La carpeta src/shared contiene lógica reutilizable en toda la aplicación.

🛠️ Módulos Compartidos (Shared)

  • Services:

    • PrismaService: Gestiona la conexión con la base de datos y proporciona una instancia del cliente de Prisma.
    • SsoService: Encapsula la lógica para comunicarse con la API del SSO.
    • FetcherService: Un servicio global para realizar peticiones HTTP a otras APIs. Al ser global, puedes inyectarlo en cualquier servicio sin necesidad de importar su módulo.
  • Helpers:

    • default-logger.helper.ts: Un logger simple y personalizable.
    • get-time-duration.helper.ts: Utilidad para medir tiempos de ejecución.
    • http-responses.helper.ts: Funciones para estandarizar las respuestas HTTP (éxito, error, etc.).
  • Decorators:

    • is-chilean-rut.decorator.ts: Un decorador de validación personalizado (class-validator) que comprueba si un string es un RUT chileno válido.
  • Interceptors:

    • logger.interceptor.ts: Intercepta todas las peticiones entrantes para registrar información útil como la URL, el método y el tiempo de respuesta.

📜 Scripts Disponibles

Puedes ver todos los scripts en package.json. Aquí están los más importantes:

  • npm run dev: Inicia la app en modo desarrollo.
  • npm run start: Inicia la app en modo producción.
  • npm run build: Compila el código TypeScript a JavaScript.
  • npm run format: Formatea todo el código con Prettier.
  • npm run lint: Revisa el código en busca de errores de estilo con ESLint.
  • npm run test: Ejecuta las pruebas unitarias.
  • npm run test:e2e: Ejecuta las pruebas end-to-end.# template-nestjs

🐳 Docker Compose

  • docker compose -f docker-compose.dev.yml up --build

🐳 Docker Compose Borrar todo

1 - Para y elimina contenedores + volúmenes del compose actual docker compose down --volumes --remove-orphans

2 - Borra cualquier volumen “huérfano” docker volume prune # ENTER y confirma

3 - Arranca de nuevo docker compose up --build

About

backend para app mobile para almacenar gastos

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published