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 ... ...

近期下载者

相关文件


收藏者