aprs.me/lib/aprsme_web/controllers/api/v1/json/changeset_json.ex
2025-07-05 15:51:39 -05:00

31 lines
829 B
Elixir

defmodule AprsmeWeb.Api.V1.ChangesetJSON do
@moduledoc """
Renders changeset errors for API v1.
"""
use Gettext, backend: AprsmeWeb.Gettext
@doc """
Renders changeset errors.
"""
def render("error.json", %{changeset: changeset}) do
%{
error: %{
message: gettext("Validation failed"),
code: "validation_error",
details: translate_errors(changeset)
}
}
end
defp translate_errors(changeset) do
Ecto.Changeset.traverse_errors(changeset, &translate_error/1)
end
defp translate_error({msg, opts}) do
# Because the error messages we show in our forms and APIs
# are defined inside Ecto, we need to translate them dynamically.
Enum.reduce(opts, msg, fn {key, value}, acc ->
String.replace(acc, "%{#{key}}", to_string(value))
end)
end
end