O TFC é uma aplicação Frontend que exibe informações sobre partidas de futebol fornecido pela Trybe. O objetivo deste projeto foi arquitetar e desenvolver uma API REST que popula o Frontend com as informações de partidas, times e classificações, extraidas de um banco de dados MySQL, seguindo as regras de negócio previamente estipuladas. O desenvolvimento seguiu o método TDD(Test-driven development) com base em testes de integração, assim como os princípios SOLID. Para integrar Frontend, Backend e DB, foi utilizado o docker-compose.
- Docker;
- Node.js;
- Express.js;
- Typescript;
- JWT(JSON Web Token);
- MySQL;
- Sequelize(ORM);
- Jest;
- mocha;
- chai;
- sinon;
- Clone o repositório:
git clone git@github.com:caiquequaresmasilva/projeto-trybe-trybe-futebol-clube.git
- Entre na pasta do repositório clonado e instale as dependências:
cd projeto-trybe-trybe-futebol-clube
npm install
- Instale as aplicações frontend e backend executando o comando:
npm run install:apps
- Para rodar a aplicação integrada pelo docker-compose:
npm run compose:up
Quando rodando, a aplicação pode ser acessada pelo endereço http://localhost:3000/leaderboard.
- Para encerrar o docker-compose:
npm run compose:down
Para rodar as aplicações individualmente, é necessário configurar as variáveis de ambiente para conexão com um banco de dados MySQL no arquivo app/backend/.env
PORT=3001 # Porta de comunicação da API
DB_USER=root # Usuário de acesso ao banco de dados
DB_PASS=senha # Senha do usuário
DB_HOST=dbhost # Host do banco de dados
DB_NAME=TRYBE_FUTEBOL_CLUBE #Esse deve ser o nome do banco de dados
DB_PORT=3306 # Porta de comunicação com o banco de dados
- Para rodar o backend, entre no diretório correto e execute o script:
cd app/backend
npm start
A API pode ser acessada pelo endereço http://localhost:3001/.
- Para rodar o frontend, entre no diretório correto e execute o script:
cd app/frontend
npm start
A aplicação pode ser acessada pelo endereço http://localhost:3000/leaderboard.
-
POST /login
Se conter dados válidos, loga o usuário e retorna um Token de autenticação.Request body:
{ "email": "admin@admin.com", "password": "secret_admin" }
Response body:
{ "user": { "id": 1, "username": "Admin", "role": "admin", "email": "admin@admin.com" }, "token": "asdkal.hjfghf.werwqrq" //Exemplo de token gerado pelo backend }
HTTP STATUS:
200 OK
-
GET /login/validate
Deve possuir o token fornecido. Retornarole
do usuário.Response body:
"admin"
HTTP STATUS:
200 OK
-
GET /clubs
Retorna todos os times registrados no banco de dados.Response body:
[ { "id": 1, "clubName": "Avaí/Kindermann" }, { "id": 2, "clubName": "Bahia" }, ... ]
HTTP STATUS:
200 OK
-
GET /clubs/:id
Retorna time especificado.Request params:
/clubs/1
Response body:
{ "id": 1, "clubName": "Avaí/Kindermann" }
HTTP STATUS:
200 OK
-
GET /matchs
Retorna lista de todas as partidas.Response body:
[ { "id": 1, "homeTeamGoals": 1, "awayTeamGoals": 1, "inProgress": false, "homeTeam": 16, "awayTeam": 8, "homeClub": { "clubName": "São Paulo" }, "awayClub": { "clubName": "Grêmio" } }, ... { "id": 48, "homeTeamGoals": 1, "awayTeamGoals": 1, "inProgress": true, "homeTeam": 13, "awayTeam": 2, "homeClub": { "clubName": "Real Brasília" }, "awayClub": { "clubName": "Bahia" } } ]
HTTP STATUS:
200 OK
-
GET /matchs?inProgress
Retorna lista de todas as partidas filtradas pelo parâmetroinProgress
.Request query:
/matchs?inProgress=true
Response body:
[ { "id": 41, "homeTeamGoals": 2, "awayTeamGoals": 0, "inProgress": true, "homeTeam": 16, "awayTeam": 9, "homeClub": { "clubName": "São Paulo" }, "awayClub": { "clubName": "Internacional" } }, ... { "id": 48, "homeTeamGoals": 1, "awayTeamGoals": 1, "inProgress": true, "homeTeam": 13, "awayTeam": 2, "homeClub": { "clubName": "Real Brasília" }, "awayClub": { "clubName": "Bahia" } } ]
HTTP STATUS:
200 OK
-
POST /matchs
Deve possuir o token de autenticação. Cria uma partida com os dados válidos.Request body:
{ "homeTeam": 16, "awayTeam": 8, "homeTeamGoals": 2, "awayTeamGoals": 2, "inProgress": true }
Response body:
{ "id": 1, "homeTeam": 16, "homeTeamGoals": 2, "awayTeam": 8, "awayTeamGoals": 2, "inProgress": true, }
HTTP STATUS:
201 CREATED
-
PATCH /matchs/:id/finish
Deve possuir o token de autenticação. Finaliza a partida em progresso especificada.Request params:
matchs/1/finish
HTTP STATUS:
200 OK
-
PATCH /matchs/:id
Deve possuir o token de autenticação. Atualiza partida em andamento.Request params:
matchs/1
Request body:{ "homeTeamGoals": 3, "awayTeamGoals": 1 }
HTTP STATUS:
200 OK
-
GET /leaderboard
Retorna a classificação geral dos times em ordem decrescente.Response body:
[ { "name": "Palmeiras", "totalVictories": 4, "totalDraws": 1, "totalLosses": 0, "totalPoints": 13, "goalsFavor": 17, "goalsOwn": 5, "goalsBalance": 12, "totalGames": 5, "efficiency": 86.67 }, ... { "name": "Napoli-SC", "totalVictories": 0, "totalDraws": 2, "totalLosses": 3, "totalPoints": 2, "goalsFavor": 3, "goalsOwn": 12, "goalsBalance": -9, "totalGames": 5, efficiency": 13.33 } ]
HTTP STATUS:
200 OK
-
GET /leaderboard/home
Retorna a classificação dos timesmandantes
.Response body:
[ { "name": "Santos", "totalVictories": 3, "totalDraws": 0, "totalLosses": 0, "goalsFavor": 9, "goalsOwn": 3, "totalPoints": 9, "goalsBalance": 6, "totalGames": 3, "efficiency": 100 }, ... { "name": "Bahia", "totalVictories": 0, "totalDraws": 0, "totalLosses": 3, "goalsFavor": 0, "goalsOwn": 4, "totalPoints": 0, "goalsBalance": -4, "totalGames": 3, "efficiency": 0 } ]
HTTP STATUS:
200 OK
-
GET /leaderboard/away
Retorna a classificação dos timesvisitantes
.Response body:
[ { "name": "Palmeiras", "totalVictories": 2, "totalDraws": 0, "totalLosses": 0, "goalsFavor": 7, "goalsOwn": 0, "totalPoints": 6, "goalsBalance": 7, "totalGames": 2, "efficiency": 100 }, ... { "name": "Napoli-SC", "totalVictories": 0, "totalDraws": 0, "totalLosses": 3, "goalsFavor": 1, "goalsOwn": 10, "totalPoints": 0, "goalsBalance": -9, "totalGames": 3, "efficiency": 0 } ]
HTTP STATUS:
200 OK
-
Para rodar os testes de integração do backend, execute a API e rode o script:
cd app/backend npm start npm test
-
Para verificar a cobertura de testes, com a API rodando, rode o script:
npm run test:coverage