Criando uma API REST em minutos com pREST

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

Deixe uma resposta