Skip to content

creativecodeco/github-helpers

Repository files navigation

GitHub Helpers - Stats Generator & Live API

Este proyecto es un microservicio y cliente web desarrollado en Node.js con TypeScript que permite consultar las estadísticas y los lenguajes de programación más utilizados por cualquier usuario de GitHub en tiempo real, devolviendo imágenes en formato SVG listas para ser incrustadas directamente en el archivo README.md de tus proyectos.

Desarrollado y mantenido por CreativeCode.com.co.


⚡ Características Principales

  1. Clean Architecture (Arquitectura Limpia): Estructurado en capas desacopladas (Dominio, Casos de Uso, Adaptadores e Infraestructura) para garantizar mantenibilidad, testabilidad y escalabilidad.
  2. API en Vivo (Hot Rendering): Generación de tarjetas SVG al vuelo a través de endpoints con cabeceras Content-Type: image/svg+xml.
  3. Caché en Memoria (2 horas): Minimiza las llamadas a la API de GitHub para evitar bloqueos por límite de tasa (Rate Limits) mediante el patrón Decorador.
  4. Imágenes Autocontenidas (Base64 Bypass): Las fotos de perfil se descargan y se convierten a Base64 en el servidor, garantizando que el proxy de imágenes de GitHub (camo.githubusercontent.com) las muestre sin problemas.
  5. Métricas Clave de Visibilidad:
    • Estadísticas Generales: Commits totales, estrellas obtenidas, pull requests, issues y seguidores.
    • Lenguajes más Usados: Gráfica de distribución de lenguajes (calculada por peso de bytes) con leyenda estructurada.
  6. Múltiples Temas Estéticos: Dark, Light, Neon, Solarized, Radical, Tokyonight y Glassmorphism.
  7. Panel Web Premium (Glassmorphism): Una interfaz web elegante construida en CSS puro con vista previa en tiempo real y copiador de enlaces Markdown automático.
  8. Pruebas Unitarias Integradas: Implementadas utilizando Vitest con inyección de dependencias.
  9. Listo para Docker y Coolify: Dockerfile de construcción en múltiples etapas (multi-stage) optimizado para producción.

🏗️ Arquitectura del Proyecto

El código fuente está organizado siguiendo los principios de Clean Architecture:

src/
├── domain/                  # Lógica de negocio pura (Entidades y Contratos de Repositorios)
│   ├── entities/            # UserStats, LanguageStat, Metrics, UserToken, Validation
│   └── repositories/        # IGitHubRepository, ITokenRepository, IMetricsRepository
├── use-cases/               # Casos de uso (Orquestadores de la lógica de negocio)
│   ├── cards/               # GetUserStatsCardUseCase, GetUserLanguagesCardUseCase, etc.
│   └── tokens/              # RegisterUserTokenUseCase, RevokeUserTokenUseCase
├── adapters/                # Adaptadores de Interfaz (Controladores, Repositorios y Presentadores)
│   ├── controllers/         # CardController, TokenController, MetricsController
│   ├── presenters/          # statsCard, languagesCard, theme (Renderizadores de SVGs)
│   └── repositories/        # SQLiteTokenRepository, SQLiteMetricsRepository, ApiGitHubRepository, CachedGitHubRepository
└── infrastructure/          # Detalles técnicos concretos (Base de datos, Servidor Express, Criptografía)
    ├── database/            # Inicialización de SQLite y migraciones
    ├── express/             # Enrutamiento, middlewares y arranque de servidor Express
    ├── security/            # Criptografía AES-256-GCM y validación de scopes
    └── server.ts            # Entrypoint principal (Wrapper de importación limpio y relativo)

Path Aliases (Alias de Rutas)

El proyecto utiliza alias @/ apuntando al directorio src/. Esto previene la existencia de rutas relativas complejas como ../../.

  • En desarrollo: Se resuelve en tiempo de ejecución utilizando tsconfig-paths/register.
  • En producción: tsc-alias reescribe los imports a rutas relativas nativas durante la compilación en el directorio dist/.

🚀 Comenzar (Desarrollo Local)

Requisitos previos

  • Node.js v18 o superior.
  • (Opcional) Un token de acceso personal (PAT) de GitHub para aumentar el límite de peticiones de la API.

Instalación

  1. Clona e ingresa al repositorio.
  2. Instala las dependencias estables usando pnpm:
    pnpm install
  3. Copia el archivo de configuración de entorno:
    cp .env.example .env
  4. Abre el archivo .env y configura las siguientes variables clave:
    • GITHUB_TOKEN: Tu token de acceso personal de GitHub para evitar límites de tasa.
    • METRICS_KEY: Clave secreta obligatoria para poder acceder a los endpoints de analíticas (/api/metrics).
    • TRUST_PROXY: Número de saltos del proxy (por defecto 1), útil para que el rate limit identifique correctamente las IPs detrás de Cloudflare, Nginx, etc.

