defmodule CoreUtils.ViewHelper do @moduledoc """ Presentation helpers """ alias CoreUtils.StructUtil def translate_errors(%{causes: causes}) do %{status: :error, code: 1, message: "Validation errors", causes: causes} end def translate_errors(changeset) do %{ status: :error, code: 1, message: "Validation errors", causes: Ecto.Changeset.traverse_errors(changeset, &:erlang.element(1, &1)) } end defimpl Poison.Encoder, for: Tuple do def encode(tuple, _options) do tuple |> Tuple.to_list() |> Poison.encode!() end end def encode(%{__struct__: Core.Models.Task} = struct, options \\ []) do struct = if struct.geom do {lon, lat} = struct.geom.coordinates %{struct | lon: lon, lat: lat} else struct end enconde_model(struct, options) end def encode(struct, options) do enconde_model(struct, options) end defp enconde_model(model, options) do model |> StructUtil.nested_parse() |> sanitize_map() |> Poison.Encoder.Map.encode(options) end defp sanitize_map(map) do map |> Enum.filter(fn {_, %Ecto.Association.NotLoaded{}} -> false {:__meta__, _} -> false {:__struct__, _} -> false {_, _} -> true end) |> Map.new() end end