/trybe-futebol-clube-BE

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

Primary LanguageTypeScript

Trybe Futebol Clube

Contexto

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

Preview
page3

O projeto é um site informativo sobre um campeonato de futebol que contém classificações e tabelas de jogos. O front-end fornece as informações que são enviadas ao back-end por meio de uma API e posteriormente armazenadas no banco de dados. Fui responsável pelo desenvolvimento de todo o back-end e banco de dados, enquanto o front-end foi desenvolvido pela equipe Trybe.

O que é a Trybe?🤔 A Trybe é uma escola de desenvolvimento web genuinamente comprometida com o sucesso profissional de seus estudantes. Com o Modelo de Sucesso Compartilhado (MSC) oferecido pela Trybe Fintech, uma instituição financeira autorizada pelo Banco Central do Brasil, os alunos têm a opção de pagar apenas quando estiverem trabalhando.

Diagrama de entidade e relacionamento

Ver diagrama page3

EndPoints

Teams
  • /teams rota do tipo GET com resposta com um json contendo o retorno no seguinte modelo:
[
  {
    "id": 1,
    "teamName": "Avaí/Kindermann"
  },
  {
    "id": 2,
    "teamName": "Bahia"
  },
  {
    "id": 3,
    "teamName": "Botafogo"
  },
  ...
]
  • /teams/:id rota do tipo GET que retorna um time específico no seguinte formato:
{
  "id": 5,
  "teamName": "Cruzeiro"
}
Users
/login POST
  • /login com o body no seguinte formato:
{
  "email": "string",
  "password": "string"
}
  • Se o login foi feito com sucesso, o resultado retornado deverá ser similar ao exibido abaixo, com um status http 200:

    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6ImFkbWluIiwiaWF0IjoxNjU0NTI3MTg5fQ.XS_9AA82iNoiVaASi0NtJpqOQ_gHSHhxrpIdigiT-fc" // Aqui deve ser o token gerado pelo backend.
    }
Casos de erro no login - Se o login não tiver o campo "email", o resultado retornado deverá ser a mensagem abaixo, com um status http `400`:
  { "message": "All fields must be filled" }
  • Se o login não tiver o campo "password", o resultado retornado deverá ser conforme exibido abaixo, com um status http 400:

    { "message": "All fields must be filled" }
  • Se o login tiver o "email" inválido ou a "senha" inválida, o resultado retornado será similar ao exibido abaixo, com um status http 401:

      { "message": "Invalid email or password" }
/login/role GET
  • recebe um header com parâmetro authorization, onde ficará armazenado o token gerado no login;

  • Caso o token não seja informado, é retornado o status 401 e a seguinte mensagem:

{ "message": "Token not found" }
  • Caso o token informado não seja válido, é retornado o status 401 e a seguinte mensagem:
{ "message": "Token must be a valid token" }

A resposta é o status 200 com um objeto contendo a role do user:

  { "role": "admin" }
Matches
/matches GET
  • Retorna uma lista de partidas. Exemplo de retorno:
  [
    {
      "id": 1,
      "homeTeamId": 16,
      "homeTeamGoals": 1,
      "awayTeamId": 8,
      "awayTeamGoals": 1,
      "inProgress": false,
      "homeTeam": {
        "teamName": "São Paulo"
      },
      "awayTeam": {
        "teamName": "Grêmio"
      }
    },
    ...
    {
      "id": 41,
      "homeTeamId": 16,
      "homeTeamGoals": 2,
      "awayTeamId": 9,
      "awayTeamGoals": 0,
      "inProgress": true,
      "homeTeam": {
        "teamName": "São Paulo"
      },
      "awayTeam": {
        "teamName": "Internacional"
      }
    }
  ]
/matches POST
  • O usuário precisa ter um role de administrador para salvar uma nova partida.

  • O corpo da requisição tem o seguinte formato:

{
  "homeTeamId": 16, // O valor deve ser o id do time
  "awayTeamId": 8, // O valor deve ser o id do time
  "homeTeamGoals": 2,
  "awayTeamGoals": 2,
}
/matches/:id PATCH
  • O usuário precisa ter um role de administrador para salvar uma nova partida.

  • Altera o resultado de uma partida.

  • O body da requisição tem o seguinte formato:

{
  "homeTeamGoals": 3,
  "awayTeamGoals": 1
}
Leaderboards (Placares)
/leaderboards ▶️ A classificação dos times, segue 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.

<br/>
  • Para calcular o Total de Pontos, foi levado em consideração que:

    • O time vitorioso: marcará +3 pontos;
    • O time perdedor: marcará 0 pontos;
    • Em caso de empate: ambos os times marcam +1 ponto.
  • Para o campo Aproveitamento 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 a duas casas decimais.

  • Para calcular Saldo 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 no Total 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;

Exemplo de retorno:

[
  {
    "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
  },
  ...
]
/leaderboard/home
  • Retorna informações de desempenho dos times da casa
/leaderboard/away
  • Retorna informações de desempenho dos times visitantes

Habilidades demonstradas:

  • Docker: Utilizando Containers.
  • Node.js: ORM e Autenticação.
  • Programação Orientada a Objetos (POO) e SOLID.

Tecnologias utilizadas:

  • Node.js - Plataforma para executar código JavaScript no lado do servidor.
  • TypeScript - Superset do JavaScript que adiciona tipagem estática, aumentando a segurança e robustez do código.
  • Express - É um framework de desenvolvimento web leve que oferece recursos robustos e permite uma implantação rápida. É uma boa opção para criar back-ends escalonáveis, fáceis de manter e de alto desempenho.
  • ORM Sequelize - O Sequelize é um Object-Relational Mapping (ORM) para Node.js que permite a criação de modelos em JavaScript ou TypeScript para representar as tabelas de um banco de dados.
  • MySql - O MySQL é um sistema de gerenciamento de banco de dados relacional (SGBD) de código aberto e gratuito, que é usado para armazenar, organizar e recuperar dados.
  • bcryptjs - Bcrypt é uma biblioteca de criptografia de senhas que foi projetada para ser usada com o Node. js, uma plataforma de desenvolvimento de aplicativos em JavaScript. Ele fornece uma maneira fácil de armazenar senhas de forma segura, usando um algoritmo de hash forte e uma técnica chamada “salting”.
  • JWT - O JWT (JSON Web Token) é uma forma de autenticação que permite que um servidor verifique a identidade de um usuário sem precisar armazenar informações sobre ele.
  • joi - Validações em APIs
  • Chai - O chai é uma biblioteca de asserção que auxilia o desenvolvimento de testes com Node.js e que pode ser combinada com qualquer framework de testes JavaScript.
  • Mocha - O mocha é um framework de testes para JavaScript, isso significa que ele nos ajuda a arquitetar os nossos testes fornecendo a estrutura e interface para escrevermos e executarmos eles.
  • sinon - O Sinon é uma ferramenta que auxilia na criação e utilização dos dublês, fornecendo funções para diversos tipos de Test Doubles.

Entre em contato:

E-mail isaque oliveira WhatsApp