- Seção foi dedicada a aplicar mais os conhecimentos da seção anterior, explorando mais o typescript usando orientação a objetos e SOLID.
Imagens da documentação swagger e do frontend da trybe
- Neste projeto foi desenvolvido uma API para ser consumida por um frontend desenvolvido pela trybe, onde é criado um ambiente classificando times em partidas de futebol.
- Usando a ORM sequelize para coletar, criar, editar e deletar informações do banco.
- Realização da dockerização dos apps, network, volume e compose;
- Modelagem de dados com MySQL com sequelize;
- Criação e associação de tabelas;
- Construção de uma API Rest com endpoints para consumir os models criados;
- Técnicamente por ser algo que garante a melhor qualidade do projeto, foquei no uso do TDD (Test Driven Development), imaginar e prever o fluxo e abstração de cada funcionalidade na API, para criar um teste para caso de falha e acerto, construir frases mais acertivas que deixam claro o que o teste está realizando para em caso de falhas, ser nítido onde ocorreu o erro, inicialmente na aplicação usei muito o teste manual abrindo o thunderclient para ver se realmente os testes estavam corretos, ao começar a me familiarizar mais com os testes a agilidade se tornava maior na criação e na confiança dos testes.
- Na parte lógica o maior desafio, foi para criar a tabela de leadership, onde eu precisava classicar cada time, com base em seus resultados, definindo um filtro, onde ele era "visitante" ou da "casa".
- Foi muito gratificante, desenvolver e práticar nesse projeto o uso de classes, conseguir usar as classes para resolver o desafio para criar uma tabela de leadership, desenvolver e entender melhor os testes de integração usando o typescript.
- Usei classes para seguir o padrão inicial do projeto para definir os controllers, routes, services mas quero melhorar o uso dos principios do SOLID, usei classes mais para familiarização, mas poderia ter aplicado vários principios no desenvolvimento, pretendo aplicar os principios de liskov, abrindo possibilidades de mudança de ORM e uma flexibilização maior no projeto.
🗞️ Requisitos solicitados durante o desenvolvimento do projeto
Nome | Avaliação |
---|---|
1 - Desenvolva em /app/backend/src/database nas pastas correspondentes, uma migration e um model para a tabela de users | ✔️ |
2 - Desenvolva testes que cubram no mínimo 5 por cento dos arquivo backend em /src com um mínimo de 7 linhas cobertas | ✔️ |
3 - Desenvolva o endpoint /login no backend de maneira ele permita o acesso com dados válidos no frontend | ✔️ |
4 - Desenvolva testes que cubram no mínimo 10 por cento dos arquivo backend em /src com um mínimo de 19 linhas cobertas | ✔️ |
5 - Desenvolva o endpoint /login no backend de maneira ele não permita o acesso sem informar um email no frontend | ✔️ |
6 - Desenvolva testes que cubram no mínimo 10 por cento dos arquivo backend em /src com um mínimo de 19 linhas cobertas | ✔️ |
7 - Desenvolva o endpoint /login no backend de maneira ele não permita o acesso sem informar uma senha no frontend | ✔️ |
8 - Desenvolva testes que cubram no mínimo 20 por cento dos arquivo backend em /src com um mínimo de 35 linhas cobertas | ✔️ |
9 - Desenvolva o endpoint /login no backend de maneira ele não permita o acesso com um email inválido no frontend | ✔️ |
10 - Desenvolva testes que cubram no mínimo 30 por cento dos arquivo backend em /src com um mínimo de 45 linhas cobertas | ✔️ |
11 - Desenvolva o endpoint /login no backend de maneira ele não permita o acesso com uma senha inválida no frontend | ✔️ |
12 - Desenvolva o endpoint /login/validate no backend de maneira ele retorne os dados corretamente no frontend | ✔️ |
13 - Desenvolva testes que cubram no mínimo 45 por cento dos arquivo backend em /src com um mínimo de 70 linhas cobertas | ✔️ |
14 - Desenvolva em /app/backend/src/database nas pastas correspondentes, uma migration e um model para a tabela de teams | ✔️ |
15 - Desenvolva o endpoint /teams no backend de forma que ele possa retornar todos os times corretamente | ✔️ |
16 - Desenvolva o endpoint /teams/:id no backend de forma que ele possa retornar dados de um time específico | ✔️ |
17 - Desenvolva testes que cubram no mínimo 60 por cento dos arquivo backend em /src com um mínimo de 80 linhas cobertas | ✔️ |
18 - Desenvolva em /app/backend/src/database nas pastas correspondentes, uma migration e um model para a tabela de matches | ✔️ |
19 - Desenvolva o endpoint /matches de forma que os dados apareçam corretamente na tela de partidas no frontend | ✔️ |
20 - Desenvolva o endpoint /matches de forma que seja possível filtrar as partidas em andamento na tela de partidas do frontend | ✔️ |
21 - Desenvolva o endpoint /matches de forma que seja possível filtrar as partidas finalizadas na tela de partidas do frontend | ✔️ |
22 - Desenvolva testes que cubram no mínimo 80 por cento dos arquivo backend em /src com um mínimo de 100 linhas cobertas | ✔️ |
23 - Desenvolva o endpoint /matches de modo que seja possível salvar uma partida com o status de inProgress como true no banco de dados | ✔️ |
24 - Desenvolva o endpoint /matches de modo que seja possível salvar uma partida com o status de inProgress como false no banco de dados | ✔️ |
25 - Desenvolva o endpoint /matches de forma que não seja possível inserir uma partida com times iguais | ✔️ |
26 - Desenvolva o endpoint /matches de forma que não seja possível inserir uma partida com time que não existe na tabela teams | ✔️ |
27 - Desenvolva o endpoint /matches de forma que não seja possível inserir uma partida sem um token válido | ✔️ |
28 - Desenvolva o endpoint /matches de forma que seja possível atualizar partidas em andamento | ✔️ |
29 - Desenvolva o endpoint /leaderboard/home de forma que seja possível filtrar a classificações dos times quando mandantes na tela de classificação do frontend com os dados iniciais do banco de dados | ✔️ |
30 - Desenvolva o endpoint /leaderboard/home de forma que seja possível filtrar a classificações dos times quando mandantes na tela de classificação do frontend e ao inserir a partida Corinthians 2 X 1 Internacional a tabela será atualizada | ✔️ |
31 - Desenvolva o endpoint /leaderboard/away de forma que seja possível filtrar as classificações dos times quando visitantes na tela de classificação do frontend com os dados iniciais do banco de dados | ✔️ |
32 - Desenvolva o endpoint /leaderboard/away de forma que seja possível filtrar a classificações dos times quando visitantes na tela de classificação do frontend e ao inserir a partida Corinthians 2 X 1 Internacional a tabela será atualizada | ✔️ |
33 - Desenvolva o endpoint /leaderboard de forma que seja possível filtrar a classificação geral dos times na tela de classificação do frontend com os dados iniciais do banco de dados | ✔️ |
34 - Desenvolva o endpoint /leaderboard de forma que seja possível filtrar a classificação geral dos times na tela de classificação do frontend e ao inserir a partida Flamengo 3 X 0 Napoli-SC a tabela será atualizada | ✔️ |
35 - Desenvolva o endpoint /leaderboard de forma que seja possível filtrar a classificação geral dos times na tela de classificação do frontend e ao inserir a partida Minas Brasília 1 X 0 Ferroviária a tabela será atualizada | ✔️ |
💻 Instruções do Projeto
⚠️ Configurações mínimas para execução do projeto
- Sistema Operacional Distribuição Unix
- Node versão >= 16
- Docker
- Docker-compose versão >=1.29.2
- API Client (Thunder Client, Insomnia, POSTMAN, ou algum outro de sua preferência)
⚠️ Inicie o docker-compose
Após clonar o respositório para iniciar o docker compose, você deve dentro da pasta raiz do projeto usar o comando:
docker-compose up -d
Verifique os containers, usando o comandodocker ps
no terminal. Deve aparecer três containers com o nome de app-frontend-1, app_backend e db.
👨👩👧👦 Usuários
Usuário administrador:
email: admin@admin.com
password: secret_admin
Usuário cliente:
email: user@user.com
password: secret_user
🗂 Acessando as Rotas
Para acessar e testar as rotas:
- Usando algum API Cliente, conforme citado nas configurações mínimas.
- Acessando a documentação gerada pelo swagger
localhost:3001/api-docs
.- Acessando a URL do frontend desenvolvido pela trybe
localhost:3000
.
Endpoint /login
- Rota responsável autenticar usuário e gerar um token de acesso.
- Para autenticar o usuário, é necessário realizar uma requisição POST para URL:
localhost:3001/login
contendo um corpo json com:password
Senha correspondente ao usuário cadastrado.{ "email": "user@user.com", "password": "secret_user" }
200
: Retorna um json com o token para acessar rotas que precisam de autenticação.400
: Retorna um json com a mensagem indicando qual campo está pendente na requisição.401
: Retorna um json com a mensagem indicando que o usuário ou senha são inválidos.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável verificar o token de acesso.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para verificar o token, é necessário realizar uma requisição GET para URL:
localhost:3001/login/validate
.
200
: Retorna um json com a função da autenticação.401
: Retorna um json com a mensagem de acesso não autorizado, no caso de ausencia do token ou falta de validade.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
Endpoint /teams
- Rota responsável mostrar Todos times cadastrados
- Para mostrar os times, é necessário realizar uma requisição GET para URL:
localhost:3001/teams
.
200
: Retorna um json com todos times cadastrados.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável buscar detalhes de uma time por seu id.
- Para buscar o time pelo id, é necessário realizar uma requisição GET com um parametros
id
.localhost:3001/teams/1
200
: Retorna um json com os detalhes do time.400
: Retorna um json com a mensagemId must be a number
.404
: Retorna um json com a mensagemThere is no team with such id!
.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
Endpoint /matches
- Rota responsável mostrar todas partidas cadastradas com filtragem de partidas em progresso.
- Para mostrar as partidas, é necessário realizar uma requisição GET para URL:
localhost:3001/matches
. Caso deseje adicionar o filtro apresentando somente as partidas em progresso, basta adicionar um parametro inProgress true na rota:localhost:3001/matches?inProgress=true
.
200
: Retorna um json com todas partidas cadastrados ou dentro do filtro desejado.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável cadastrar novas partidas.
- É necessário adicionar ao headers o token para executar esta requisição.
- Para cadastrar a partida, é necessário realizar uma requisição POST para URL:
localhost:3001/matches
contendo um corpo json com:homeTeam
ID correspondente ao time da casa.awayTeam
ID correspondente ao time visitante.homeTeamGoals
Valor númerico de quantidade de gols do time da casa.awayTeamGoals
Valor númerico de quantidade de gols do time visitante. > ### Exemplo:{ "homeTeam": 1, "awayTeam": 2, "homeTeamGoals": 0, "awayTeamGoals": 1 }
201
: Retorna um json com os dados da partida cadastrada.400
: Retorna um json com a mensagemAll fields must be filled
.401
: Retorna um json com a mensagemMissing Token
.404
: Retorna um json com a mensagemThere is no team with such id!
.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável atualizar gols realizados nas partidas.
- Para atualizar uma partida, é necessário realizar uma requisição PATCH para URL:
localhost:3001/matches/:id
com o ID da partida no parametro e um corpo json com:homeTeamGoals
Valor númerico de quantidade de gols do time da casa.awayTeamGoals
Valor númerico de quantidade de gols do time visitante. > ### Exemplo:{ "homeTeamGoals": 0, "awayTeamGoals": 1 }
200
: Retorna um json com os dados da partida atualizados.400
: Retorna um json com a mensagemAll fields must be filled
.404
: Retorna um json com a mensagemMatch not found
.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável por encerrar progresso de partida.
- Para atualizar uma partida, é necessário realizar uma requisição PATCH para URL:
localhost:3001/matches/:id/finish
com o ID da partida no parametro.
200
: Retorna um json com uma mensagem de sucesso.400
: Retorna um json com a mensagemId must be a number
.404
: Retorna um json com a mensagemMatch not found
.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
Endpoint /leaderboard
- Rota responsável mostrar detalhes das partidas de todos times.
- Para mostrar os detalhes, é necessário realizar uma requisição GET para URL:
localhost:3001/leaderboard
.
200
: Retorna um json com detalhes de todos times.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável mostrar detalhes das partidas dos times de casa.
- Para mostrar os detalhes, é necessário realizar uma requisição GET para URL:
localhost:3001/leaderboard/home
.
200
: Retorna um json com detalhes somente dos times da casa.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.
- Rota responsável mostrar detalhes das partidas dos times de visitantes.
- Para mostrar os detalhes, é necessário realizar uma requisição GET para URL:
localhost:3001/leaderboard/away
.
200
: Retorna um json com detalhes somente dos times visitantes.500
: Retorna um json com a mensagem indicando o error que ocorreu internamente no servidor.