Skip to content

adriano461997/futebol

Repository files navigation

Sistema de Jogos de Futebol

Este é um sistema desenvolvido em Laravel 11 e Inertia.js para consumir uma API pública de futebol e fornecer informações sobre os jogos do Campeonato Brasileiro ou de outras ligas, conforme escolha do usuário. O sistema permite visualizar próximos jogos, resultados passados e pesquisar por time específico.

Tecnologias Utilizadas

  • Backend: Laravel 11
  • Frontend: React.js via Inertia.js
  • Estilização: TailwindCSS
  • Outras bibliotecas:
    • react-slick - Utilizado para criar carrosséis de exibição
    • dayjs - Tratamento e formatação de datas
    • @iconify/react - Exibição de ícones

Funcionalidades

  • Selecionar um campeonato para visualizar seus jogos.
  • Exibir jogos programados da próxima rodada, incluindo:
    • Nome dos times (casa e visitante)
    • Data e hora do jogo
    • Estádio (se disponível)
  • Exibir últimos resultados das partidas já realizadas.
  • Permitir pesquisa por time e exibir suas próximas partidas e últimos resultados.

Desafios e Solução de Cache

A API https://api.football-data.org é muito instável e possui um limite de 10 chamadas por minuto, o que tornou necessário o uso de um sistema de cache.

  • O cache foi implementado na classe Services/ApiRequestService.php, armazenando as respostas da API por 5 minutos.
  • O ideal seria usar Redis, mas para fins de teste foi utilizado SQLite.
  • Como a API não possui um endpoint direto para buscar times, foi criado um mecanismo que:
    1. Obtém uma lista de 200 equipes e armazena em cache.
    2. Realiza buscas locais para encontrar times como "Barcelona".

Implementação do Cache

O cache é gerenciado pelo método makeWithCache() localizado na classe ApiRequestService, que verifica se os dados já estão armazenados antes de fazer uma nova requisição:

// Verifica se o cache já possui os dados
$cacheKey = md5($path . json_encode($params));
if (cache()->has($cacheKey)) {
    return cache($cacheKey);
}

// Se não houver cache, faz a requisição e armazena por 5 minutos
$response = self::make($path, $params, $method);
if ($response['status'] == 'error') {
    return $response;
}
cache([$cacheKey => $response], now()->addMinutes($minutes));
return $response;

Instalação e Execução

  1. Clone o repositório:

    git clone https://github.com/adriano461997/futebol.git
    cd futebol
  2. Instale as dependências do Laravel:

    composer install
  3. Instale as dependências do Node.js:

    npm install
  4. As ambientes de váriveis já estão disponíveis em .env.

  5. Execute as migrações do banco de dados:

    php artisan migrate
  6. Inicie o servidor e o frontend:

    composer run dev
  7. Acesse no navegador:

    http://localhost:8000
    

OBS:
Pela API ser instável, qualquer erro é só recarregar a página até que funcione. Este problema está no lado da API mesmo.

Estrutura dos Arquivos principais do projeco

app/
├── Http/
│   ├── Controllers/
│   │   ├── CompeticaoController.php
│   │   ├── HomeController.php
│   │   ├── PesquisarTimesController.php
│   │   ├── TeamController.php
│   ├── Middleware/
├── Services/
│   ├── ApiRequestService.php  # Serviço responsável pelas requisições da API
├── Models/
├── Views/
resources/
├── js/
│   ├── Components/
│   │   ├── CustomError.tsx
│   │   ├── MatchItem.tsx
│   ├── Layouts/
│   │   ├── CustomLayout.tsx
│   ├── Pages/
│   │   ├── Competicao/
│   │   │   ├── show.tsx
│   │   ├── Home.jsx  # Página principal
│   │   ├── Pesquisar/
│   │   │   ├── index.tsx
│   │   ├── Team/
│   │   │   ├── show.tsx
│   ├── app.tsx
│   ├── types/
│   │   ├── Competicao.ts
│   │   ├── CompeticaoTeams.ts
│   │   ├── Matches.ts
│   │   ├── TeamResponse.ts
resources/
├── views/
│   ├── app.blade.php
routes/
├── web.php

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages