Configurações necessárias

Você precisará instalar o banco de dados Postgress. Pode ser via terminal ou via docker. O importante é termos ele. Existem diversos tutoriais na internet sobre, então não vou repetir aqui.

Depois disso, precisamos configurar ele em nossa aplicação, e para isso utilizarei um wrapper de banco de dados. O famoso Ecto.

Mas antes disso, precisamos atualizar nosso app para ter suporte a árvore de supervisão.

Suporte árvore de supervisão

Ecto trabalha como um wrapper de banco de dados. Isso quer dizer que podemos fazer queries com ele utilizando uma linguagem mais clara. Um detalhes importante, o Ecto deve ser rodado como um supervisor. Isso quer dizer, nossa aplicação deve ter suporte a uma árvore de supervisão. Talvez você esteja acostumado com essa nomenclatura, infelizmente não tenho espaço no livro para falar sobre isso aqui. Deixei um link para você se aprofundar no estudo. Nós aqui, seguiremos no projeto.

Nossa aplicação não possui uma árvore de supervisão. O primeiro passo de configuração é transformar ela em uma. Caso queira pular essa etapa, você pode criar um novo projeto ja adicionando a flag para ser uma aplicação com a árvore.

mix new [nome-do-projeto] --sup

Utilizando a flag --sup o novo projeto automaticamente terá suporte. Mas eu farei a mudança na mão. Caso tenha usado a flag, você pode pular para a seção Adicionando Ecto ao projeto.

Adicionando árvore de supervisão

Vamos começar criando um módulo novo. Por convenção chamarei de Application:

lib/coffee_shop/application.ex
defmodule CoffeeShop.Application do
  use Application

  def start(_type, _args) do
    children = []
    opts = [strategy: :one_for_one, name: CoffeeShop.Supervisor]

    Supervisor.start_link(children, opts)
  end
end

Na linha 8 iniciamos o supervisor de nossa aplicação e passamos outros supervisores filhos. Adicionaremos depois o Ecto nesse pedaço.

Agora precisamos adicionar o supevisor de nossa aplicação ao nosso projeto. Vamos até o mix.exs e adicionar uma nova opção mod na função application/0 passando o módulo Application que criamos.

mix.exs
defmodule CoffeeShop.MixProject do
  use Mix.Project

  # ...
  
  def application do
    [
      extra_applications: [:logger],
      mod: {CoffeeShop.Application, []}
    ]
  end

  # ...
end

Como segundo item da tupla adicionaremos uma lista vazia. Esse valor sçao argumentos que podemos passar para dentro do processo. Não temos necessidade de fazer isso, então, continuará vazio.

Pronto, nosso projeto agora tem suporte a árvore de supervisão. Podemos seguir.

Atualizado