Scripts de Desarrollo

  • Modo Desarrollo (auto-reload y resolución de paths):
    pnpm dev
  • Ejecutar Pruebas Unitarias (Vitest):
    pnpm test
  • Compilar para Producción (compila archivos TS y reescribe alias):
    pnpm build
  • Iniciar Servidor Compilado:
    pnpm start
  • Gestionar Versiones y Releases (release-it):
    pnpm release

Una vez ejecutado, el panel de configuración estará disponible en:
👉 http://localhost:3000

📦 Gestión de Versiones y Changelog

Este proyecto utiliza release-it junto con la especificación de Conventional Commits para automatizar los lanzamientos de versión.

Cuando ejecutas pnpm release:

  1. Analiza el historial de commits desde la última versión.
  2. Calcula el incremento de versión correspondiente (Major, Minor, Patch).
  3. Actualiza la versión en package.json y genera/actualiza el archivo CHANGELOG.md.
  4. Realiza un commit con los cambios, crea la etiqueta (git tag) y sube todo a GitHub.
  5. Crea un Release oficial en GitHub con el log de cambios automático.

📡 Endpoints de la API

Las tarjetas se pueden incrustar en cualquier archivo Markdown usando la siguiente sintaxis:

1. Tarjeta de Estadísticas Generales

![Estadísticas de GitHub](http://tu-servidor.com/api/stats?username=tu-usuario&theme=neon)
  • Parámetros:
    • username (Obligatorio): Nombre de usuario en GitHub. Valida con regex /^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$/i.
    • theme (Opcional): dark (por defecto), light, neon, glassmorphism, solarized, radical, tokyonight.

2. Tarjeta de Lenguajes más Usados

![Lenguajes de GitHub](http://tu-servidor.com/api/languages?username=tu-usuario&theme=tokyonight)
  • Parámetros:
    • username (Obligatorio): Nombre de usuario en GitHub.
    • theme (Opcional): Mismos temas que la tarjeta de estadísticas.

🔒 Seguridad (Alineación OWASP)

Este microservicio implementa las siguientes medidas de seguridad para entornos de producción:

  • Cabeceras Seguras (Helmet): Configurado con políticas de recursos de origen cruzado (cross-origin) para permitir incrustar de forma segura las tarjetas en READMEs externos.
  • Rate Limiting: Límite de 100 peticiones cada 15 minutos por dirección IP. En caso de bloqueo, responde con un SVG legible para evitar errores de renderizado de imágenes.
  • Validación de Parámetros por Expresión Regular:
    • Validado a nivel de Controller y en la capa de negocio de Use Cases.
    • Username: /^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$/i
    • Repo: /^[a-z\d-_.]{1,100}$/i
  • Estadísticas Privadas (Coming Soon - Doble Defensa):
    • Las características de almacenamiento cifrado de PATs personales de GitHub están marcadas en la interfaz frontend como deshabilitadas e inactivas.
    • Como doble defensa contra manipulaciones del DOM en el navegador, los casos de uso del backend (RegisterUserTokenUseCase y RevokeUserTokenUseCase) lanzan un error explícito de indisponibilidad si son llamados directamente en el API.
  • Secure by Default: Los endpoints de métricas se bloquean por defecto con error 403 si no se configura la variable METRICS_KEY.

🐳 Despliegue en Docker y Coolify

Este proyecto incluye un Dockerfile optimizado con builds en multi-etapa y configuración para correr bajo el usuario no root node.

Pruebas Locales con Docker

Para evitar perder el histórico de métricas (base de datos SQLite) cuando se recrea o actualiza el contenedor, debes montar un volumen persistente apuntando al directorio /usr/src/app/data:

  1. Construir la imagen:
    docker build -t github-helpers .
  2. Ejecutar el contenedor con volumen persistente:
    docker run -d -p 3000:3000 --name github-helpers-app -v github-helpers-db:/usr/src/app/data --env-file .env github-helpers

Despliegue en Coolify

  1. Crea un nuevo recurso de tipo Application en tu panel de Coolify.
  2. Selecciona GitHub Repository como fuente y apunta a este repositorio.
  3. En la configuración de construcción, selecciona Dockerfile.
  4. Configura el puerto de exposición en el puerto 3000.
  5. Persistencia: En la pestaña Storages, crea un volumen para montar en la ruta /usr/src/app/data (ej. db-data:/usr/src/app/data). Esto asegurará que tu base de datos SQLite no se pierda en cada despliegue.
  6. Agrega las variables de entorno en la pestaña Environment Variables (ej. GITHUB_TOKEN, METRICS_KEY).
  7. Haz clic en Deploy. Coolify leerá el Dockerfile, construirá el contenedor seguro de producción y lo pondrá en marcha con SSL automático.

About

API server and interactive web frontend to generate beautiful GitHub readme stats cards and metrics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors