Uma aplicação que possui front-end e back-end. Fiquei responsável por realizar o diretório de back-end da aplicação, a Trybe entregou o front.
Aplicação do back consiste em gerenciamento de uma tabela de campeonato de Futebol. Com funcionalidades de Login, Partidas, Times e da Tabela.
Utilizando o Docker para o deploy, junto com o NODE Js, Sequelize e TypeScript. Segurança de Software através do JWT - Jason Web Token e bcrypt.
Aplicação possui teste unitários desenvolvido com o uso de Jest, Mocha e Chai.
Aplicação desenvolvida utilizando POO - Programação Orientada a Objetos.
Uma parte considerável da aplicação foi testada, pretendo cobrir toda a aplicação ainda.
- LINK DO DEPLOY
- Clone este repositório.
- Entre no diretório criado.
-
Na raiz do proketo intale as dependências da aplicação, tanto front-end quanto back-end com o scrypt.
npm run install:apps -
Na Raiz do projeto utilize o seguinte scrypt para "subir" os containers do Docker
npm run compose:up - Entre no diretório /app/backend
-
Utilize o script de desnvolvimento para rodar a aplicação ou o de start para inicializar a aplicação, ambos rodam na PORT 3001
npm run dev ou npm start -
Utlize um software de auxílio, insomnia ou semelhante, ou uma extensão do vscode, thunderclient ou semelhante, para realizar as requisições para os endpoints. Com o projeto clonado podes fazer requisições para
localhost:3001/{endpoint}
Endpoints:
/login - { post }
/login/role - { get }
/login/all - { get }
/teams - { get }
/teams/:id - { get }
/matches - { get, post }
/matches/:id - { get }
/matches/:id/finish - { patch }
/matches/:id - { patch }
/leaderborad { get }
/leaderborad/away { get }
/leaderborad/home { get }
Testes
Este endpoint contém um serviço para lidar com operações relacionadas a usuários, como autenticação, obtenção de usuários e verificação de papéis de usuário.
Funcionalidades Principais
- Obter Todos os Usuários { GET }
- A função `getAllUsers` permite obter todos os usuários registrados no sistema.
-
Ela retorna uma lista de usuários com suas informações.
- Login de Usuário { POST }
- A função `login` realiza o processo de autenticação de um usuário com base em um email e senha fornecidos.
- Ela verifica se o email é válido e se a senha atende aos requisitos mínimos de comprimento.
- Em seguida, verifica se o email corresponde a um usuário registrado no banco de dados e se a senha fornecida corresponde à senha registrada para esse usuário, usando BCRYPT.
- Se a autenticação for bem-sucedida, a função gera um token JWT para o usuário autenticado.
-
Exemplo de corpo da Requisição:
{ "username": "string", "password": "string" } - ["/login/role"] Obter Papel do Usuário { GET }
- A função `getRole` obtém o papel (role) de um usuário com base nas informações decodificadas do token JWT.
-
Ela verifica se o usuário correspondente ao ID decodificado do token existe no banco de dados e retorna o papel associado a esse usuário.
Este endpoint contém um serviço para lidar com operações relacionadas a equipes, como obtenção de todas as equipes e obtenção de uma equipe específica por ID.
Funcionalidades Principais
- Obter Todas as Equipes { GET }
- A função `getAllTeams` permite obter todas as equipes registradas no sistema.
- Ela retorna uma lista de equipes com suas informações.
- ["/teams/:id"] Obter Equipe por ID { GET }
- A função `getTeamById` permite obter uma equipe específica com base no seu ID.
- Ela recebe o ID da equipe como parâmetro e retorna a equipe correspondente, se existir, ou null caso contrário.
-
Esta função é útil para buscar informações detalhadas de uma equipe específica.
Este endpoint contém um serviço para lidar com operações relacionadas a partidas de futebol, como obtenção de todas as partidas, obtenção de uma partida por ID, obtenção de partidas em andamento, finalização de uma partida, atualização de uma partida e criação de uma nova partida.
Funcionalidades Principais
- Obter Todas as Partidas { GET }
- A função `getAllMatches` permite obter todas as partidas registradas no sistema.
-
Ela retorna uma lista de partidas com suas informações.
- ["/matches/:id"] Obter Partida por ID { Get }
- A função `getMatchById` permite obter uma partida específica com base no seu ID.
-
Ela recebe o ID da partida como parâmetro e retorna a partida correspondente, se existir, ou null caso contrário.
- Obter Partidas em Andamento { GET }
- A função `getMatchesInProgress` permite obter todas as partidas em andamento ou em progresso.
-
Ela recebe um valor como parâmetro e retorna as partidas em andamento, se existirem.
- ["/matches/:id/finish"] Finalizar uma Partida { PATCH }
- A função `finishMatch` permite marcar uma partida como finalizada com base no seu ID.
-
Ela recebe o ID da partida como parâmetro e atualiza o status da partida para finalizada.
- ["/matches/:id"] Atualizar uma Partida { PATCH }
- A função `updateMatch` permite atualizar os resultados de uma partida com base no seu ID.
-
Ela recebe o ID da partida, os gols marcados pelo time da casa e os gols marcados pelo time visitante como parâmetros e atualiza os resultados da partida.
- Criar uma Nova Partida { POST }
- A função `createMatch` permite criar uma nova partida com base nos IDs dos times participantes e os gols marcados por cada time.
- Ela verifica se os times existem no sistema e se são diferentes antes de criar a partida.
- Em seguida, cria a partida no banco de dados com os dados fornecidos.
-
Exemplo do corpo da Requisição:
{ "homeTeamId": 16, // O valor deve ser o id do time "awayTeamId": 8, // O valor deve ser o id do time "homeTeamGoals": 2, "awayTeamGoals": 2 }
O endpoint de Leaderboard oferece funcionalidades para lidar com informações sobre pontuações, vitórias, derrotas, gols e eficiência de equipes em partidas.
LeaderBoardEntity:
A entidade LeaderBoardEntity fornece métodos auxiliares para calcular eficiência, filtrar e combinar informações da tabela de classificação.
Funcionalidades da Entidade
- Ordenar Tabela de Classificação
- A função `sortLeaderboard` ordena a tabela de classificação com base em critérios como total de pontos, vitórias, saldo de gols e gols marcados.
- Calcular Eficiência
- A função `calculateEfficiency` calcula a eficiência de uma equipe com base em pontos, empates e número de partidas.
- Filtrar e Combinar Tabelas
- A função `fullFilteredStatus` , `combine` e `combineLeaderboard` são responsáveis por filtrar, combinar e calcular as informações necessárias para a tabela de classificação.
Funcionalidades Principais do EndPoint
- ["/leaderboard/home"] Obter Status da Tabela de Classificação { GET }
- A função `homeStatus ` permite obter o status atualizado da tabela de classificação das equipes que atuam como time da casa.
- Ela retorna a tabela de classificação ordenada por critérios como total de pontos, vitórias, saldo de gols e gols marcados.
- ["/leaderboard/away"] Obter Status da Tabela de Classificação (Time Visitante) { GET }
- A função `awayStatus` permite obter o status atualizado da tabela de classificação das equipes que atuam como time visitante.
- Ela também retorna a tabela de classificação ordenada pelos mesmos critérios mencionados anteriormente.
- Obter Status Geral da Tabela de Classificação
- A função `status` combina as informações da tabela de classificação dos times da casa e visitantes para fornecer uma visão geral e atualizada do desempenho das equipes.
- Retorna a tabela de classificação combinada, ordenada pelos critérios de classificação.
A aplicação foi testada utilizando o Jest, Mocha e Chai. Os testes são unitários e estão no diretório /app/backend/src/tests.
Utilização de Mocks
Os comandos para testar a aplicação são os seguintes:
npm run test
npm run test:coverage
Neste projeto utilizei as seguintes ferramentas: