Inicializando nosso projeto.

Primeiro, rodaremos o seguinte comando para gerarmos um novo projeto Phoenix sem HTML, visto que nosso projeto não deverá renderizar conteúdos estáticos.

mix phx.new busi_api --no-html
cd busi_api

Configurando nossa conexão ao banco de dados

config: busi_api, BusiApi.Repo,
    adapter: Ecto.Adapters.Postgres,
    username: "postgres",
    password: "postgres",
    database: "busi_api_dev",
    hostname: "localhost",
    pool_size: 10


Aqui, configuramos o username, password e hostname com os nomes padrões do Postgres. Voltando ao terminal, vamos rodar os seguintes comandos para criar nossa DB e iniciar o servidor.

mix ecto.create
mix phx.server


Veremos o erro no route found for GET / (BusiApiWeb.Router), isso é porque ainda não temos nenhuma rota configurada. No nosso router.ex, vamos adicionar a seguinte parte de código, e depois criar o DefaultController

#/lib/busi_api_web/router.ex

scope "/" do
      pipe_through [:fetch_session, :protect_from_forgery]
      live_dashboard "/dashboard", metrics: BusiApiWeb.Telemetry
    end

#/lib/busi_api_web/controllers/default_controller.ex:

defmodule BusiApiWeb.DefaultController do
    use BusiApiWeb, :controller

    def index(conn, _params) do
        text conn, "BusiApi!"
    end

end


Ao recarregarmos a página, deveremos ver o texto "BusiApi!" na tela.

Criando nossa primeira API JSON

Para criarmos nosso model da API JSON, rodaremos o seguinte comando:

mix phx.gen.json Directory Business businesses name:string description:text tag:string


Esse comando criará uma série de arquivos, incluindo um controller, as migrations e os arguivos de teste. Após rodarmos esse comando, o Phoenix pedirá para adicionarmos o resource na nossa lib/busi_api_web/router.ex e rodaremos o comando mix ecto.migrate

scope "/api", BusiApiWeb do
    pipe_through :api
    resources "/businesses", BusinessController, except: [:new, :edit]
end


Antes de testarmos nossa API, vamos adicionar alguns valores iniciais. Abra priv/repo/seeds.exs e adicione os seguintes valores:

alias BusiApi.Repo
alias BusiApi.Directory.Business

Repo.insert! %Business{name: "Company 1", description: "short description...", tag: "IT, software"}

Repo.insert! %Business{name: "Company 2", description: "Short description...", tag: "Marketing"}

Repo.insert! %Business{name: "Company 3", description: "Short description...", tag: "Accounting"}


Agora rodamos o comando mix run priv/repo/seeds.exs para adicionarmos os valores à tabela. Restarte o server para vermos os registros JSON. Nós também podemos testar nossa API com o postman fazendo uma requisição do tipo POST para a url: http://localhost:4000/api/businesses

{
    business: 
        {
            name: Yet another company, 
            description: Another short description!, 
            tag: IT
        }
}


Vamos começar com nosso BusinessController, nesse caso list_businesses() retorna todos os registros.

def list_businesses do
    Repo.all(Business)
end



Na segunda parte, criaremos um sistema de autenticação com Guardian and Comeonin.