API GitHub Analytics

Estadísticas y métricas de repositorios en tiempo real

Documentación completa para obtener y mostrar datos de GitHub de forma eficiente.

API RESTfulDocumentación CompletaEjemplos de Uso

GitHub Analytics API

Estadísticas y métricas de repositorios en tiempo real

Esta API personalizada obtiene y procesa datos reales de GitHub desde el usuario'MiguelVivar'. Implementa 8 funciones principales que consultan la API oficial de GitHub para mostrar estadísticas completas sobre repositorios, contribuciones, lenguajes de programación y actividad reciente. Incluye manejo inteligente de errores, procesamiento de hasta 300 eventos para análisis de contribuciones, y soporte para 20+ lenguajes con sus respectivos colores de identificación.

Funcionalidades

Estadísticas de Repos

Procesa hasta 100 repositorios ordenados por actualización, filtra forks y archivados

Análisis de Commits

Calcula commits aproximados desde eventos de GitHub + estimación base de 500 commits

Lenguajes de Programación

Analiza hasta 15 repositorios activos con mapeo de 20+ colores específicos por lenguaje

Actividad Reciente

Formatea los últimos 30 eventos: PushEvent, CreateEvent, WatchEvent y ForkEvent

Métricas de Popularidad

Suma automática de todas las estrellas de repositorios y métricas de seguidores

Tipado Completo

6 interfaces principales: GitHubUser, GitHubRepo, GitHubEvent, ContributionStats y más

Funciones Disponibles

Funciones principales de la API
// 8 funciones principales implementadas en el proyecto

// 1. Obtener datos del usuario específico (MiguelVivar)
const user = await fetchGitHubUser();
// URL: https://api.github.com/users/MiguelVivar

// 2. Obtener repositorios (ordenados por actualización, máximo 100)
const repos = await fetchGitHubRepos();
// URL: https://api.github.com/users/MiguelVivar/repos?sort=updated&per_page=100

// 3. Calcular estadísticas de lenguajes (de repositorios activos)
const languages = await calculateLanguageStats(repos);
// Procesa hasta 15 repositorios activos (no forks, no archivados)
// Incluye 20+ lenguajes con colores específicos

// 4. Obtener estadísticas generales calculadas
const stats = await calculateGitHubStats();
// Combina datos de usuario, repos y eventos

// 5. Obtener actividad reciente (últimos 30 eventos)
const events = await fetchGitHubEvents();
// URL: https://api.github.com/users/MiguelVivar/events?per_page=30

// 6. Formatear actividad reciente en formato legible
const activity = formatRecentActivity(events);
// Convierte eventos de GitHub en objetos ActivityItem

// 7. Obtener lenguajes de un repositorio específico
const repoLanguages = await fetchRepoLanguages('Portafolio');
// URL: https://api.github.com/repos/MiguelVivar/{repoName}/languages

// 8. Obtener datos de contribuciones (hasta 300 eventos)
const contributions = await fetchGitHubContributions();
// Procesa múltiples páginas de eventos para estadísticas anuales

Interfaces TypeScript

Tipos de datos definidos
// Interfaces TypeScript reales implementadas

interface GitHubUser {
  public_repos: number;
  followers: number;
  following: number;
  created_at: string;
  login: string;
  name: string;
  bio: string;
  location: string;
  blog: string;
  twitter_username: string;
  company: string;
}

interface GitHubRepo {
  id: number;
  name: string;
  full_name: string;
  description: string;
  html_url: string;
  stargazers_count: number;
  forks_count: number;
  language: string;
  updated_at: string;
  created_at: string;
  pushed_at: string;
  fork: boolean;
  archived: boolean;
  topics: string[];
}

interface GitHubEvent {
  id: string;
  type: string;
  actor: { login: string };
  repo: { name: string };
  payload: {
    commits?: Array<{ message: string }>;
    ref_type?: string;
    [key: string]: unknown;
  };
  created_at: string;
}

interface LanguageStats {
  [language: string]: number;
}

interface ContributionDay {
  date: string;
  contributions: number;
  level: number; // 0-4 intensity level
}

interface ContributionStats {
  totalContributions: number;
  currentStreak: number;
  longestStreak: number;
  weeklyAverage: number;
  contributions: ContributionDay[];
}

interface LanguageData {
  name: string;
  percentage: number;
  color: string;
}

interface ActivityItem {
  type: 'commit' | 'repository' | 'star' | 'fork';
  message: string;
  date: string;
  repository?: string;
}

Ejemplo de Uso

Uso básico de la API
// Importar funciones de la API real
import { 
  fetchAllGitHubData,
  fetchGitHubUser,
  fetchGitHubRepos,
  calculateLanguageStats,
  fetchGitHubEvents,
  calculateGitHubStats,
  fetchGitHubContributions
} from '@/lib/githubApi';

// Usuario de GitHub configurado: 'MiguelVivar'
const GITHUB_USERNAME = 'MiguelVivar';
const GITHUB_API_BASE = 'https://api.github.com';

// Obtener todos los datos de GitHub en una sola llamada
const githubData = await fetchAllGitHubData();

