Esse projeto é uma API REST, onde podemos gerenciar dietas. Podendo cadastrar um usuário que poderá:
- Cadastrar suas refeições dizendo se estará ou não dentro da sua dieta;
- Recuperar uma lista com todas suas refeições;
- Recuperar apenas uma refeição;
- Editar as informações de uma refeição;
- Deletar uma refeição cadastrada;
- Obter um resumo do seu progresso que trará as seguintes informações:
- Total de refeições cadastradas;
- Total de refeições dentro da dieta;
- Total de refeições fora da dieta;
- Melhor sequência de refeições dentro da dieta;
sequenceDiagram
participant client
participant /users
participant /meals
participant database
client->>/users: (POST) body: { name, email }
/users->>database: { id, name, email }
client->>/meals: (GET) cookies: { sessionId }
/meals->>database: request meals where user_id = sessionId
database->>/meals: [{ id, user_id, name, description, is_diet, created_at }, ...]
/meals->>client: { meals: [{ id, name, description, is_diet, created_at }, ...] }
client->>/meals: (GET) param: { mealId }, cookies: { sessionId }
/meals->>database: request meals where user_id = sessionId and id = mealId
database->>/meals: { id, user_id, name, description, is_diet, created_at }
/meals->>client: { meal: { id, name, description, is_diet, created_at } }
client->>/meals: (GET) path: /summary, cookies: { sessionId }
/meals->>database: request meals where user_id = sessionId
database->>/meals: [{ id, user_id, name, description, is_diet, created_at }, ...]
/meals->>client: { totalMeals, totalDietMeals, totalCheatMeals, bestSequence }
client->>/meals: (POST) cookies: { sessionId }, body: { name, description, isDiet }
/meals->>database: { id, user_id, name, description, is_diet }
client->>/meals: (PUT) cookies: { sessionId }, body: { name, description, isDiet }, param: { mealId }
/meals->>database: update meals where user_id = sessionId and id = mealId
client->>/meals: (DELETE) cookies: { sessionId }, param: { mealId }
/meals->>database: delete meals where user_id = sessionId and id = mealId
flowchart TD
A[request to /meals] --> B{request.cookies.sessionId?};
B -- yes --> C[make request]
B -- no --> D[Status Code: 401 message: 'Unauthorized']
Para a realização desse projeto foi utilizado o microframework Fastify assim foi possível cadastrar rotas e utilizar o potencial de seus plugins. A escolha do Fastify no lugar do Express foi devido ao seu desempenho, baixa sobrecarga, suporte a async/await e ecosistema em crescente. Além do Fastify, também instalamos o @fastify/cookie pela simplicidade de trabalhar com cookies em um sistema Fastify. O zod foi a escolha para lidar com validações de dados, essa escolha se deu por ter uma ótima integração com TypeScript, deixando o trabalho mais eficiênte. Já para lidar com consultas ao banco de dados foi utilizado o query builder knexjs, dessa forma podemos deixar a sintaxe mais próxima das querys dos banco de dados, com uma simplicidade comparada a um ORM.
Para executar esse projeto será necessário ter o node e yarn instalados, de preferência para as versões apresentadas nas tags do início desse readme.
Para conseguir transitar bem entre as versões sugiro o uso do nvm
Após acessar o diretório do projeto, crie seu arquivo
.envna raiz do projeto seguindo o arquivo.env.example.
Agora você deve executar os seguintes passos no seu terminal:
# instalação dos pacotes
$ yarn
# Execução das migrations
$ yarn run knex -- migrate:latest
# execução do servidor
$ yarn devAgora você poderá testar com a utilização de uma ferramenta como por exemplo: insomnia ou postman