Skip to content

O TFC é um site informativo sobre partidas e classificações de futebol.

Notifications You must be signed in to change notification settings

pedroygor/trybe-futebol-clube

Repository files navigation

Trybe Futebol Clube

Sobre o projeto

O TFC é um site informativo sobre partidas e classificações de futebol!

Stack utilizada

Front-end: React, Hooks e Axios

Back-end: Node, Express, JWT, BcryptJS e MySQL

Funcionalidades do projeto

Login

  • Desenvolvimento de um endpoint /login que permita o acesso a partir do front-end, verificando se os dados são válidos e encriptados.
  • Verificação da existência de um email para acesso ao endpoint /login.
  • Verificação da existência de uma senha para acesso ao endpoint /login.

Partidas

  • Inserir uma nova partida com times diferentes.
  • Inserir uma nova partida com token válido.
  • Atualizar partidas em andamento.

Classificação

  • Retorna as classificações dos times da casa, considerando os dados iniciais do banco de dados. Partidas em andamento não são consideradas.
  • Retorna as classificações dos times visitantes, considerando os dados iniciais do banco de dados. Partidas em andamento não são consideradas.
  • Retorna a classificação geral dos times, considerando os dados iniciais do banco de dados. Partidas em andamento não são consideradas.

Instalação

# Clonar Projeto
$ git clone https://github.com/pedroygor/trybe-futebol-clube.git

# Entrar no diretório
$ cd trybe-futebol-clube

# Instalando dependências Front e Back
$ npm run postinstall

# Acessar diretório da aplicação
$ cd app

# Subir o docker
$ docker-compose up --build -d

Porta Front-End - http://localhost:3000
Porta Back-End - http://localhost:3001

Login

Email: user@user.com
Senha: secret_user


Documentação API

Authenticate

Realizar Login

POST /login
Parâmetro Tipo Descrição
email
senha
string
string
Obrigatório: email e senha
A estrutura do body da requisição deverá seguir o padrão abaixo:
{
  "email": "admin@admin.com",
  "password": "secret_admin"
}
A resposta da requisição é a seguinte, com status 200:
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6ImFkbWluIiwiaWF0IjoxNjU0NTI3MTg5fQ.XS_9AA82iNoiVaASi0NtJpqOQ_gHSHhxrpIdigiT-fc"
}
A requisição irá falhar nos seguintes casos: - A rota retorna o código 400, com a mensagem All fields must be filled caso o campo email não seja informado no body da requisição;
- A rota retorna o código 400, com a mensagem All fields must be filled caso o campo password não seja informado no body da requisição;
- A rota retorna o código 400, com a mensagem Incorrect email or password caso o campo email seja inválido no body da requisição;
- A rota retorna o código 400, com a mensagem Incorrect email or password caso o campo password seja inválido no body da requisição;

Validar Login

GET /login/validate
Parâmetro Tipo Descrição
authorization string Obrigatório: token de autenticação no header
A resposta da requisição é a seguinte, com status 200:
{ "role": "admin" }

Teams

Retorna todos os times

GET /teams
A resposta da requisição é a seguinte, com status 200:
[
  {
    "id": 1,
    "teamName": "Avaí/Kindermann"
  },
  {
    "id": 2,
    "teamName": "Bahia"
  },
  {
    "id": 3,
    "teamName": "Botafogo"
  },
  // ...
]

Retorna um Time

GET /teams/:id
Parâmetro Tipo Descrição
id string Obrigatório: O ID do time que você quer
A resposta da requisição é a seguinte, com status 200:
{
  "id": 1,
  "teamName": "Avaí/Kindermann"
}

Matches

Retorna todas as partidas

GET /matches
A resposta da requisição é a seguinte, com status 200:
[
  {
    "id": 1,
    "homeTeam": 16,
    "homeTeamGoals": 1,
    "awayTeam": 8,
    "awayTeamGoals": 1,
    "inProgress": false,
    "teamHome": {
      "teamName": "São Paulo"
    },
    "teamAway": {
      "teamName": "Grêmio"
    }
  },
  // ...
  {
    "id": 41,
    "homeTeam": 16,
    "homeTeamGoals": 2,
    "awayTeam": 9,
    "awayTeamGoals": 0,
    "inProgress": true,
    "teamHome": {
      "teamName": "São Paulo"
    },
    "teamAway": {
      "teamName": "Internacional"
    }
  }
]

Retorna lista de partidas em andamento

GET /matches?inProgress=true
A resposta da requisição é a seguinte, com status 200:
[
  {
    "id": 41,
    "homeTeam": 16,
    "homeTeamGoals": 2,
    "awayTeam": 9,
    "awayTeamGoals": 0,
    "inProgress": true,
    "teamHome": {
      "teamName": "São Paulo"
    },
    "teamAway": {
      "teamName": "Internacional"
    }
  },
  {
    "id": 42,
    "homeTeam": 6,
    "homeTeamGoals": 1,
    "awayTeam": 1,
    "awayTeamGoals": 0,
    "inProgress": true,
    "teamHome": {
      "teamName": "Ferroviária"
    },
    "teamAway": {
      "teamName": "Avaí/Kindermann"
    }
  }
]

