Good Morning,
Could help me improve the code and apply a “transaction”, if one goes wrong …
I have never worked with “transaction”, so I don’t know how to apply it in this scenario.
Below is my controller
def create(conn, %{"client" => client_params}) do
url = "https://test.test.com.br/v2/customers/"
headers = %{"Content-Type" => "application/json", "Authorization" => "Basic sadad=="}
hackney = [basic_auth: {"AUTHAPI", "AUTHAPI"}]
client_params_strong = for {key, val} <- client_params, into: %{}, do: {String.to_atom(key), val}
body = Poison.encode!(
%{
ownId: Coherence.current_user(conn).id |> to_string(),
fullname: client_params_strong.fullname,
email: Coherence.current_user(conn).email |> to_string(),
birthDate: client_params_strong.birthdate,
taxDocument: %{
type: client_params_strong.type_taxdocument,
number: client_params_strong.number_taxdocument
},
phone: %{
countryCode: client_params_strong.countrycode_phone,
areaCode: client_params_strong.areacode_phone,
number: client_params_strong.number_phone
},
shippingAddress: %{
city: client_params_strong.city_shippingaddress,
district: client_params_strong.district_shippingaddress,
street: client_params_strong.street_shippingaddress,
streetNumber: client_params_strong.streetnumber_shippingaddress,
zipCode: client_params_strong.zipcode_shippingaddress,
state: client_params_strong.state_shippingaddress,
country: client_params_strong.country_shippingaddress
}
}
)
changeset = Coherence.current_user(conn)
|> Ecto.build_assoc(:client)
|> Client.changeset(client_params)
#case Structure.create_client(client_params) do
case Repo.insert(changeset) do
{:ok, client} ->
conn
|> put_flash(:info, "Cliente criado com successo!")
|> redirect(to: Routes.client_path(conn, :show, client))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
case HTTPoison.post(url, body, headers, [hackney: hackney]) do
{:ok, %HTTPoison.Response{status_code: 400}} ->
conn
|> put_flash(:info, "Error 400 Bad Request")
|> redirect(to: Routes.client_path(conn, :new))
{:error, %HTTPoison.Error{reason: reason}} ->
IO.inspect reason
end
end