Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/isaque-s-0liveira/trybe-futebol-clube-be

O TFC é um site informativo sobre partidas e classificações de futebol!
https://github.com/isaque-s-0liveira/trybe-futebol-clube-be

bcryptjs express jwt-jsonwebtoken mocha-chai mysql orm-sequelize programacao-orientada-objetos sinon typescript

Last synced: 7 days ago
JSON representation

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

Awesome Lists containing this project

README

        

# 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:

```json
[
{
"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:

```json
{
"id": 5,
"teamName": "Cruzeiro"
}
```

Users

/login POST

- /login com o body no seguinte formato:

```json
{
"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`:

```json
{
"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`:

```json
{ "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`:

```json
{ "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`:

```json
{ "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:

```json
{ "message": "Token not found" }
```

- Caso o token informado não seja válido, é retornado o status `401` e a seguinte mensagem:

```json
{ "message": "Token must be a valid token" }
```

A resposta é o status `200` com um `objeto` contendo a `role` do *user*:
```json
{ "role": "admin" }
```

Matches

/matches GET

- Retorna uma lista de partidas. Exemplo de retorno:

```json
[
{
"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:

```json
{
"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:

```json
{
"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.


- 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:**

```json
[
{
"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](https://nodejs.org/) - Plataforma para executar código JavaScript no lado do servidor.
- [TypeScript](https://www.typescriptlang.org/) - Superset do JavaScript que adiciona tipagem estática, aumentando a segurança e robustez do código.
- [Express](https://expressjs.com/pt-br/) - É 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](https://sequelize.org/) - 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](https://www.mysql.com/) - 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](https://dev.to/mr_walkr/password-hashing-in-nodejs-using-bcryptjs-library-3j56) - 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](https://jwt.io/introduction) - 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](https://joi.dev/api/?v=17.13.3) - Validações em APIs
- [Chai](https://www.chaijs.com/api/bdd/) - 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](https://mochajs.org/) - 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](https://sinonjs.org/) - 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