Skip to content

Instantly share code, notes, and snippets.

@lucca65
Last active November 26, 2015 21:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucca65/4c1983e4788d0ecd6979 to your computer and use it in GitHub Desktop.
Save lucca65/4c1983e4788d0ecd6979 to your computer and use it in GitHub Desktop.
defmodule Test do
def create(conn, params) do
params
|> do_register # do business logic
|> format_response(conn) # create the message
|> render_json # just render it, simple, elegant
end
# toda funcao no elixir retorna alguma coisa, não existe `void`
defp do_register(params) do
client = RegisterClient.send(params)
nb_card = RegisterCard.send(params)
# aqui vc faz um case para ver o que o `RegisterMPCard.send/1` retorna
case RegisterMPCard.send(Map.merge(params, %{"client_id" => client.mp_id})) do
{:ok, mp_card} ->
MP.V1.Record.RemoveCard.send(%{
# Prefira sempre usar o key: value
"merchant_id" => "100", # nao é tao bom
merchant_key: "21g8u6gh6szw1gywfs165vui", # assim é!
customer_id: client.mp_id,
token: mp_card["token"] |> to_string
})
association_attribute = %CreditCardAssociation{
client_id: client.id,
nb_token: nb_card["token"] |> to_string,
mp_token: mp_card["token"] |> to_string
}
Repo.insert!(association_attribute)
{:ok, nb_card} # Isso aqui é um retorno no caso positivo
{_, result} ->
{:error, result} # Isso aqui também no caso negativo
end
end
# seu codigo nao trata tb status codes, vamos colocar isso tb
defp format_response({:ok, card}, conn), do: {card, conn, 200} # tratando quando dá certo
defp format_response({:error, error}, conn) do # tratando quando dá errado
json_error = %{
status: 0,
msg: error || "Erro ao processar seu cartão",
ts: :os.system_type(:seconds)
}
{json_error, conn, 402} # Stripe usa 402 pra transacoes negadas
end
def render_json({body, conn, status}) do
conn
|> put_status(status)
|> json(body)
end
# como vc usou um pipe, vc tá chamando essa funcao em seguida
# mas está tratando com `case`. então vou refatorar pra funcionar com pattern match
# defp render_json(response, conn) do
# case response do
# {:ok, success_response} -> json conn, success_response
# {_, error} -> json conn, %{
# "status"=> 0,
# "msg" => error || "Erro ao processar o cartão",
# "ts" => :os.system_time(:seconds)
# }
# end
# end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment