{"id":21983996,"url":"https://github.com/afperdomo2/report-server","last_synced_at":"2026-04-16T04:01:47.180Z","repository":{"id":265184246,"uuid":"895368200","full_name":"afperdomo2/report-server","owner":"afperdomo2","description":"API para generar reportes en PDF con NestJS","archived":false,"fork":false,"pushed_at":"2026-01-10T20:13:04.000Z","size":2482,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T05:46:53.965Z","etag":null,"topics":["nestjs","pdfmake","postgresql","prisma-orm","swagger"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/afperdomo2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-28T04:37:35.000Z","updated_at":"2026-01-10T20:13:07.000Z","dependencies_parsed_at":"2025-08-21T19:20:58.018Z","dependency_job_id":"cb0f0382-358e-4c5e-93ab-040cf22fc63b","html_url":"https://github.com/afperdomo2/report-server","commit_stats":null,"previous_names":["afperdomo2/report-server"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/afperdomo2/report-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afperdomo2%2Freport-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afperdomo2%2Freport-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afperdomo2%2Freport-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afperdomo2%2Freport-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/afperdomo2","download_url":"https://codeload.github.com/afperdomo2/report-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afperdomo2%2Freport-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31870516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"online","status_checked_at":"2026-04-16T02:00:06.042Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nestjs","pdfmake","postgresql","prisma-orm","swagger"],"created_at":"2024-11-29T18:06:46.942Z","updated_at":"2026-04-16T04:01:47.168Z","avatar_url":"https://github.com/afperdomo2.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📊 Report Server API\n\n## 📋 Descripción\n\nAPI 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.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/images/estadisticas.png\" alt=\"Ejemplo de reporte de estadísticas\" width=\"600\"\u003e\n\u003c/div\u003e\n\n\u003e Ejemplo de reporte PDF generado\n\n### ✨ Características principales\n\n- 🔄 Generación dinámica de reportes PDF\n- 📈 Integración con gráficos SVG y Chart.js\n- 🗄️ Base de datos PostgreSQL con Prisma ORM\n- 📖 Documentación automática con Swagger\n- 🏗️ Arquitectura modular y escalable\n- 🎨 Plantillas HTML personalizables\n- 🛡️ Protección contra ataques de fuerza bruta con rate limiting\n\n## 🛠️ Tecnologías\n\n| Categoría | Tecnología |\n|-----------|------------|\n| **Framework** | [NestJS](https://nestjs.com/) |\n| **Base de datos** | PostgreSQL + [Prisma ORM](https://prisma.io/) |\n| **PDF Generation** | [PDFMake](https://pdfmake.github.io/docs/0.1/) |\n| **Gráficos** | [Chart.js](https://www.chartjs.org/) + [QuickChart](https://quickchart.io/) |\n| **Documentación** | [Swagger](https://swagger.io/) |\n| **Validación** | class-validator + class-transformer |\n\n## 🐳 Docker\n\n### Requisitos previos\n\n- Docker instalado en tu máquina\n- PostgreSQL funcionando (local o en contenedor)\n\n### Variables de entorno necesarias\n\nCrear un archivo `.env` en la raíz del proyecto:\n\n```env\nDATABASE_URL=\"postgresql://usuario:contraseña@localhost:5432/nombre_db\"\nCORS_ORIGIN=\"http://localhost:3000,http://localhost:3001\"\n```\n\n### Construir la imagen Docker\n\n```bash\ndocker build -t report-server:latest .\n```\n\n### Ejecutar el contenedor localmente (Docker Desktop)\n\n```bash\n# Con la base de datos en localhost\ndocker 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\n\ndocker 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\n```\n\n\u003e **Nota:** El contenedor ejecutará automáticamente:\n\u003e\n\u003e 1. Migraciones de Prisma (`prisma migrate deploy`)\n\u003e 2. Seed de datos (`npm run db:seed`)\n\u003e 3. Inicio de la aplicación\n\n### Desplegar en Dokploy\n\n#### Paso 1: Preparar el repositorio\n\n```bash\ngit add .\ngit commit -m \"Add Dockerfile configuration for Dokploy\"\ngit push\n```\n\n#### Paso 2: Crear un proyecto en Dokploy\n\n1. Accede a tu instancia de Dokploy\n2. Crea un nuevo proyecto\n3. Selecciona \"Docker\" como tipo de despliegue\n4. Conecta tu repositorio de GitHub\n\n#### Paso 3: Configurar las variables de entorno\n\nEn la configuración del proyecto en Dokploy, añade las siguientes variables:\n\n```env\nDATABASE_URL=\"postgresql://usuario:contraseña@postgres-service:5432/nombre_db\"\nCORS_ORIGIN=\"https://tu-dominio.com,https://www.tu-dominio.com\"\nNODE_ENV=development\nPORT=3000\n```\n\n#### Paso 4: Configurar el puerto\n\n- **Puerto interno del contenedor:** 3000\n- **Puerto expuesto:** 3000\n\n#### Paso 5: Configurar la base de datos\n\nDokploy permite integrar bases de datos PostgreSQL. Asegúrate de:\n\n1. Crear una base de datos PostgreSQL en Dokploy\n2. Obtener la cadena de conexión (`DATABASE_URL`)\n3. Configurarla en las variables de entorno del proyecto\n\n#### Paso 6: Desplegar\n\nDokploy automáticamente:\n\n- Clona el repositorio\n- Construye la imagen Docker\n- Ejecuta las migraciones\n- Carga los datos semilla\n- Inicia el contenedor\n\n#### Monitoreo\n\nEn Dokploy puedes:\n\n- Ver los logs en tiempo real\n- Monitorear el estado del contenedor\n- Configurar reinicio automático en caso de fallos\n- Escalar horizontalmente (si es necesario)\n\n### Healthcheck\n\nEl 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.\n\n## 🧪 Instalación\n\n```bash\n# Instalar dependencias\nnpm install\n\n# Configurar variables de entorno\ncp .env.example .env\n```\n\n## 🚀 Iniciar la aplicación\n\n```bash\n# Desarrollo\nnpm run start:dev\n\n# Producción\nnpm run start:prod\n```\n\nLa API estará disponible en: **\u003chttp://localhost:3000\u003e**\n\n## 📚 Endpoints principales\n\n### 📄 Basic Reports\n\n- `GET /basic-reports/hello-world` - Reporte básico de prueba\n- `GET /basic-reports/employment-letter/:employeeId` - Carta de empleo\n- `GET /basic-reports/countries` - Reporte de países con filtros\n\n### 🏪 Store Reports\n\n- `GET /store-reports/orders/:orderId` - Reporte de orden por ID\n- `GET /store-reports/svgs-charts` - Gráficos SVG\n- `GET /store-reports/statistics` - Estadísticas de la tienda\n\n### 👤 Employees\n\n- `GET /employees/latest` - Lista los últimos 10 empleados ordenados por fecha de inicio\n\n### 🧾 Orders\n\n- `GET /orders/latest` - Lista las últimas 10 órdenes con información del cliente\n\n### 🎨 Extra Reports\n\n- `GET /extra-reports/html-report` - Reporte desde HTML\n- `GET /extra-reports/community-report` - Reporte de comunidad\n- `GET /extra-reports/custom-size` - PDF con tamaño personalizado\n\n## 📗 Documentación\n\nAccede a la documentación interactiva de Swagger en:\n**\u003chttp://localhost:3000/api/docs\u003e**\n\n## 🛡️ Seguridad\n\nLa API implementa protección contra ataques de fuerza bruta mediante **rate limiting** usando `@nestjs/throttler`.\n\n### Configuración de Rate Limiting\n\n- **Límite global**: 10 solicitudes por minuto por dirección IP\n- **Ventana de tiempo**: 60 segundos\n- **Límites específicos**:\n  - `/basic-reports/employment-letter/:employeeId`: 5 solicitudes por minuto\n  - `/basic-reports/countries`: 3 solicitudes por minuto\n\n### Comportamiento\n\nCuando se excede el límite de solicitudes, el servidor responde con:\n\n- **Código HTTP**: 429 (Too Many Requests)\n- **Mensaje**: \"ThrottlerException: Too Many Requests\"\n\n### Pruebas de Seguridad\n\nPara probar la protección, puedes hacer múltiples solicitudes rápidas a cualquier endpoint:\n\n```bash\n# Ejemplo: múltiples solicitudes al endpoint hello-world\nfor i in {1..15}; do curl -s http://localhost:3000/basic-reports/hello-world \u003e /dev/null \u0026 done\n```\n\nDespués de 10 solicitudes en menos de 1 minuto, recibirás respuestas 429.\n\n## 🐳 Docker \u0026 Base de datos\n\n```bash\n# Iniciar PostgreSQL con Docker\ndocker-compose up -d\n```\n\n### 🌈 Configuración de base de datos (Prisma)\n\n```bash\n# Generar cliente de Prisma\nnpx prisma generate\n\n# Ejecutar migraciones\nnpx prisma migrate dev\n\n# Visualizar datos en Prisma Studio\nnpx prisma studio\n```\n\n## 📀 Datos de ejemplo\n\nLos siguientes archivos SQL contienen datos de ejemplo para las tablas:\n\n- `sql/01-employees.sql` - Datos de empleados\n- `sql/02-countries.sql` - Información de países\n- `sql/03-master-detail.sql` - Relaciones maestro-detalle (órdenes, productos, etc.)\n- `sql/04-additional-employees.sql` - Empleados adicionales\n- `sql/05-additional-products.sql` - Productos adicionales\n- `sql/06-additional-orders.sql` - Órdenes adicionales\n\n## 🧪 Testing\n\n```bash\n# Tests unitarios\nnpm run test\n\n# Tests end-to-end\nnpm run test:e2e\n\n# Cobertura de tests\nnpm run test:cov\n```\n\n## 📁 Estructura del proyecto\n\n```text\nsrc/\n├── modules/          # Módulos de la aplicación\n│   ├── basic-reports/    # Reportes básicos\n│   ├── store-reports/    # Reportes de tienda\n│   ├── extra-reports/    # Reportes adicionales\n│   ├── employees/        # Gestión de empleados\n│   ├── countries/        # Gestión de países\n│   └── orders/          # Gestión de órdenes\n├── reports/          # Plantillas de reportes\n├── shared/           # Servicios compartidos\n├── database/         # Configuración de base de datos\n└── utils/            # Utilidades y helpers\n```\n\n## Características técnicas\n\n- **Validación automática** de datos de entrada\n- **Transformación** de DTOs con class-transformer\n- **Generación de PDFs** con layouts personalizables\n- **Gráficos dinámicos** usando Chart.js y SVG\n- **Base de datos relacional** con Prisma ORM\n- **Documentación automática** con Swagger/OpenAPI\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fafperdomo2%2Freport-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fafperdomo2%2Freport-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fafperdomo2%2Freport-server/lists"}