O front-end da aplicação Burger Queen já está criado, agora precisamos de um 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.
Você vai perceber que, entre os arquivos, incluímos um docker-compose.yml
. Isso significa que, neste projeto, vamos utilizar os serviços de "containerização" do Docker. Resumindo: Um serviço de container, como Docker ou Kubernetes, serve para, principalmente, 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. O Docker cria uma máquina virtual onde podemos definir sistema operacional e versões de softwares, entre outras coisas, e é dentro de uma dessas máquinas que vamos testar e executar nossos projetos :)
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.
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.
Você deverá escrever os teste unitários para sua aplicação, e testá-la com Jest.
A aplicação deve subir através do comando docker compose up <ambiente>
(dev, prod ou test), dentro da pasta do projeto.
Além disso, a aplicação poderá receber informações de configuração, como porta, banco de dados, etc, através de variáveis de ambiente.
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 ;)).
- Instalar o Docker localmente. Na seção de links e leituras você encontrará um manual de Docker com instruções de instalação para os sistemas operacionais mais conhecidos;
- Faça o fork e
git clone
do projeto; - Instale o projeto localmente com
npm install
; - Rode o comando
docker-compose up dev
para subir o boilerplate do projeto na porta 3000. O banco de dados estará conectado na porta 5432. - Preparamos um material para você usar como modelo/exemplo desse projeto, com bastante explicação e exemplos de código. Vai te ajudar a dar os primeiros passos para que depois você consiga seguir em frente.
- 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
- Docker para desenvolvedores (livro completo)
- 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 (é importante ver 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 /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
-
GET /tables
-
GET /tables/:tableid
-
POST /tables
-
PUT /tables/:tableid
-
DELETE /tables/:tableid
- Testes unitários para cada função utilizada externamente pela aplicação
Para a hacker edition, você poderá criar alguns endpoints extras (pode definir os nomes), implementar a autenticação e escrever um novo tipo de teste, os testes "end to end" (de uma ponta a outra), ou e2e.
- Endpoint de histórico de pedidos
- Endpoint de criação de usuário
- Endpoint de alteração de usuário
- Endpoint de exclusão de usuário
- Autenticação com JSON Web Token (JWT)
- Acrescentar níveis de permissão de usuário
- Testes e2e