API for serving a front-end web application of a fictitious restaurant. This document is first written in English and then in Portuguese.
This is the last training task in the Rocketseat Explorer program, which is about creating an API using Node.js to serve a front-end web application of a fictional restaurant, whose construction is also part of this task and whose repository is also hosted on GitHub.
The project consists of several REST endpoints to be accessed by the front-end application so that it can retrieve, store, and modify data in a relational database (SQLite3) supported by the Knex query builder.
This project contains the following dependencies:
bcryptjs
, compatible with version 2.4.3: used to encrypt passwords before registering them in the database;cors
, compatible with version 2.8.5: used to provide middleware that allows the front-end application to connect to this server;csv-parse
, compatible with version 5.3.4: used to read csv files for iterative creation of category entries in the relational database;express
, compatible with version 4.18.2: Web framework for Node.js;express-async-errors
, compatible with version 3.1.1: used to provide message passing errors from the server to the client in a customized way;jsonwebtoken
, compatible with version 9.0.0: used to create JWT tokens in JSON format;knex
, compatible with version 2.4.2: used for creating queries and communicating with relational database in SQLite3;multer
, compatible with version 1.4.5-lts.1: is a middleware that allows uploading images to the server;pm2
, compatible with version 5.2.2: used for server management in production;sqlite3
, compatible with version 5.1.4: used for creating SQLite3 relational database.
This project was provided by Render and you can access it at this link, although all you see is an HTTP request error. More interestingly, you make requests to the server (whether it's on the Internet or running on your local machine after you clone this project) via applications like Insomnia.
The src
folder contains the index.ts
file whose job is to start the server on the specified port.
the configs
folder contains the upload settings as well as the settings for authentication via JWT tokens;
utils
contains files with functions that may be accessed from many parts of the application to avoid code repetition;
middlewares
contains the ensureAuthenticated hook, which is used to ensure that the client is authenticated before accessing certain routes;
providers
contains a file that points to a class for saving and deleting files in the tmp/uploads
folder, which is intended for storing dish images;
routes
contains the application's routes, which have the task of instantiating and calling the appropriate controllers depending on the route accessed;
controllers
contains the controllers used to interact with the database, depending on which route the client is accessing. The controllers created in this project are:
Users
- has three methods related to creating, updating and displaying user data;Sessions
- has the function of creating a session for the client and verifying that it has credentials to access the non-public application routes;Categories
- has two methods: one for automatically creating category entries listed in a given csv file, and another for indexing all existing categories;Ingredients
- has only one method to index all ingredients of a given dish, using its ID as a search parameter;Dishes
- has methods for creating, updating, indexing and deleting dishes, as well as displaying the information about a given dish using its ID as a parameter;
database
contains two subfolders, in addition to the database file itself, in SQLite:
files
contains only a csv file for the automatic creation of all the categories that the client lists when accessing a particular route for this purpose;knex
contains the migration files for indirect creation of database tables.
Below is the structure of the existing tables:
users
, with the following fields: id, of type number, admin, of type boolean, name, of type string, email, of type string, password, of type string, created_at, of type string, and updated_at, of type string. admin users are allowed to create, view, edit and delete dishes. During registration, the new user is added as a non-admin - to change this status, you must change this directly in the database via brute-force (if you have your own clone of this project on your local machine, of course).categories
, with the following fields: id, of type number, category, of type string, created_at, of type string and updated_at, of type string.dishes
, with the following fields: id, of type number, category_id, of type number, which is a foreign key that references entries in thecategories
table, dish, of type string, description, of type string, image, of type string, reals and cents, of type number, created_at, of type string and updated_at, of type string.ingredients
, with the following fields: id, of type number, dish_id, of type number, which is a foreign key that references entries in thedishes
table, ingredient, of type string, created_at, of type string, and updated_at, of type string.
Assuming you have both git
and npm
installed on your machine, you must follow these simple steps. First, go to the directory you are interested in and clone this repository:
git clone https://github.com/victorsgb/food-explorer-backend
Then change to the newly created folder containing your new local repository:
cd food-explorer-backend
Install the project's dependencies (assuming you have the npm
package installed on your machine):
npm install
And that's it! You can now run the project in a developer environment. The server is started on port 3334 after you run the following command:
npm run dev
If you want to run the project in a production environment, simply type the following:
npm run start
The server is expected to be running normally on the specified port and ready to receive requests from the web client, namely the FoodExplorer Frontend.
Este é a tarefa final do treinamento no programa Explorer, da Rocketseat, que se trata da criação de uma API usando Node.js para servir uma aplicação front-end web de um restaurante fictício, cuja construção também fez parte desta tarefa e cujo repositório também se encontra hospedado no GitHub.
O projeto consiste de várias REST endpoints para serem acessadas pela aplicação web para que esta posa recuperar, armazenar ou modificar dados armazenados num banco de dados relacional (SQLite3) criado com uso da Query Builder Knex.
Este projeto contém as seguintes dependências:
bcryptjs
, compatível com a versão 2.4.3: usado para criptografia de senhas antes do registro no banco de dados;cors
, compatível com a versão 2.8.5: usado para prover um middleware que possibilita a conexão da aplicação front-end com este servidor;csv-parse
, compatível com a versão 5.3.4: usado para leitura de arquivos csv, para criação iterativa de entradas de categorias no banco de dados relacional;express
, compatível com a versão 4.18.2: framework web para o Node.js;express-async-errors
, compatível com a versão 3.1.1: usado prover o envio das mensagens de erro do servidor para o cliente de maneira customizada;jsonwebtoken
, compatível com a versão 9.0.0: usado para a criação de tokens JWT em formato JSON;knex
, compatível com a versão 2.4.2: usado para construção de queries e comunicação com o banco de dados relacional em SQLite3;multer
, compatível com a versão 1.4.5-lts.1: que é um middleware usado para prover o upload de imagens no servidor;pm2
, compatível com a versão 5.2.2: usado para gestão do servidor em produção;sqlite3
, compatível com a versão 5.1.4: usado para criação do banco de dados relacional SQLite3.
O deploy deste projeto foi realizado pela Render e você pode acessá-lo neste link, embora tudo o que veja seja um erro de requisição HTTP. É mais interessante que você faça pedidos de requisição ao servidor (seja este rondando na web, ou rodando na sua máquina local, após clonar este projeto) por meio de aplicações tal qual o Insomnia.
A pasta src
contém o arquivo index.ts
, cuja função é inicializar o servidor na porta especificada.
configs
contém as configurações de autenticação via Token JWT, além das configurações de upload;
utils
contém arquivos úteis, com funções que serão potencialmente acessadas de várias da aplicação, para evitar repetição de código;
middlewares
contém a hook ensureAuthenticated, que serve para garantir que o cliente esteja autenticado, antes que determinadas rotas sejam acessadas;
providers
contém arquivo referenciando uma classe para armazenamento e exclusão de arquivos na pasta tmp/uploads
, destinada para armazenar as imagens dos pratos;
routes
contém as rotas da aplicação, que têm o dever de instanciar e chamar os controladores adequados a depender da rota acessada;
controllers
contém os controladores usados para interagir com o banco de dados, a depender da rota acessada pelo cliente. Os controladores criados neste projeto são:
Users
- tem três métodos, relacionados com a criação, atualização e exibição de alguns dados de usuários, respectivamente;Sessions
- tem a função de criar uma sessão para o cliente, verificando se tal tem credencial para acessar as rotas da aplicação que não são públicas;Categories
- tem dois métodos: um para criação automática das entradas de categorias listadas em determinado arquivo csv, e outro para indexar todas as categorias existentes;Ingredients
- tem apenas um método para indexar todos os ingredientes de um determinado prato, tomando o id deste como parâmetro de busca;Dishes
- tem métodos para criação, atualização, indexação, deleção de pratos, bem como para visualização das informações de determinado prato, tomando como parâmetro o seu id;
database
contém duas sub-pastas, além do arquivo do banco de dados em si, em SQLite:
files
, que contém apenas um arquivo csv para criação automática de todas as categorias listadas pelo cliente, ao acessar determinada rota para este fim;knex
, que contém os arquivos de migrations, para criação das tables do banco de dados de forma indireta.
Segue abaixo a estrutura das tables existentes:
users
, com os seguintes campos: id, do tipo number, admin, do tipo boolean, name, do tipo string, email, do tipo string, password, do tipo string, created_at, do tipo string e updated_at, do tipo string. Usuários admin têm permissão para criar, visualizar, editar e deletar pratos. Ao se cadastrar, o novo usuário é inserido como não admin - para mudar tal status, é necessário fazer a modificação via brute-force no banco de dados.categories
, com os seguintes campos: id, do tipo number, category, do tipo string, created_at, do tipo string e updated_at, do tipo string.dishes
, com os seguintes campos: id, do tipo number, category_id, do tipo number, que é uma chave estrangeira referenciando entradas na tablecategories
, dish, do tipo string, description, do tipo string, image, do tipo string, reais e cents, do tipo number, created_at, do tipo string e updated_at, do tipo string.ingredients
, com os seguintes campos: id, do tipo number, dish_id, do tipo number, que é uma chave estrangeira referenciando entradas na tabledishes
, ingredient, do tipo string, created_at, do tipo string e updated_at, do tipo string.
Supondo que você já tenha git
e npm
instalados na sua máquina, você deve seguir estes passos simples. Primeiro, vá ao diretório de seu interesse e clone este repositório:
git clone https://github.com/victorsgb/food-explorer-backend
Então, vá para a pasta recém-criada contendo o seu novo repositório local:
cd food-explorer-backend
Instale as dependências do projeto (assumindo que você tenha o pacote npm
instalado na sua máquina):
npm install
E pronto! Você já pode rodar o projeto em ambiente de desenvolvedor. O servidor será inicializado na porta 3334, após você rodar o seguinte comando:
npm run dev
Caso queira rodar o projeto em ambiente de produção, basta digitar o comando a seguir:
npm run start
E é isso! Espera-se que o servidor esteja rodando normalmente, na porta especificada, pronto para receber solicitações do cliente web, a saber, o FoodExplorer Frontend.