Nesse post vou falar um pouco sobre um dos projetos open source que contribuo, o pREST.
O pREST cria uma api REST expondo as tabelas de um banco postgres de forma rápida, fácil e com uma boa performance.
Embora essa prática pareça um pouco estranha e insegura, para alguns casos ela serve muito bem. Um exemplo seria um serviço interno para sua intranet ou como um micro serviço de CRUD.
Só para deixar bem claro, quando digo que parece insegura, não é que o pREST não trate questões como SQL Injection, mas sim o fato de expor todo um banco e suas tabelas de forma nua e crua.
Continuando… A primeira coisa que precisamos fazer é instalar o pREST.
Como temos o Go instalado em nossa máquina, a forma mais fácil de fazer é usando o go install.
go install github.com/prest/prest/cmd/prestd@latest
Após instalar, se você executar um prest --help
deverá aparecer algo parecido com isso:
Serve a RESTful API from any PostgreSQL database, start HTTP server
Usage:
prest [flags]
prest [command]
Available Commands:
help Help about any command
migrate Execute migration operations
version Print the version number of pREST
Flags:
-h, --help help for prest
Use "prest [command] --help" for more information about a command.
Isso significa que a instalação foi 100%. Agora precisamos criar um arquivo onde vamos colocar todas as configurações do pREST. Esse arquivo deve se chamar prest.toml.
[http]
port = 8080
[auth]
enabled = true
type = "body"
encrypt = "MD5"
table = "prest_users"
username = "email"
password = "senha"
[pg]
host = "127.0.0.1"
user = "postgres"
pass = "1234"
port = 5432
database = "prest"
single = true
Agora tudo o que precisamos fazer para levantar nossa API é executar o comando prest
dentro da mesma pasta onde criamos o arquivo prest.toml.
Com a API rodando, vamos nos autenticar para pegar o token JWT. Como configuramos o type do auth como body, vamos fazer a seguinte requisição:
curl -i -X POST http://127.0.0.1:8080/auth -H "Content-Type: application/json" -d '{"username": "tiago@aprendagolang.com.br", "password": "bananasebatatas"}'
Com o token em mãos, podemos executar consultas, inserir novos registros, atualizar e excluir registros existentes.
Exceto o /auth, todos os outros endpoints seguem o padrão /{DATABASE}/{SCHEMA}/{TABLE}.
Para POST, PUT e PATCH, o payload da requisição deve ser em formato JSON, onde cada campo da tabela é um atributo do payload. Exemplo:
{
"nome": "Tiago Temporin",
"idade": 31,
"sexo": "M",
"estado_civil": "CASADO"
}
Para não atualizar toda a tabela com os mesmos valores ou limpar a tabela toda, nas requisições do tipo PUT, PATCH e DELETE, você pode passar na URL qual é o campo utilizado como filtro.
/{DATABASE}/{SCHEMA}/{TABLE}?{FIELD NAME}={VALUE}
Em requisições do tipo GET, para ampliar ainda mais as possibilidades de filtro, o pREST fornece alguns operadores como $eq, $ne, $gt… que são enviados na URL para que a filtragem seja mais precisa.
GET /DATABASE/SCHEMA/TABLE?FIELD=$eq.VALUE
GET /DATABASE/SCHEMA/TABLE?FIELD=$ne.VALUE
GET /DATABASE/SCHEMA/TABLE?FIELD_A=$eq.VALUE&FIELD_B=$true
Se você ficou curioso e quer saber mais sobre o pREST, é só clicar aqui e acessar a documentação.
Deixem suas dúvidas nos comentários.
Até a próxima!
Subscreva
Fique por dentro de tudo o que acontece no mundo Go