From fbd3bc9772ded77205015c699b411decf03478e5 Mon Sep 17 00:00:00 2001 From: HaimKortovich Date: Fri, 15 May 2026 13:47:26 -0500 Subject: [PATCH] better error handlign --- lib/customer_service/lead/queries.ex | 11 ---- .../controllers/error_json.ex | 51 +++++++++++++++++-- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/lib/customer_service/lead/queries.ex b/lib/customer_service/lead/queries.ex index 314b111..c04b31e 100644 --- a/lib/customer_service/lead/queries.ex +++ b/lib/customer_service/lead/queries.ex @@ -13,15 +13,4 @@ defmodule CustomerService.Lead.Queries do lead -> {:ok, lead} end end - - def list_leads(params \\ %{}) do - Flop.validate_and_run(QuickLead, params, for: QuickLead) - end - - def get_lead(id) do - case Repo.get(QuickLead, id) do - nil -> {:error, :not_found} - lead -> {:ok, lead} - end - end end diff --git a/lib/customer_service_web/controllers/error_json.ex b/lib/customer_service_web/controllers/error_json.ex index 7bf3ada..b234443 100644 --- a/lib/customer_service_web/controllers/error_json.ex +++ b/lib/customer_service_web/controllers/error_json.ex @@ -3,15 +3,58 @@ defmodule CustomerServiceWeb.ErrorJSON do This module is invoked by your endpoint in case of errors on JSON requests. """ + alias Ecto.Changeset + alias OpenApiSpex.Error + def render("404.json", _assigns) do %{errors: %{detail: "Not Found"}} end - def render("500.json", _assigns) do - %{errors: %{detail: "Internal Server Error"}} + def render("500.json", assigns) do + detail = detailed_message(assigns[:reason], "Internal Server Error") + %{errors: %{detail: detail}} end - def render(template, _assigns) do - %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} + def render("400.json", assigns) do + detail = detailed_message(assigns[:reason], "Bad Request") + %{errors: %{detail: detail}} + end + + def render("422.json", assigns) do + detail = detailed_message(assigns[:reason], "Unprocessable Entity") + %{errors: %{detail: detail}} + end + + def render(template, assigns) do + detail = + detailed_message( + assigns[:reason], + Phoenix.Controller.status_message_from_template(template) + ) + + %{errors: %{detail: detail}} + end + + defp detailed_message(nil, default), do: default + + defp detailed_message(%Changeset{} = changeset, _default) do + format_changeset_errors(changeset) + |> inspect() + end + + defp detailed_message(%Error{errors: errors}, _default) do + Enum.map_join(errors, ", ", fn e -> "#{e.code}: #{e.message}" end) + end + + defp detailed_message(reason, _default) do + inspect(reason, pretty: true) + end + + defp format_changeset_errors(changeset) do + Changeset.traverse_errors(changeset, fn {msg, opts} -> + Enum.reduce(opts, msg, fn {key, value}, acc -> + String.replace(acc, "%{#{key}}", to_string(value)) + end) + end) end end