Gustavoraf-Trybe-Project-TFC
所属分类:后台框架
开发工具:JavaScript
文件大小:0KB
下载次数:0
上传日期:2022-08-25 18:13:00
上 传 者:
sh-1993
说明: TypeScript以后端为中心的项目,创建供前端使用的REST API。与Docker.在TDD中开发。,
(TypeScript back-end focused project that creates a REST API to be consumed by a front- end. Developed in TDD with Docker.,)
文件列表:
__tests__/ (0, 2022-08-25)
__tests__/E2E/ (0, 2022-08-25)
__tests__/E2E/00_coverage_tests.test.js (2268, 2022-08-25)
__tests__/E2E/01_database.test.js (1533, 2022-08-25)
__tests__/E2E/02_login_validate.test.js (8266, 2022-08-25)
__tests__/E2E/03_resultMatchs.test.js (4875, 2022-08-25)
__tests__/E2E/04_insertMatchs.test.js (5069, 2022-08-25)
__tests__/E2E/05_editMatchs.test.js (5126, 2022-08-25)
__tests__/E2E/06_leaderboard_home.test.js (2802, 2022-08-25)
__tests__/E2E/07_leaderboard_away.test.js (2808, 2022-08-25)
__tests__/E2E/08_leaderboard_table.test.js (3321, 2022-08-25)
__tests__/config/ (0, 2022-08-25)
__tests__/config/constants.js (712, 2022-08-25)
__tests__/config/puppeteer.js (1182, 2022-08-25)
__tests__/config/sequelize.js (1042, 2022-08-25)
__tests__/config/sequencer.js (281, 2022-08-25)
__tests__/entities/ (0, 2022-08-25)
__tests__/entities/leaderboard/ (0, 2022-08-25)
__tests__/entities/leaderboard/awayResult.js (7830, 2022-08-25)
__tests__/entities/leaderboard/homeResult.js (8209, 2022-08-25)
__tests__/entities/leaderboard/index.js (170, 2022-08-25)
__tests__/entities/leaderboard/state01.js (3778, 2022-08-25)
__tests__/entities/leaderboard/state02.js (3759, 2022-08-25)
__tests__/entities/leaderboard/state03.js (3778, 2022-08-25)
__tests__/entities/matchs/ (0, 2022-08-25)
__tests__/entities/matchs/allMatchs.js (7315, 2022-08-25)
__tests__/entities/matchs/index.js (212, 2022-08-25)
__tests__/entities/matchs/onlyFinished.js (6103, 2022-08-25)
__tests__/entities/matchs/onlyInProgress.js (1264, 2022-08-25)
__tests__/expected_results/ (0, 2022-08-25)
__tests__/expected_results/clubs.js (663, 2022-08-25)
__tests__/expected_results/matchs.js (5072, 2022-08-25)
__tests__/expected_results/trybe_football_club.js (7492, 2022-08-25)
__tests__/utils/ (0, 2022-08-25)
__tests__/utils/commands.js (862, 2022-08-25)
__tests__/utils/configSequelize.js (202, 2022-08-25)
__tests__/utils/dataTestIds.js (3835, 2022-08-25)
__tests__/utils/inserts.js (3425, 2022-08-25)
__tests__/utils/logInto.js (1165, 2022-08-25)
... ...
## Sobre o projeto:
O projeto TFC é um projeto robusto de Front e Backend.
- O frontend é pré-pronto (no produzido por mim).
- O backend é uma API REST que usa a ORM Sequelize, configurada logo no início do projeto.
- O projeto usa TDD para seu desenvolvimento, os testes so unitários e de integrao. Isso significa que o que se tem de desenvolvido, se tem de testado, a princípio.
- O Docker Compose foi configurado para rodar a aplicao inteira, tanto Frontend quanto Backend e Banco de Dados, sendo os testes da Trybe só executados se essa configurao fosse feita corretamente.
Readme da Trybe
### Sequelize
Para o desenvolvimento, o time de produto te deu uma imagem para construir a modelagem do banco de dados. Com essa imagem você já consegue saber como:
- Nomear suas tabelas e colunas
- Quais so os tipos de suas colunas
- Relaes entre tabelas
![Exemplo banco de dados](https://github.com/gustavoraf/Gustavoraf-Trybe-Project-TFC/blob/master/./diagram.png)
**Ateno** para que os testes passem é necessário que a sua migration de `users` termine exatamente com `-create-user.js`.
#### 1 - Desenvolva em `/app/backend/src/database` nas pastas correspondentes, uma migration e um model para a tabela de `clubs`
- O avaliador consultará os dados da tabela clubs, verificando se ela contém os dados iniciais corretos
#### 2 - Desenvolva em `/app/backend/src/database` nas pastas correspondentes, uma migration e um model para a tabela de `matchs`
- O avaliador consultará os dados da tabela matchs, verificando se ela contém os dados iniciais corretos
#### 3 - Desenvolva em `/app/backend/src/database` nas pastas correspondentes, uma migration e um model para a tabela `users`
- O avaliador consultará os dados da tabela users, verificando se ela contém os dados iniciais corretos
### Login
- A rota deve ser (`/login`).
- A rota deve receber os campos `email` e `password` e esses campos devem ser validados no banco de dados;
- O campo `email` deve receber um email válido;
- O Campo `password` deve ter mais de 6 caracteres.
- Sua chave `JWT` do back-end, utilizada para assinatura do token, deve ser salva no arquivo `app/backend/jwt.evaluation.key`. Ela pode ser carregada em sua aplicao utilizando a biblioteca `fs` e é necessária para passar nos testes;
- O body da requisio deve conterá o seguinte formato:
```json
{
"email": "string",
"password": "string"
}
```
#### 4 - (`TDD`) Desenvolva testes que cubram no mínimo 5 por cento dos arquivos back-end em `/src` com um mínimo de 7 linhas cobertas
**Sugestes:**
- Se baseando no contrato do endpoint `/login` **do próximo requisito**, inicie um teste de integrao utilizando a metodologia `TDD`, que passará a seguir, com a implementao do requisito seguinte;
- Nesse primeiro momento, foque em desenvolver o que pede o requisito, progredindo gradualmente a partir disso;
- Para isso, utilize/altere o arquivo de referência `app/backend`/src`/tests/change.me.test.ts`
#### 5 - Desenvolva o endpoint `/login` no backend de maneira ele permita o acesso com dados válidos no frontend
- A rota de ser do tipo `POST`
- O avaliador verificará se é possível fazer o login com dados corretos e que após o acesso será redirecionado para a tela de jogos
Se o login foi feito com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http `200`:
```json
{
"user": {
"id": 1,
"username": "Admin",
"role": "admin",
"email": "admin@admin.com"
},
"token": "123.456.789" // Aqui deve ser o token gerado pelo backend.
}
```
#### 6 - (`TDD`) Desenvolva testes que cubram no mínimo 10 por cento dos arquivos back-end em `/src` com um mínimo de 19 linhas cobertas
**Sugesto:**
- Evolua os testes de integrao da sua rota `/login`, utilizando o método `TDD`, agora considerando **o contrato do próximo requisito**;
#### 7 - Desenvolva o endpoint `/login` no backend de maneira ele no permita o acesso com um email inválido no front-end
- O avaliador verificará se fazer o login com um email incorreto retornará status no-autorizado
Se o login tiver o "email" **inválido** o resultado retornado deverá ser conforme exibido abaixo, com um status http `401`:
```json
{ "message": "Incorrect email or password" }
```
#### 8 - (`TDD`) Desenvolva testes que cubram no mínimo 15 por cento dos arquivos back-end em `/src` com um mínimo de 25 linhas cobertas
**Sugesto:**
- Evolua os testes de integrao da sua rota `/login`, utilizando o método `TDD`, agora considerando **o contrato do próximo requisito**;
#### 9 - Desenvolva o endpoint `/login` no back-end de maneira ele no permita o acesso com uma senha inválida no front-end
- O avaliador verificará se fazer o login com uma senha incorreta retornará status no-autorizado
Se o login tiver a "senha" **inválida** o resultado retornado deverá ser conforme exibido abaixo, com um status http `401`:
```json
{ "message": "Incorrect email or password" }
```
#### 10 - (`TDD`) Desenvolva testes que cubram no mínimo 20 por cento dos arquivos back-end em `/src` com um mínimo de 35 linhas cobertas
**Sugesto:**
- Evolua os testes de integrao da sua rota `/login`, utilizando o método `TDD`, agora considerando **o contrato do próximo requisito**;
#### 11 - Desenvolva o endpoint `/login` no back-end de maneira ele no permita o acesso sem informar um email no front-end
- O avaliador verificará se ao tentar fazer o login sem um email retornará status no-autorizado
Se o login no tiver o campo "email", o resultado retornado deverá ser a mensagem abaixo, com um status http `401`:
```json
{ "message": "All fields must be filled" }
```
#### 12 - (`TDD`) Desenvolva testes que cubram no mínimo 30 por cento dos arquivos back-end em `/src` com um mínimo de 45 linhas cobertas
**Sugesto:**
- Evolua os testes de integrao da sua rota `/login`, utilizando o método `TDD`, agora considerando **os contratos dos próximos dois requisitos**;`
#### 13 - Desenvolva o endpoint `/login` no back-end de maneira ele no permita o acesso sem informar uma senha no front-end
- O avaliador verificará se ao tentar fazer login sem senha retornará status no-autorizado
Se o login no tiver o campo "password" o resultado retornado deverá ser conforme exibido abaixo, com um status http `401`:
```json
{ "message": "All fields must be filled" }
```
#### 14 - Desenvolva o endpoint `/login/validate` no back-end de maneira ele retorne os dados corretamente no front-end
- Deve ser uma rota `GET` que receba um `header` com parmetro `authorization` onde ficará armazenado o token gerado no login;
- O avaliador verificará se tentar bater na rota com um token válido, o mesmo retornará o tipo de usuário
A resposta deve ser de status `200` com uma `string` contendo a `role` do *user*:
```plaintext
"admin"
```
### Jogos
- Os requisitos a seguir consideram o consumo da rota `/clubs` para retornar os nomes dos times associados a partida na renderizao do front-end
#### 15 - (`TDD`) Desenvolva testes que cubram no mínimo 45 por cento dos arquivos back-end em `/src` com um mínimo de 70 linhas cobertas
**Sugesto:**
- Crie um novo teste de integrao, agora da sua rota `/clubs`, utilizando o método `TDD`, considerando **os contratos dos próximos dois requisitos**;
#### 16 - Desenvolva o endpoint `/clubs` no back-end de forma que ele possa retornar todos os times corretamente
- Deve ser uma rota `GET` com resposta com status `200` e com um `json` contendo o retorno no seguinte modelo:
```json
[
{
"id": 1,
"clubName": "Avaí/Kindermann"
},
{
"id": 2,
"clubName": "Bahia"
},
{
"id": 3,
"clubName": "Botafogo"
},
...
]
```
#### 17 - Desenvolva o endpoint `/clubs/:id` no back-end de forma que ele possa retornar dados de um time específico
- Deve ser uma rota `GET` com resposta com status `200` e com um `json` contendo o retorno no seguinte modelo:
```json
{
"id": 5,
"clubName": "Cruzeiro"
}
```
#### 18 - (`TDD`) Desenvolva testes que cubram no mínimo 60 por cento dos arquivos back-end em `/src` com um mínimo de 80 linhas cobertas
**Sugesto:**
- Crie um novo teste de integrao, agora da sua rota `/matchs`, utilizando o método `TDD`, agora considerando **os contratos dos próximos três requisitos**;`
#### 19 - Desenvolva o endpoint `/matchs` de forma que os dados apaream corretamente na tela de partidas no front-end.
- A rota deve ser um `GET` e retorna uma lista de partidas
- Será validado que a página apresentará todos os dados de partidas sem nenhum filtro
Exemplo de retorno:
```json
[
{
"id": 1,
"homeTeam": 16,
"homeTeamGoals": 1,
"awayTeam": 8,
"awayTeamGoals": 1,
"inProgress": false,
"homeClub": {
"clubName": "So Paulo"
},
"awayClub": {
"clubName": "Grêmio"
}
},
...
{
"id": 41,
"homeTeam": 16,
"homeTeamGoals": 2,
"awayTeam": 9,
"awayTeamGoals": 0,
"inProgress": true,
"homeClub": {
"clubName": "So Paulo"
},
"awayClub": {
"clubName": "Internacional"
}
}
]
```
#### 20 - Desenvolva o endpoint `/matchs` de forma que seja possível filtrar as partidas em andamento na tela de partidas do front-end
- A rota deverá ser do tipo `GET` e retornar uma lista de partidas filtradas
- Será validado que ao escolher a opo de partidas em andamento sero filtradas todas as partidas em andamento
- Essa requisio deverá usar `query string` para definir o parmetro
ex: `matchs?inProgress=true`
Exemplo de retorno da requisio:
```json
[
{
"id": 41,
"homeTeam": 16,
"homeTeamGoals": 2,
"awayTeam": 9,
"awayTeamGoals": 0,
"inProgress": true,
"homeClub": {
"clubName": "So Paulo"
},
"awayClub": {
"clubName": "Internacional"
}
},
{
"id": 42,
"homeTeam": 6,
"homeTeamGoals": 1,
"awayTeam": 1,
"awayTeamGoals": 0,
"inProgress": true,
"homeClub": {
"clubName": "Ferroviária"
},
"awayClub": {
"clubName": "Avaí/Kindermann"
}
}
]
```
#### 21 - Desenvolva o endpoint `/matchs` de forma que seja possível filtrar as partidas finalizadas na tela de partidas do front-end
- A rota deverá ser do tipo `GET` e retornar uma lista de partidas filtradas
- Será validado que ao escolher a opo de partidas finalizadas sero filtradas todas as partidas finalizadas
- Essa requisio deverá usar `query string` para definir o parmetro
ex: `matchs?inProgress=false`
Exemplo de retorno da requisio:
```json
[
{
"id": 1,
"homeTeam": 16,
"homeTeamGoals": 1,
"awayTeam": 8,
"awayTeamGoals": 1,
"inProgress": false,
"homeClub": {
"clubName": "So Paulo"
},
"awayClub": {
"clubName": "Grêmio"
}
},
{
"id": 2,
"homeTeam": 9,
"homeTeamGoals": 1,
"awayTeam": 14,
"awayTeamGoals": 1,
"inProgress": false,
"homeClub": {
"clubName": "Internacional"
},
"awayClub": {
"clubName": "Santos"
}
}
]
```
### Adicionar Partidas
- Para que os requisitos de criao de partidas, é necessário que a rota `/clubs` funcione corretamente
#### 22 - (`Bnus`; `TDD`) Desenvolva testes que cubram no mínimo 80 por cento dos arquivo back-end em `/src` com um mínimo de 100 linhas cobertas
**Sugesto:**
- Evolua os testes de integrao da sua rota `/matchs`, utilizando o método `TDD`, agora considerando **o contrato dos próximos requisitos**;`
#### 23 - Desenvolva a rota `/matchs` de modo que seja possível salvar uma partida com o status de inProgress como true no banco de dados
- A rota deverá ser do tipo `POST`, e retornar a partida inserida no banco de dados
- Será validado que é possível salvar um jogo no banco de dados e ver o jogo na página de jogos
- A partida só pode ser criada com token JWT validado;
- O corpo da requisio terá o seguinte formato:
```json
{
"homeTeam": 16, // O valor deve ser o id do time
"awayTeam": 8, // O valor deve ser o id do time
"homeTeamGoals": 2,
"awayTeamGoals": 2,
"inProgress": true // a partida deve ser criada como em progresso
}
```
- caso a partida seja inserida com sucesso, deve-se retornar os dados da partida:
```json
{
"id": 1,
"homeTeam": 16,
"homeTeamGoals": 2,
"awayTeam": 8,
"awayTeamGoals": 2,
"inProgress": true,
}
```
#### 24 - Desenvolva a rota `/matchs/:id/finish` de modo que seja possível salvar uma partida com o status de inProgress como false no banco de dados
- A rota deve ser do tipo `PATCH`
- Será recebido o `id` pelo parmetro da URL
- Será validado que ao finalizar uma partida é alterado no banco de dados e na página
#### 25 - Desenvolva o endpoint `/matchs` de forma que no seja possível inserir uma partida com times iguais
- Será validado que no é possível inserir uma partida com times iguais
- No deve ser possível criar uma partida com o mesmo time, exemplo: Barcelona x Barcelona, caso contrário, deve-se retornar o seguinte erro:
```json
{ "message": "It is not possible to create a match with two equal teams" }
```
#### 26 - Desenvolva o endpoint `/matchs` de forma que no seja possível inserir uma partida com time que no existe na tabela clubs
- Será validado que no é possível inserir uma partida com time que no existe na tabela clubs
- caso algum dos times no esteja cadastrado no banco de dados, deve-se retornar o seguinte erro:
```json
{ "message": "Team not found" }
```
### Editar Partidas
#### 27 - Desenvolva o endpoint `/matchs/:id` de forma que seja possível atualizar partidas em andamento
- O endpoint deve ser do tipo `PATCH`;
- Será recebido o `id` pelo parmetro da URL;
- Será avaliado que é possível alterar o resultado de uma partida.
- O corpo da requisio terá o seguinte formato:
```json
{
"homeTeamGoals": 3,
"awayTeamGoals": 1
}
```
#### 28 - Desenvolva o endpoint `/matchs/:id` de forma que seja possível finalizar partidas em andamento
- O endpoint deve ser do tipo `PATCH`
- Será recebido o `id` pelo parmetro da url
- Será avaliado que é possível finalizar uma partida em andamento
## Leaderboards
**Para construir as classificao, elas devem seguir as seguintes regras de negócios**
- Em que:
- `Classificao`: Posio na classificao;
- `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 marcados contra;
- `SG`: Saldo total de gols;
- `%`: Aproveitamento do time.
- Toda a regra de negócio e cálculos necessários devero ser realizados no seu back-end. A aplicao front-end apenas renderizará essas informaes;
- Para calcular o `Total de Pontos` você deve levar em considerao 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`.
- O resultado deverá ser ordenado sempre de forma decrescente, levando em considerao a quantidade de pontos que o time acumulou. Em caso de empate no `Total de Pontos`, você deve levar em considerao os seguintes critérios para desempate:
**Ordem para desempate**
1 Total de Vitórias;
2 Saldo de gols;
3 Gols a favor;
4 Gols contra.
**Ateno:**
Por padro, as respostas de todos os seus endpoints devero estar em inglês, mesmo a renderizao no front-end estando em português.
**Os seguintes pontos sero avaliados:**
```
- Se a lista de classificao está correta;
- Se a regra de classificao se mantem mesmo com mudanas na classificao
- Se a tabela de classificao tem 10 colunas;
- Se a tabela tem uma linha para cada time;
```
**Exemplo de retorno esperado:**
```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
#### 29 - Desenvolva o endpoint `/leaderboard/home` de forma que seja possível filtrar a classificaes dos times quando mandantes na tela de classificao do frontend com os dados iniciais do banco de dados
- O endpoint deverá ser do tipo `GET` e ter o retorno como descrito no exemplo do [leaderboard](https://github.com/gustavoraf/Gustavoraf-Trybe-Project-TFC/blob/master/#leaderboards)
- Será avaliado que ao fazer a requisio ao endpoint `/leaderboard/home` sero retornados os campos e valores corretos considerando os dados iniciais do banco de dados
#### 30 - Desenvolva o endpoint `/leaderboard/home`, de forma que seja possível filtrar a classificaes dos times quando mandantes na tela de classificao do front-end e ao inserir a partida Corinthians 2 X 1 Internacional a tabela será atualizada
- O retorno deve continuar como no [leaderboard](https://github.com/gustavoraf/Gustavoraf-Trybe-Project-TFC/blob/master/#leaderboards) e ordenar corretamente como na explicao
- Será avaliado que após acrescentar a partida Botafogo 2 X 1 Grêmio e fazer a requisio ao endpoint `/leaderboard/home` sero retornados os campos e valores corretos
### Leaderboard away
#### 31 - Desenvolva o endpoint `/leaderboard/away`, de forma que seja possível filtrar as classificaes dos times na tela de classificao do front-end, com os dados iniciais do banco de dados
- O endpoint deverá ser do tipo `GET` e ter o ret ... ...
近期下载者:
相关文件:
收藏者: