An open API service indexing awesome lists of open source software.

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

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 de estadísticas

> 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