Retorna lista de partidas finalizadas

GET /matches?inProgress=false
A resposta da requisição é a seguinte, com status 200:
[
  {
    "id": 1,
    "homeTeam": 16,
    "homeTeamGoals": 1,
    "awayTeam": 8,
    "awayTeamGoals": 1,
    "inProgress": false,
    "teamHome": {
      "teamName": "São Paulo"
    },
    "teamAway": {
      "teamName": "Grêmio"
    }
  },
  {
    "id": 2,
    "homeTeam": 9,
    "homeTeamGoals": 1,
    "awayTeam": 14,
    "awayTeamGoals": 1,
    "inProgress": false,
    "teamHome": {
      "teamName": "Internacional"
    },
    "teamAway": {
      "teamName": "Santos"
    }
  }
]

Cria partida em andamento

POST /matches
Parâmetro Tipo Descrição
homeTeam
awayTeam
homeTeamGoals
awayTeamGoals
inProgress
number
number
number
number
boolean
Obrigatório: Todos os campos obrigatórios
Adicionar ao Header o token de autenticação obrigatório em authorization
Exemplo do body da requisição:
{
  "homeTeam": 16, // O valor deve ser o id do time
  "awayTeam": 8, // O valor deve ser o id do time
  "homeTeamGoals": 2,
  "awayTeamGoals": 2,
  "inProgress": true
}
A resposta da requisição é a seguinte, com status 201:
{
  "id": 1,
  "homeTeam": 16,
  "homeTeamGoals": 2,
  "awayTeam": 8,
  "awayTeamGoals": 2,
  "inProgress": true,
}
A requisição irá falhar nos seguintes casos: - A rota retorna o código 401, com a mensagem It is not possible to create a match with two equal teams caso informe o mesmo valor para ambos os campos homeTeam e awayTeam body da requisição;
- A rota retorna o código 404, com a mensagem There is no team with such id! caso informe um id de time inválido no body da requisição;
- A rota retorna o código 401, com a mensagem Token must be a valid token caso informe um token de autenticação inválido no campo authorization dos headers da requisição;

Finaliza partida em andamento

PATCH /matches/:id/finish
A resposta da requisição é a seguinte, com status 200:
{ "message": "Finished" }

Altera os dados de uma partida em andamento

PATCH /matches/:id
A estrutura do body da requisição deverá seguir o padrão abaixo:
{
  "homeTeamGoals": 3,
  "awayTeamGoals": 1
}
Exemplo de Resposta da requisição com status 200:
{
  "message": "success"
}

Leaderboards

Retorna a classificação do campeonato

GET /leaderboard
A resposta da requisição é a seguinte, com status 200:
[
  {
    "name": "Palmeiras",
    "totalPoints": 13,
    "totalGames": 5,
    "totalVictories": 4,
    "totalDraws": 1,
    "totalLosses": 0,
    "goalsFavor": 17,
    "goalsOwn": 5,
    "goalsBalance": 12,
    "efficiency": "86.67"
  },
  // ...
  {
    "name": "Napoli-SC",
    "totalPoints": 2,
    "totalGames": 5,
    "totalVictories": 0,
    "totalDraws": 2,
    "totalLosses": 3,
    "goalsFavor": 3,
    "goalsOwn": 12,
    "goalsBalance": -9,
    "efficiency": "13.33"
  }
]

Classificação baseada apenas nos jogos em casa

GET /leaderboard/home
A resposta da requisição é a seguinte, com status 200:
[
  {
    "name": "Santos",
    "totalPoints": 9,
    "totalGames": 3,
    "totalVictories": 3,
    "totalDraws": 0,
    "totalLosses": 0,
    "goalsFavor": 9,
    "goalsOwn": 3,
    "goalsBalance": 6,
    "efficiency": "100.00"
  },
  // ...
  {
    "name": "Bahia",
    "totalPoints": 0,
    "totalGames": 3,
    "totalVictories": 0,
    "totalDraws": 0,
    "totalLosses": 3,
    "goalsFavor": 0,
    "goalsOwn": 4,
    "goalsBalance": -4,
    "efficiency": "0.00"
  }
]

Classificação baseada apenas nos jogos fora de casa

GET /leaderboard/away
A resposta da requisição é a seguinte, com status 200:
[
  {
    "name": "Palmeiras",
    "totalPoints": 6,
    "totalGames": 2,
    "totalVictories": 2,
    "totalDraws": 0,
    "totalLosses": 0,
    "goalsFavor": 7,
    "goalsOwn": 0,
    "goalsBalance": 7,
    "efficiency": "100.00"
  },
  // ...
  {
    "name": "Napoli-SC",
    "totalPoints": 0,
    "totalGames": 3,
    "totalVictories": 0,
    "totalDraws": 0,
    "totalLosses": 3,
    "goalsFavor": 1,
    "goalsOwn": 10,
    "goalsBalance": -9,
    "efficiency": "0.00"
  }
]

Autor