Skip to content

Instantly share code, notes, and snippets.

@alduro
Last active April 16, 2017 19:22
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 alduro/63500542e0122a8cb706e79bcec13b0a to your computer and use it in GitHub Desktop.
Save alduro/63500542e0122a8cb706e79bcec13b0a to your computer and use it in GitHub Desktop.
def create(conn, _params) do
case Plug.Conn.read_body(conn) do
{:ok, body, conn} ->
{:ok, data} = Poison.decode(body)
{:error, reason} ->
render(ExRushlookApi.OrderView, "error.json", error: reason)
end
# Get Buyer
user = Repo.get_by!(User, email: "test@email.com) |> Repo.preload(:buyer)
# Get Store
store = Repo.get_by(Store, name: "My Store")
cart = Map.get(data, "cart")
form = Map.get(data, "form")
itemsById = cart["itemsById"]
changeset_address = Address.changeset(%Address{}, %{
address_0: form["streetAddress"],
address_1: form["appartment"],
city: form["city"],
state: form["state"],
zip: form["zipCode"],
store_id: store.id,
buyer_id: user.buyer.id
})
# Save Address
address = Repo.insert!(changeset_address)
order_product_lines = Enum.map(cart["itemsById"], fn({productId, values}) -> Map.merge(%{"productId" => productId}, values) end)
order_products = Enum.map( order_product_lines, &OrderProduct.changeset(%OrderProduct{}, CheckoutService.get_order_product(&1)))
# Order Total Amount
total_amount = Enum.reduce order_product_lines, 0, fn(%{"price" => price, "productId" => productId, "qty" => qty, "size" => size}, acc) -> (Float.parse(price) |> elem(0)) * (qty) + acc end
changeset_order = Order.changeset(%Order{}, %{
buyer_id: user.buyer.id,
payment_nonce: "fake-valid-nonce",
delivery_date: form["deliveryDate"] |> DateTime.from_unix!(:milliseconds) |> Ecto.DateTime.cast!,
delivery_time: form["deliveryTime"],
address_id: address.id,
cart_price: total_amount
})
if changeset_order.valid? do
Repo.transaction fn ->
# Save Order
order = changeset_order
|> Repo.insert!
|> Repo.preload(:buyer)
# Save Order Products
Enum.map(order_products, fn order_product ->
order_product = Repo.insert!(order_product) |> Repo.preload(:order)
changeset = Ecto.Changeset.change(order_product) |> Ecto.Changeset.put_assoc(:order, order)
Repo.update!(changeset)
end)
CheckoutService.charge_customer(total_amount, "fake-valid-nonce")
IO.puts "DID WORK ****************"
render(conn, "show.json", order: order)
end
else
IO.puts "ERROR ********"
conn
|> render(ExRushlookApi.ChangesetView, "error.json", changeset: changeset_order)
end
end
defmodule ExRushlookApi.OrderView do
use ExRushlookApi.Web, :view
def render("index.json", %{orders: orders}) do
%{data: render_many(orders, __MODULE__, "order.json")}
end
def render("show.json", %{order: order}) do
%{data: render_one(order, __MODULE__, "order.json")}
end
def render("order.json", %{order: order}) do
order |> IO.inspect
%{id: order.id}
end
def render("errors.json", %{errors: errors}) do
%{errors: render_many(errors, __MODULE__, "error.json")}
end
def render("error.json", %{error: error}) do
%{
key: error.key,
value: error.value
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment