Criando API — CRUD com Clojure

Gilmar Soares
Training Center
4 min readJan 27, 2018

--

Opa… A algum tempo eu não faço nenhum artigo relacionado a Clojure, ou relacionado a qualquer outro assunto rs…
Nesse artigo vou mostrar um exemplo bem simples de um CRUD, sei que CRUD é algo super batido, pois os frameworks hoje fazem mágica e quase não escrevemos mais código, mas la vamos nós!!!

Estou assumindo que vocês tem um MySQL rodando na sua máquina, ou mesmo em um container Docker.

Agora é hora de criar o projeto, e como já expliquei em alguns arquivos vamos utilizar o comando leiningen para criar o projeto.

Quem ainda não instalou, essa é a hora, o link do leiningen é: https://leiningen.org

➜ ~ lein new compojure todo

Feito isso, vamos entrar no diretório do projeto para ver o que temos:

✗ cd todo/

O que o leiningen criou para nós foi essa estrutura de projeto que já conhecemos:

➜ todo git:(master) ✗ ls -l
total 32
-rw-r — r — 1 gilmar staff 262 Jan 27 10:16 README.md
-rw-r — r — 1 gilmar staff 636 Jan 27 10:20 project.clj
drwxr-xr-x 3 gilmar staff 96 Jan 25 15:20 resources
drwxr-xr-x 3 gilmar staff 96 Jan 27 10:15 src
drwxr-xr-x 4 gilmar staff 128 Jan 25 15:20 target
drwxr-xr-x 3 gilmar staff 96 Jan 27 10:16 test
-rw-r — r — 1 gilmar staff 4788 Jan 27 10:18 todo.iml
➜ todo git:(master) ✗

Bom, primeiro de tudo vamos adicionar as dependencias do nosso projeto, e para isso, deixe o seu arquito project.clj como o arquivo abaixo:

Vou explicar de forma simples a lib korma que não tinha mostrado anteriormente. Korma é uma lib que vai facilitar nossas queries no MySQL. Um simples exemplo:

user=> (select items)

Esse select é da lib korma e vai facilitar nossa vida com todas as operações de Banco de Dados, não necessáriamente MySQL, podemos trabalhar com todos esses bancos de dados:

Bom, vamos seguir com a criação do CRUD. Precisamos de uma base de dados no MySQL, estou assumindo que vocês já tem MySQL instalado na sua maquina como falei anteriormente, vamos apenas criar um DATABASE e uma TABELA bem simples. Abaixo comandos:

Ok. Já fizemos muito código SQL, é hora de voltar ao Clojure. Dentro de src/todo vamos criar um arquivo chamado database.clj.

Basicamente nesse arquivo database.clj temos a configuração de Banco de Dados. Podemos pegar esses dados de DB de N lugares, arquivos de configuração, variável de ambiente.

Bom, é hora de fazer as queries para inserir, fazer select, update ou delete da tabela items que criamos anteriormente, portanto vamos criar um arquivo query.clj.

Bom, agora ficou simples, as queries são fáceis de entender. É praticamente a mesma coisa que SQL, claro adicionando nossos ().

Agora vamos editar o arquivo handler.clj que o leiningen criou no inicio do projeto, e vamos enfim adicionar nossos endpoints para criar nossa API.

O arquivo handler.clj vai ficar assim:

Em resumo, temos nossas rotas da API, seus verbos configurados com GET, PUT, POST e DELETE, e estamos executando nossas queries criadas anteriormente.

Bom, agora é hora de executar essa aplicação e ver o resultado. Execute:

lein ring server

Após executar sua API estará disponível na porta 3001.

➜ todo git:(master) ✗ lein ring server

WARNING: update already refers to: #’clojure.core/update in namespace: korma.core, being replaced by: #’korma.core/update

WARNING: update already refers to: #’clojure.core/update in namespace: todo.query, being replaced by: #’korma.core/update

2018–01–27 11:28:21.985:INFO:oejs.Server:jetty-7.6.13.v20130916

2018–01–27 11:28:22.042:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000

Started server on port 3000

Vamos criar uns items usando nossa API e o verbo POST.

Eu estou utilizando a aplicação insomnia para executar as ações no endpoint que criamos, então um POST na nossa aplicação vai fizer assim:

Agora vamos fazer um GET e ver o resultado, eu já tenho vários items na base de dados:

Bom, se precisarem de ajuda, ou mesmo tiver dificuldades para criar a aplicação, o link do github do projeto é: https://github.com/linuxsoares/artigos-clojure/tree/master/todo

Ou podem falar diretamente comigo que ajudo no que precisarem.

Por hora é isso, abaixo segue link dos outros artigos plublicados no medium.

--

--