console.log(githubData);
// Output real del proyecto:
{
  stats: {
    totalRepositories: 42,
    totalContributions: 1248,
    totalStars: 156,
    totalFollowers: 89,
    totalCommits: 2340,
    publicRepos: 38
  },
  languages: [
    { name: 'TypeScript', percentage: 35, color: '#3178c6' },
    { name: 'JavaScript', percentage: 28, color: '#f7df1e' },
    { name: 'Python', percentage: 18, color: '#3776ab' },
    { name: 'CSS', percentage: 12, color: '#1572b6' },
    { name: 'HTML', percentage: 7, color: '#e34f26' }
  ],
  recentActivity: [
    {
      type: 'commit',
      message: 'feat: Implementar dashboard de GitHub',
      date: '2024-05-24',
      repository: 'Portafolio'
    },
    {
      type: 'repository',
      message: 'Creado nuevo repositorio: Portfolio-2024',
      date: '2024-05-23'
    }
  ]
}

Implementación en React

GitHubDashboard.tsx
// Implementación real en GitHubDashboard.tsx
import React, { useEffect, useState } from 'react';
import { motion } from 'framer-motion';
import { FaGithub, FaStar, FaCodeBranch, FaUsers, FaCode } from 'react-icons/fa';
import { BiGitCommit } from 'react-icons/bi';
import { fetchAllGitHubData } from '../../lib/githubApi';

const GitHubDashboard: React.FC = () => {
  const [stats, setStats] = useState({
    totalRepositories: 0,
    totalContributions: 0,
    totalStars: 0,
    totalFollowers: 0,
    totalCommits: 0,
    publicRepos: 0
  });
  const [languages, setLanguages] = useState([]);
  const [recentActivity, setRecentActivity] = useState([]);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchGitHubData = async () => {
      try {
        setIsLoading(true);
        setError(null);
        
        // Llamada a la API real
        const data = await fetchAllGitHubData();
        
        setStats(data.stats);
        setLanguages(data.languages);
        setRecentActivity(data.recentActivity);
        
      } catch (error) {
        console.error('Error fetching GitHub data:', error);
        setError('Error al cargar datos de GitHub. Usando datos de respaldo.');
        
        // Fallback a datos simulados
        setStats({
          totalRepositories: 42,
          totalContributions: 1248,
          totalStars: 156,
          totalFollowers: 89,
          totalCommits: 2340,
          publicRepos: 38
        });
      } finally {
        setIsLoading(false);
      }
    };

    fetchGitHubData();
  }, []);

  // Renderizado con componentes especializados
  return (
    <div className="space-y-8">
      <GitHubStatsCard stats={stats} loading={isLoading} />
      <LanguageChart languages={languages} />
      <ContributionGraph />
      <RecentActivity activities={recentActivity} />
    </div>
  );
};

Endpoints de GitHub API

Endpoints Utilizados

GET /users/MiguelVivar

Información del perfil de usuario

GET /users/MiguelVivar/repos?sort=updated&per_page=100

Lista de repositorios ordenados por actualización

GET /users/MiguelVivar/events?per_page=30

Eventos y actividad reciente del usuario

GET /repos/MiguelVivar/{repo}/languages

Estadísticas de lenguajes por repositorio

Límites y Consideraciones

Rate Limit sin autenticación:60 req/hora
Repositorios procesados:15 activos
Eventos por consulta:30 eventos
Máximo contribuciones:300 eventos
Lenguajes soportados:20+ colores
Cache de datos:Por sesión

Configuración del Proyecto

Configuración Actual

Usuario GitHub:'MiguelVivar'
API Base URL:api.github.com
Archivo principal:githubApi.ts
Líneas de código:389 líneas

Componentes Relacionados

Dashboard principal:GitHubDashboard.tsx
Tarjeta de estadísticas:GitHubStatsCard.tsx
Gráfico de lenguajes:LanguageChart.tsx
Actividad reciente:RecentActivity.tsx

Manejo de Errores y Datos de Respaldo

Estrategia de Recuperación

La implementación incluye un sistema robusto de manejo de errores con datos de respaldo para garantizar que la interfaz siempre muestre información relevante, incluso cuando la API de GitHub no esté disponible.

Datos de Respaldo
  • • 42 repositorios totales
  • • 1,248 contribuciones
  • • 156 estrellas ganadas
  • • 89 seguidores
  • • 2,340 commits estimados
Lenguajes de Respaldo
  • • TypeScript (35%)
  • • JavaScript (28%)
  • • Python (18%)
  • • CSS (12%)
  • • HTML (7%)

Códigos de Error Manejados

Rate Limit Exceeded

Límite de 60 requests/hora excedido

403
Network Error

Error de conectividad o timeout

NET
Repository Not Found

Repositorio privado o no encontrado

404

Implementación del Try-Catch

try {
  setIsLoading(true);
  setError(null);
  
  const data = await fetchAllGitHubData();
  
  setStats(data.stats);
  setLanguages(data.languages);
  setRecentActivity(data.recentActivity);
  
} catch (error) {
  console.error('Error fetching GitHub data:', error);
  setError('Error al cargar datos de GitHub. Usando datos de respaldo.');
  
  // Fallback a datos simulados en caso de error
  setStats({ /* datos de respaldo */ });
  setLanguages({ /* lenguajes de respaldo */ });
  
} finally {
  setIsLoading(false);
}

Mapeo de Colores por Lenguaje

La API incluye un mapeo de colores específico para cada lenguaje de programación, utilizado en las visualizaciones de gráficos y estadísticas.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Nota: Los lenguajes no incluidos en este mapeo utilizan el color predeterminado #64748b. Los colores están basados en los estándares oficiales de cada lenguaje.

Enlaces y Recursos

Documentación Técnica Completa

Explora la documentación completa del portafolio, incluyendo arquitectura, sistema de terminal, componentes y guías de desarrollo.

Ver Documentación Completa

¿Necesitas ayuda con la implementación??

Contáctame para soporte personalizado y optimización de tu integración.