Last active
November 26, 2015 21:43
-
-
Save lucca65/4c1983e4788d0ecd6979 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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