- 1. Prefácio
- 2. Resumo do projeto
- 3. Objetivos de aprendizagem
- 4. Considerações gerais
- 5. Critérios de aceitação do projeto
- 6. Entrega
- 7. Primeiros Passos
- 8. HTTP API Checklist
- 9. Hacker Edition
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, e 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 back-end, 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 manejar as requisições que chegam e devolver respostas a elas, 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 vamos partir de um boilerplate que já contém a estrutura básica do projeto (para criar essa estrutura, utilizamos o comando para criação de boilerplates básicos do Sequelize). Isso significa que teremos que começar lendo a implementação existente e nos familiarizando com o stack escolhido: Node.js, Express, Sequelize, PostgreSQL e outras bibliotecas auxiliares.
Recomendamos também o uso do Postman para você testar suas rotas, ele vai te ajudar a ter um "visual" das requisições e você também pode utilizá-lo para enviar dados através do header e body.
Neste projeto, você desenvolverá um servidor web que deverá servir JSON
através de uma conexão HTTP
.
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 para rotas, Sequelize para interface com o banco, PostgreSQL como banco de dados, etc).
Além disso, você vai entender como funciona o processo de desenvolvimento de uma API aplicando o modelo rest e como integrar sua API a um banco de dados relacional. Para isso, sua aplicação deverá seguir o modelo de arquitetura MVC (Model View Controller), utilizando boas práticas de desenvolvimento web.
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), variáveis de ambiente, modelos de arquitetura, entre outros.
- Instalar e usar módulos. (npm)
- Configuração de package.json.
- Configuração de npm-scripts
- Teste unitário.
- Teste assíncrono.
- Testes de integração.
- Organizar e dividir o código em módulos (Modularização)
- Uso de identificadores descritivos (Nomenclatura | Semântica)
- Uso de linter (ESLINT)
- Uso de comandos de git (add | commit | pull | status | push)
- Gerenciamento de repositorios de GitHub (clone | fork | gh-pages)
- Colaboração no Github (branches | pull requests | | tags)
- Organização no Github (projects | issues | labels | milestones)
- Rotas.
-
middlewares
- Request, Response.
- Headers.
- Body.
- Verbos HTTP.
- Códigos de status de HTTP.
- Encodings e
JSON
. - CORS.
-
JWT
- Armazenamento e acesso de senhas.
- Instalação.
- Conexão através de cliente.
- String de conexão
- Queries e comandos (criação, leitura, atualização, eliminação)
Neste projeto, está permitido o uso de bibliotecas e frameworks. O boilerplate
já tem um arquivo de configuração package.json
com todas as dependências necessárias,
mas você pode adicionar alguma que encontre em suas pesquisas e que ache útil.
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
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 ;)).
- 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
- Sequelize - documentação oficial
- Express - documentação em português - pode não estar 100% atualizada
- PostgreSQL - documentação mais recente (em inglês)
- PostgreSQL - documentação em português para a versão 8
- Exemplo de aplicação construída com NodeJS e Postgres, por Daniel Dias
- Artigo sobre MVC
- Documentação do Postman
- Vídeo sobre como utilizar o Postman (até o minuto 10)
- Outro vídeo sobre como utilizar o Postman
- Curso de modelagem de dados - recomendável assistir a partir desse até pelo menos o episódio sobre a "quinta forma normal"
Após ver os conteúdos importantes (veja esses conteúdos antes de qualquer coisa para ter uma ideia melhor do que está acontecendo), seguem alguns tutoriais que você pode fazer para praticar antes do projeto, se quiser.
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, conexões com banco, 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!
-
Tutorial super iniciante de como funcionam as rotas e sintaxe do Express, sem banco, somente com um arquivo.
-
Tutorial simples do iMasters, somente com um arquivo e sem utilizar nenhum banco de dados (esse papel é feito por um arquivo JSON). O link para o arquivo de testes está quebrado no texto, mas ele pode ser encontrado aqui. Este arquivo tem as informações necessárias para testar as requisições no Postman - explore cada requisição e veja como as informações (especialmente as do body) são passadas!
-
Tutorial mais estruturado utilizando MongoDB. Não é o mesmo tipo de banco que iremos utilizar no projeto, mas esse tutorial já traz a estrutura da aplicação mais separada, no caminho do que queremos implementar no projeto. Você vai precisar instalar o MongoDB.
-
Tutorial com Express e Sequelize estruturado de forma mais parecida com o nosso projeto. Esse tutorial utiliza o MySQL como banco, você vai precisar instalar e criar um novo banco antes de começar. Esse tutorial não está 100% perfeito (você vai encontrar alguns erros pelo caminho) mas é bastante válido para entender melhor a estrutura do nosso projeto e como o Sequelize e o Express trabalham juntos.
-
Tutorial com Express e MongoDB também estruturado de forma similar. Esse tutorial utiliza o banco MongoDB, que é um banco nosql, então não utiliza o Sequelize. Ele tem 4 partes, fazendo só a primeira parte já dá uma boa ideia.
-
Tutorial extra para desenvolvimento de API com NodeJS, Postgres, Sequelize e outras libs - em inglês
Importante: Quando utilizamos tutoriais, fazemos muito copia-e-cola de código. Ás vezes, quando exibidos na tela, alguns caracteres (especialmente aspas duplas e simples) acabam sendo convertidos para caracteres bem parecidos, mas que o código não reconhece. Se acontecer de você copiar algum código e depois que colar no editor ele estar cheio de "squiggles" (aqueles ~~~~ vermelhos), verifique se o editor não está reclamando de alguma aspa que não está sendo reconhecida. A mesma coisa quando copiamos e colamos comandos: se algum comando no terminal não for reconhecido, verifique se o duplo hífen (--) não acabou sendo substituído por um travessão (-).
-
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
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.
- Endpoint de autenticação:
POST /auth
- Middleware de autenticação
- Middleware de erros
- Outros endpoints
- Criar a documentação da API
- Testes unitários para cada função
- Testes "end to end" ou e2e (de uma ponta a outra)
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 :)
- JSON web Token
- jsonwebtoken library
- bcryptjs
- docker
- docker compose
- Docker para desenvolvedores (livro completo)
- Tutorial com Docker
-
POST /auth
) - Middleware de autenticação
- Middleware de erros
- Documentação da API
- Testes unitários
- Testes e2e
- Docker