O Table FC é um site informativo sobre partidas e classificações de futebol! ⚽
No time de desenvolvimento do TFC
, eu fiquei responsável por desenvolver uma API (utilizando o método TDD
) e também integrar - através do docker-compose - as aplicações para que elas funcionem consumindo um banco de dados.
Nesse projeto, foi construído um back-end dockerizado utilizando modelagem de dados através do Sequelize. O desenvolvimento respeitou as regras de negócio providas no projeto e sua API é capaz de ser consumida por um front-end já provido nesse projeto.
O back-end também implementa regras de negócio para popular adequadamente a tabela disponível no front-end que será exibida para a pessoa usuária do sistema.
O projeto é composto de 4 entidades importantes para sua estrutura:
1️⃣ Banco de dados:
- É um container docker MySQL já configurado no docker-compose através de um serviço definido como
db
. - Tem o papel de fornecer dados para o serviço de backend.
- É possível conectar a um Cliente MySQL (Workbench, Beekeeper, DBeaver e etc), colocando as credenciais configuradas no docker-compose no serviço
db
.
2️⃣ Back-end:
- É o ambiente que você realizará a maior parte das implementações exigidas.
- Deve rodar na porta
3001
, pois o front-end faz requisições para ele nessa porta por padrão; - O
express
é executado e a aplicação ouve a porta que vem das variáveis de ambiente;
3️⃣ Front-end:
- O front se comunica com serviço de back-end pela url
http://localhost:3001
através dos endpoints.
4️⃣ Docker:
- O
docker-compose
tem a responsabilidade de unir todos os serviços conteinerizados (backend, frontend e db) e subir o projeto completo com o comandonpm run compose:up
; - O arquivo
docker-compose.yml
também pode ser utilizado para executar a aplicação na máquina local, para isso é necessário executar o comandonpm run compose:up
na raiz do projeto.
Para o desenvolvimento, o time de produto disponibilizou um Diagrama de Entidade-Relacionamento (DER) para construir a modelagem do banco de dados.
• Ao rodar o comando npm install
na pasta raiz do projeto você estará instalando somente as dependências para rodar os requisitos do projeto;
• Cada diretório (frontend
e backend
) possui suas próprias dependências - você pode instalá-las de forma rápida rodando o comando npm run install:apps
na pasta raiz do projeto, ou rodando npm install
dentro de cada diretório;
• O front se comunica com serviço de back-end pela url http://localhost:3001 através dos endpoints. Basta acessar no seu computador para ver a aplicação rodando.
-
Fluxo 1
• Os requisitos a seguir consideram o consumo da rota
/teams
para retornar os nomes dos times associados à partida na renderização do front-endRequisitos 1 - Desenvolva em/app/backend/src/database
nas pastas correspondentes, uma migration e um model para a tabela de times2 - (
TDD
) Desenvolva testes que cubram no mínimo 5 por cento dos arquivos em/app/backend/src
, com um mínimo de 7 linhas cobertas3 - Desenvolva o endpoint
/teams
no back-end de forma que ele possa retornar todos os times corretamente4 - (
TDD
) Desenvolva testes que cubram no mínimo 10 por cento dos arquivos em/app/backend/src
, com um mínimo de 19 linhas cobertas5 - Desenvolva o endpoint
/teams/:id
no back-end de forma que ele possa retornar dados de um time específico -
Fluxo 2
• A rota utilizada deve ser (
/login
); • A rota deve receber os camposemail
epassword
e esses campos devem ser validados no banco de dados: ◦ O campoemail
deve receber um email válido. Ex:[email protected]
; ◦ O campopassword
deve ter mais de 6 caracteres. ◦ Além de válidos, é necessário que o email e a senha estejam cadastrados no banco para ser feito o login; • O body da requisição deve conter o seguinte formato:{ "email": "string", "password": "string" }
-
Requisitos Fluxo 2
6 - Desenvolva em
/app/backend/src/database
nas pastas correspondentes, uma migration e um model para a tabela de pessoas usuárias7 - (
TDD
) Desenvolva testes que cubram no mínimo 15 por cento dos arquivos em/app/backend/src
, com um mínimo de 25 linhas cobertas8 - Desenvolva o endpoint
/login
no back-end de maneira que ele permita o acesso com dados válidos no front-end9 - (
TDD
) Desenvolva testes que cubram no mínimo 20 por cento dos arquivos em/app/backend/src
, com um mínimo de 35 linhas cobertas10 - Desenvolva o endpoint
/login
no back-end de maneira que ele não permita o acesso com um email não cadastrado ou senha incorreta no front-end11 - (
TDD
) Desenvolva testes que cubram no mínimo 30 por cento dos arquivos em/app/backend/src
, com um mínimo de 45 linhas cobertas12 - Desenvolva um middleware de validação para o
token
, verificando se ele é válido, e desenvolva o endpoint/login/role
no back-end de maneira que ele retorne os dados corretamente no front-end -
Fluxo 3
• Para os requisitos de criação de partidas, será necessário implementar o model e algumas rotas relacionadas a entidade Match. • A partir do requisito 17 até o requisito 21 serão feitas validações de token: ◦ Caso o token não seja informado, deve-se retornar, com um status
401
, a seguinte mensagem:{ "message": "Token not found" }
• Será validado que não é possível alterar uma partida com um token inválido; ◦ Caso o token informado não seja válido, deve-se retornar, com um status401
, a seguinte mensagem:{ "message": "Token must be a valid token" }
-
Requisitos Fluxo 3
13 - Desenvolva em
/app/backend/src/database
nas pastas correspondentes, uma migration e um model para a tabela de partidas14 - (
TDD
) Desenvolva testes que cubram no mínimo 45 por cento dos arquivos em/app/backend/src
, com um mínimo de 70 linhas cobertas15 - Desenvolva o endpoint
/matches
de forma que os dados apareçam corretamente na tela de partidas no front-end16 - Desenvolva o endpoint
/matches
de forma que seja possível filtrar somente as partidas em andamento, e também filtrar somente as partidas finalizadas, na tela de partidas do front-end17 - Desenvolva o endpoint
/matches/:id/finish
de modo que seja possível finalizar uma partida no banco de dados • A rota deve ser do tipoPATCH
; • Será recebido oid
pelo parâmetro da URL; • Será validado que não é possível alterar uma partida sem um token; ◦ Confira a resposta esperada na introdução dessa seção. • Será validado que, ao finalizar uma partida, a alteração é feita no banco de dados e na página. • Deve-se retornar, com um status200
, a seguinte mensagem:{ "message": "Finished" }
18 - Desenvolva o endpoint/matches/:id
de forma que seja possível atualizar partidas em andamento19 - (
TDD
) Desenvolva testes que cubram no mínimo 60 por cento dos arquivos em/app/backend/src
, com um mínimo de 80 linhas cobertas20 - Desenvolva o endpoint
/matches
de modo que seja possível cadastrar uma nova partida em andamento no banco de dados21 - Desenvolva o endpoint
/matches
de forma que não seja possível inserir uma partida com times iguais nem com um time que não existe na tabela de times -
Fluxo 4
▶️ Para construir a classificação dos times, devem ser seguidas as seguintes regras de negócios:-
Classificação`: Posição na classificação;Time
: Nome do time;P
: Total de Pontos;J
: Total de Jogos;V
: Total de Vitórias;E
: Total de Empates;D
: Total de Derrotas;GP
: Gols marcados a favor;GC
: Gols sofridos;SG
: Saldo total de gols;%
: Aproveitamento do time.`
• Todas as regras de negócio e cálculos necessários deverão ser realizados no seu back-end. A aplicação front-end - que já está pronta - apenas renderizará essas informações. • Para calcular o
Total de Pontos
, você deve levar em consideração que: ◦ O timevitorioso
: marcará +3 pontos; ◦ O timeperdedor
: marcará 0 pontos; ◦ Em caso deempate
: ambos os times marcam +1 ponto. • Para o campoAproveitamento do time (%)
, que é a porcentagem de jogos ganhos, use a seguinte fórmula:[P / (J * 3)] * 100
, onde: ◦P
: Total de Pontos; ◦J
: Total de Jogos. Obs.: O seu resultado deverá ser limitado aduas casas decimais
. • Para calcularSaldo de Gols
use a seguinte fórmula:GP - GC
, onde: ◦GP
: Gols marcados a favor; ◦GC
: Gols sofridos. • O resultado deverá ser ordenado sempre de forma decrescente, levando em consideração a quantidade de pontos que o time acumulou. Em caso de empate noTotal de Pontos
, você deve levar em consideração os seguintes critérios para desempate:Ordem para desempate • 1º Total de Vitórias; • 2º Saldo de gols; • 3º Gols a favor;
⚠️ Atenção:⚠️ • Por padrão, as respostas de todos os seus endpoints deverão estar em inglês, mesmo que a renderização no front-end seja em português. • A sua tabela deverá renderizar somente as PARTIDAS que já foram FINALIZADAS! Os seguintes pontos serão avaliados:`- Se a lista de classificação está correta;
- Se a regra de classificação se mantém mesmo com mudanças na classificação;
- Se a tabela de classificação tem 10 colunas;
- Se a tabela tem uma linha para cada time.`
Exemplo de retorno esperado:
[ { "name": "Palmeiras", "totalPoints": 13, "totalGames": 5, "totalVictories": 4, "totalDraws": 1, "totalLosses": 0, "goalsFavor": 17, "goalsOwn": 5, "goalsBalance": 12, "efficiency": 86.67 }, { "name": "Corinthians", "totalPoints": 12, "totalGames": 5, "totalVictories": 4, "totalDraws": 0, "totalLosses": 1, "goalsFavor": 12, "goalsOwn": 3, "goalsBalance": 9, "efficiency": 80 }, { "name": "Santos", "totalPoints": 11, "totalGames": 5, "totalVictories": 3, "totalDraws": 2, "totalLosses": 0, "goalsFavor": 12, "goalsOwn": 6, "goalsBalance": 6, "efficiency": 73.33 }, ... ]
• Os endpoints dessa seção, irão alimentar uma tabela idêntica ao exemplo abaixo no front-end:ClassificaçãoTimePJVEDGPGCSG%1Ferroviária3815122144133184.4 -
Requisito Fluxo 4
Requisitos 22 - (
Bônus
;TDD
) Desenvolva testes que cubram no mínimo 80 por cento dos arquivos em/app/backend/src
, com um mínimo de 100 linhas cobertas23 - Desenvolva o endpoint
/leaderboard/home
de forma que retorne as informações do desempenho dos times da casa com as seguintes propriedades:name
,totalPoints
,totalGames
,totalVictories
,totalDraws
,totalLosses
,goalsFavor
egoalsOwn
24 - Desenvolva o endpoint
/leaderboard/home
de forma que seja possível filtrar as classificações dos times da casa na tela de classificação do front-end com os dados iniciais do banco de dados, incluindo as propriedadesgoalsBalance
eefficiency
, além das propriedades do requisito anterior25 - Desenvolva o endpoint
/leaderboard/home
de forma que seja possível filtrar as classificações dos times da casa na tela de classificação do front-end, e atualizar a tabela ao inserir a partida Corinthians 2 X 1 Internacional26 - Desenvolva o endpoint
/leaderboard/away
de forma que retorne as informações do desempenho dos times visitantes com as seguintes propriedades:name
,totalPoints
,totalGames
,totalVictories
,totalDraws
,totalLosses
,goalsFavor
egoalsOwn
27 - Desenvolva o endpoint
/leaderboard/away
, de forma que seja possível filtrar as classificações dos times quando visitantes na tela de classificação do front-end, com os dados iniciais do banco de dados, incluindo as propriedadesgoalsBalance
eefficiency
, além das propriedades do requisito anterior28 - Desenvolva o endpoint
/leaderboard/away
de forma que seja possível filtrar as classificações dos times quando visitantes na tela de classificação do front-end e atualizar a tabela ao inserir a partida Corinthians 2 X 1 Internacional29 - Desenvolva o endpoint
/leaderboard
de forma que seja possível filtrar a classificação geral dos times na tela de classificação do front-end com os dados iniciais do banco de dados30 - (
Bônus
) Desenvolva o endpoint/leaderboard
de forma que seja possível filtrar a classificação geral dos times na tela de classificação do front-end e atualizar a tabela ao inserir a partida Flamengo 3 X 0 Napoli-SC