O TFC é um site informativo sobre partidas e classificações de futebol!
Front-end: React, Hooks e Axios
Back-end: Node, Express, JWT, BcryptJS e MySQL
- 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.
- Inserir uma nova partida com times diferentes.
- Inserir uma nova partida com token válido.
- Atualizar partidas em andamento.
- 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.
# 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
Email: user@user.com
Senha: secret_user
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ódigo400
, 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;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" }
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"
},
// ...
]
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"
}
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"
}
}
]
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"
}
}
]
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"
}
}
]
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ódigo401
, 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;PATCH /matches/:id/finish
A resposta da requisição é a seguinte, com status 200:
{ "message": "Finished" }
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"
}
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"
}
]
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"
}
]
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"
}
]