https://github.com/afperdomo2/report-server
API para generar reportes en PDF con NestJS
https://github.com/afperdomo2/report-server
nestjs pdfmake postgresql prisma-orm swagger
Last synced: 3 months ago
JSON representation
API para generar reportes en PDF con NestJS
- Host: GitHub
- URL: https://github.com/afperdomo2/report-server
- Owner: afperdomo2
- Created: 2024-11-28T04:37:35.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-01-10T20:13:04.000Z (6 months ago)
- Last Synced: 2026-01-11T05:46:53.965Z (6 months ago)
- Topics: nestjs, pdfmake, postgresql, prisma-orm, swagger
- Language: TypeScript
- Homepage:
- Size: 2.37 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 📊 Report Server API
## 📋 Descripción
API REST desarrollada con **NestJS** para la generación de reportes en PDF con diferentes tipos de contenido: tablas, gráficos, cartas de empleo, estadísticas de tienda y reportes personalizados desde HTML.
> Ejemplo de reporte PDF generado
### ✨ Características principales
- 🔄 Generación dinámica de reportes PDF
- 📈 Integración con gráficos SVG y Chart.js
- 🗄️ Base de datos PostgreSQL con Prisma ORM
- 📖 Documentación automática con Swagger
- 🏗️ Arquitectura modular y escalable
- 🎨 Plantillas HTML personalizables
- 🛡️ Protección contra ataques de fuerza bruta con rate limiting
## 🛠️ Tecnologías
| Categoría | Tecnología |
|-----------|------------|
| **Framework** | [NestJS](https://nestjs.com/) |
| **Base de datos** | PostgreSQL + [Prisma ORM](https://prisma.io/) |
| **PDF Generation** | [PDFMake](https://pdfmake.github.io/docs/0.1/) |
| **Gráficos** | [Chart.js](https://www.chartjs.org/) + [QuickChart](https://quickchart.io/) |
| **Documentación** | [Swagger](https://swagger.io/) |
| **Validación** | class-validator + class-transformer |
## 🐳 Docker
### Requisitos previos
- Docker instalado en tu máquina
- PostgreSQL funcionando (local o en contenedor)
### Variables de entorno necesarias
Crear un archivo `.env` en la raíz del proyecto:
```env
DATABASE_URL="postgresql://usuario:contraseña@localhost:5432/nombre_db"
CORS_ORIGIN="http://localhost:3000,http://localhost:3001"
```
### Construir la imagen Docker
```bash
docker build -t report-server:latest .
```
### Ejecutar el contenedor localmente (Docker Desktop)
```bash
# Con la base de datos en localhost
docker run -p 3000:3000 -e DATABASE_URL="postgresql://devuser:devpassword123@192.168.101.72:5433/report_server?schema=public" -e CORS_ORIGIN="http://localhost:8081" report-server:latest
docker run -d -p 3000:3000 -e DATABASE_URL="postgresql://devuser:devpassword123@192.168.101.72:5433/report_server?schema=public" -e CORS_ORIGIN="http://localhost:8081" --name api-report-server report-server:latest
```
> **Nota:** El contenedor ejecutará automáticamente:
>
> 1. Migraciones de Prisma (`prisma migrate deploy`)
> 2. Seed de datos (`npm run db:seed`)
> 3. Inicio de la aplicación
### Desplegar en Dokploy
#### Paso 1: Preparar el repositorio
```bash
git add .
git commit -m "Add Dockerfile configuration for Dokploy"
git push
```
#### Paso 2: Crear un proyecto en Dokploy
1. Accede a tu instancia de Dokploy
2. Crea un nuevo proyecto
3. Selecciona "Docker" como tipo de despliegue
4. Conecta tu repositorio de GitHub
#### Paso 3: Configurar las variables de entorno
En la configuración del proyecto en Dokploy, añade las siguientes variables:
```env
DATABASE_URL="postgresql://usuario:contraseña@postgres-service:5432/nombre_db"
CORS_ORIGIN="https://tu-dominio.com,https://www.tu-dominio.com"
NODE_ENV=development
PORT=3000
```
#### Paso 4: Configurar el puerto
- **Puerto interno del contenedor:** 3000
- **Puerto expuesto:** 3000
#### Paso 5: Configurar la base de datos
Dokploy permite integrar bases de datos PostgreSQL. Asegúrate de:
1. Crear una base de datos PostgreSQL en Dokploy
2. Obtener la cadena de conexión (`DATABASE_URL`)
3. Configurarla en las variables de entorno del proyecto
#### Paso 6: Desplegar
Dokploy automáticamente:
- Clona el repositorio
- Construye la imagen Docker
- Ejecuta las migraciones
- Carga los datos semilla
- Inicia el contenedor
#### Monitoreo
En Dokploy puedes:
- Ver los logs en tiempo real
- Monitorear el estado del contenedor
- Configurar reinicio automático en caso de fallos
- Escalar horizontalmente (si es necesario)
### Healthcheck
El contenedor incluye un healthcheck que verifica la disponibilidad de la API cada 30 segundos. Accede a `http://localhost:3000/api/docs` para confirmar que está funcionando.
## 🧪 Instalación
```bash
# Instalar dependencias
npm install
# Configurar variables de entorno
cp .env.example .env
```
## 🚀 Iniciar la aplicación
```bash
# Desarrollo
npm run start:dev
# Producción
npm run start:prod
```
La API estará disponible en: ****
## 📚 Endpoints principales
### 📄 Basic Reports
- `GET /basic-reports/hello-world` - Reporte básico de prueba
- `GET /basic-reports/employment-letter/:employeeId` - Carta de empleo
- `GET /basic-reports/countries` - Reporte de países con filtros
### 🏪 Store Reports
- `GET /store-reports/orders/:orderId` - Reporte de orden por ID
- `GET /store-reports/svgs-charts` - Gráficos SVG
- `GET /store-reports/statistics` - Estadísticas de la tienda
### 👤 Employees
- `GET /employees/latest` - Lista los últimos 10 empleados ordenados por fecha de inicio
### 🧾 Orders
- `GET /orders/latest` - Lista las últimas 10 órdenes con información del cliente
### 🎨 Extra Reports
- `GET /extra-reports/html-report` - Reporte desde HTML
- `GET /extra-reports/community-report` - Reporte de comunidad
- `GET /extra-reports/custom-size` - PDF con tamaño personalizado
## 📗 Documentación
Accede a la documentación interactiva de Swagger en:
****
## 🛡️ Seguridad
La API implementa protección contra ataques de fuerza bruta mediante **rate limiting** usando `@nestjs/throttler`.
### Configuración de Rate Limiting
- **Límite global**: 10 solicitudes por minuto por dirección IP
- **Ventana de tiempo**: 60 segundos
- **Límites específicos**:
- `/basic-reports/employment-letter/:employeeId`: 5 solicitudes por minuto
- `/basic-reports/countries`: 3 solicitudes por minuto
### Comportamiento
Cuando se excede el límite de solicitudes, el servidor responde con:
- **Código HTTP**: 429 (Too Many Requests)
- **Mensaje**: "ThrottlerException: Too Many Requests"
### Pruebas de Seguridad
Para probar la protección, puedes hacer múltiples solicitudes rápidas a cualquier endpoint:
```bash
# Ejemplo: múltiples solicitudes al endpoint hello-world
for i in {1..15}; do curl -s http://localhost:3000/basic-reports/hello-world > /dev/null & done
```
Después de 10 solicitudes en menos de 1 minuto, recibirás respuestas 429.
## 🐳 Docker & Base de datos
```bash
# Iniciar PostgreSQL con Docker
docker-compose up -d
```
### 🌈 Configuración de base de datos (Prisma)
```bash
# Generar cliente de Prisma
npx prisma generate
# Ejecutar migraciones
npx prisma migrate dev
# Visualizar datos en Prisma Studio
npx prisma studio
```
## 📀 Datos de ejemplo
Los siguientes archivos SQL contienen datos de ejemplo para las tablas:
- `sql/01-employees.sql` - Datos de empleados
- `sql/02-countries.sql` - Información de países
- `sql/03-master-detail.sql` - Relaciones maestro-detalle (órdenes, productos, etc.)
- `sql/04-additional-employees.sql` - Empleados adicionales
- `sql/05-additional-products.sql` - Productos adicionales
- `sql/06-additional-orders.sql` - Órdenes adicionales
## 🧪 Testing
```bash
# Tests unitarios
npm run test
# Tests end-to-end
npm run test:e2e
# Cobertura de tests
npm run test:cov
```
## 📁 Estructura del proyecto
```text
src/
├── modules/ # Módulos de la aplicación
│ ├── basic-reports/ # Reportes básicos
│ ├── store-reports/ # Reportes de tienda
│ ├── extra-reports/ # Reportes adicionales
│ ├── employees/ # Gestión de empleados
│ ├── countries/ # Gestión de países
│ └── orders/ # Gestión de órdenes
├── reports/ # Plantillas de reportes
├── shared/ # Servicios compartidos
├── database/ # Configuración de base de datos
└── utils/ # Utilidades y helpers
```
## Características técnicas
- **Validación automática** de datos de entrada
- **Transformación** de DTOs con class-transformer
- **Generación de PDFs** con layouts personalizables
- **Gráficos dinámicos** usando Chart.js y SVG
- **Base de datos relacional** con Prisma ORM
- **Documentación automática** con Swagger/OpenAPI