- 1. Prefácio
- 2. Resumo do projeto
- 3. Objetivos de aprendizagem
- 4. Considerações gerais
- 5. Critérios de aceitação mínimos do projeto
- 6. Hacker Edition
- 7. Pistas, tips e leituras complementares
- 8. HTTP API Checklist
Um pequeno restaurante de hamburgueres, que está crescendo, necessita de um sistema para realizar pedidos usando um tablet, e que os enviem à cozinha para que sejam preparados de forma ordenada e eficiente.
A interface front-end da aplicação Burger Queen já foi criado. Agora precisamos criar o back-end para manejar os dados. Neste caso, isso será feito através de uma API rest que será compatível com as requisições vindas do front.
Como API, nesse caso nos referimos a um servidor web, que é basicamente um programa que ouve o que acontece na aplicação através de uma porta de rede, pela qual podemos enviar requisições (requests) e obter respostas (responses).
Um servidor web deve lidar com as requisições que chegam e devolver respostas, que serão enviadas de volta ao cliente. Quando falamos de aplicações de servidor, isso implica uma arquitetura de cliente/servidor, onde o cliente é um programa que faz requisições através de uma rede (por exemplo o navegador, o cURL, etc) e o servidor é o programa que recebe essas requisições e as responde.
O Node.js nos permite criar servidores web super eficientes de maneira relativamente simples, tudo isso usando JavaScript!
Neste projeto partimos de um boilerplate que já contém uma série de endpoints (pontos de conexão ou URLs) e nos pedem para completar a aplicação. Isto implica que teremos que começar a ler a implementação existente, e familiarizar-nos com a stack escolhida (Node.js, Express), Sequelize, e PostgreSQL.
O cliente nos deu um link para a documentação que especifica o comportamento esperado da API que iremos expor por HTTP. Lá podemos encontrar todos os detalhes que os endpoints deve implementar na aplicação, que parâmetros esperam, o que devem responder, etc.
O objetivo de aprendizagem principal é adquirir experiência com o Node.js como ferramenta para desenvolvimento de aplicações de servidor, junto com uma série de outras ferramentas comumente utilizadas nesse contexto (Express como framework, PostgreSQL como base de dados, containers de docker (Hacker Edition), etc).
Neste projeto, você desenvolverá um servidor web que deverá servir JSON
através de uma conexão HTTP
, e implantá-lo em um servidor na nuvem.
Ao final do projeto, você deverá estar familiarizada com conceitos como rotas
(routes), URLs, HTTP (verbos, request, response, headers, body, status
codes, etc), JSON, conexão com uma base de dados (PostgreSQL
), deployment...
-
Instalar e usar módulos (npm)
-
Configuração do package.json
-
Configuração do npm-scripts
-
Testes unitários (Hacker Edition)
-
Testes assíncronos (Hacker Edition)
-
Mocking (Hacker Edition)
-
Testes de integração (end-to-end) (Hacker Edition)
-
Uso ES modules
-
Módulos de CommonJS
-
Uso de linter (ESLINT)
-
Uso de identificadores descritivos (Nomenclatura | Semântica)
-
Git: Instalação e configuração
-
Git: Controle de versão com git (init, clone, add, commit, status, push, pull, remote)
-
Git: Integração de mudanças entre ramos (branch, checkout, fetch, merge, reset, rebase, tag)
-
GitHub: Criação de contas e repositórios, configuração de chave SSH
-
GitHub: Implantação com GitHub Pages
-
GitHub: Colaboração pelo Github (branches | forks | pull requests | code review | tags)
-
GitHub: Organização pelo Github (projects | issues | labels | milestones | releases)
-
Rotas
-
Uso e criação de middleware (Hacker Edition)
-
Solicitações ou requisições (request) e respostas (response).
-
Cabeçalhos (headers)
-
Corpo (body)
-
Verbos HTTP
-
Codigos de status de HTTP
-
Encodings e JSON
-
CORS (Cross-Origin Resource Sharing)
-
JWT (JSON Web Token)
-
Armazenamento e acesso de senhas
-
Instalação
-
Conexão
-
Queries e comandos (criação, leitura, atualização, eliminação)
Este projeto poderá ser realizado individualmente ou em duplas. Posteriormente, poderá estar integrado com o projeto Burger Queen API client já realizado.
A lógica do projeto deve estar implementada totalmente em JavaScript (ES6). Neste projeto está permitido usar bibliotecas ou frameworks.
Conforme estabelecido pela documentação entregue pelo nosso cliente, a API deve expor os seguintes endpoints:
GET /users
GET /users/:uid
POST /users
PUT /users/:uid
DELETE /users/:uid
GET /products
GET /products/:productid
POST /products
PUT /products/:productid
DELETE /products/:productid
GET /orders
GET /orders/:orderId
POST /orders
PUT /orders/:orderId
DELETE /orders/:orderId
POST /auth
O código do projeto deverá estar em um repositório no GitHub. O deploy para produção deverá ser feito utilizando um serviço de hospedagem como o Heroku, que tem integração com o PostgreSQL
Cuidado para não subir as chaves de autenticação para o GitHub do projeto ;).
As seções chamadas Hacker Edition são opcionais. Se você terminou tudo e ainda sobrou tempo, faça essa parte. Assim você poderá aprofundar e exercitar mais sobre os objetivos de aprendizagem do projeto.
- Criptografar senha do usuário
- Endpoint de autenticação:
POST /auth
- Middleware de autenticação - verificação do token
- Middleware de erros
- Criar a documentação da API
- Testes unitários para cada função
- Testes "end to end" ou e2e (de uma ponta a outra)
- Docker
É uma boa prática NÃO armazenar a senha do seu usuário no seu banco de dados, pois
colocaria a segurança de seu usuário em risco. Assim, ao invés de armazená-la como
um simples string, a ideia é armazenar uma hash
criptografada. Por exemplo,
pode-se usar o bcryptjs.
Assim, na autenticação (POST /auth
), se a senha do usuário está certa ou não, poderá ser feita
comparando essa hash
.
Sugerimos o uso do Swagger ou JSDoc para escrever a sua própria documentação
Se quiser, também poderá se aventurar no Docker e dar os primeiros passos com containers.
Um container (que pode ser criado com Docker) serve para garantir que os ambientes de desenvolvimento e produção sejam exatamente os mesmos, não importa em que sistemas operacional/versão funciona o computador da desenvolvedora. Terminando com o famoso (e temido) "na minha máquina funciona".
O Docker cria uma container de um sistema operacional onde podemos definir configurações e versões de softwares, e é dentro de um desses containers que podemos testar e executar nossos projetos independente do sistema operacional que rodamos em nossa máquina física :)
Para este projeto te recomendamos a usar docker-compose
localmente (em seu
computador) para executar a aplicação junto com a base de dados.
- Faça o fork e
git clone
do projeto; - Instale o projeto localmente com
npm install
; - Rode o comando
npm start
para subir o boilerplate do projeto na porta 3000.
Aqui o seu servidor já está funcionando! Teste e explore o código para entender o exemplo que já vem no boilerplate! E lembre-se, nesse projeto não há interface, e estaremos utilizando o console e ferramentas como o Postman para visualizar nosso projeto.
Até o momento, ainda não temos um banco de dados. Nosso banco de dados estará no Heroku, então precisaremos configurar e conectá-lo ao nosso projeto.
- Como funciona uma requisição HTTP, header e body para relembrarmos, pois vai ser super importante
- Outro artigo sobre requisição HTTP, header e body
- Artigo sobre MVC com exemplo
- O que é CORS
- CORS
Seguem alguns tutoriais que você pode fazer para praticar, para ganhar uma maior familiaridade com algumas das ferramentas utilizadas... mas não se prenda a eles. Existem diversas formas de fazer, entenda o uso das ferramentas e os tutoriais podem de dar uma base de prática.
Muito importante: Os tutoriais são bons para praticar, mas nenhum deles vai ser exatamente igual ao seu projeto, nem na estrutura, nem no código, nem no banco utilizado. O objetivo é que você pratique algumas partes principais do que sua aplicação deve fazer (requisições do tipo get, post, etc, rotas com Express e por aí vai) e procure aplicar o que aprendeu em seu projeto. Além disso eles podem ter bugs ou desatualizações. Caso aconteça, aproveite para praticar suas habilidades de debug!
- Express
- Sequelize
- PostgreSQL
- PostgreSQL - documentação em português para a versão 8
- Postman
- Documentação do Postman
- JSON web Token
- jsonwebtoken library
- bcryptjs
- JSDoc
- Swagger
- docker
- docker compose
- Docker para desenvolvedores (livro completo)
- Tutorial com Docker
- Exemplo com Docker
-
GET /users
-
GET /users/:uid
-
POST /users
-
PUT /users/:uid
-
DELETE /users/:uid
-
GET /products
-
GET /products/:productid
-
POST /products
-
PUT /products/:productid
-
DELETE /products/:productid
-
GET /orders
-
GET /orders/:orderid
-
POST /orders
-
PUT /orders/:orderid
-
DELETE /orders/:orderid
- Criptografar senha do usuário
-
POST /auth
- Middleware de autenticação
- Middleware de erros
- Documentação da API
- Testes unitários
- Testes e2e
- Docker