defmodule MicrowavepropWeb.Api.FallbackController do @moduledoc """ Translates `{:error, term}` tuples returned from `/api/v1` controller actions into RFC 9457 problem+json responses. Wired via `action_fallback/1` in `MicrowavepropWeb.Api.V1.BaseController`. """ use Phoenix.Controller, formats: [:json] alias MicrowavepropWeb.Api.ErrorJSON @spec call(Plug.Conn.t(), term()) :: Plug.Conn.t() def call(conn, {:error, %Ecto.Changeset{} = changeset}) do ErrorJSON.send_changeset(conn, changeset) end def call(conn, {:error, :not_found}) do ErrorJSON.send_problem(conn, 404, "not_found", "Resource not found.") end def call(conn, {:error, :forbidden}) do ErrorJSON.send_problem(conn, 403, "forbidden", "You may not access this resource.") end def call(conn, {:error, :unauthorized}) do ErrorJSON.send_problem(conn, 401, "unauthorized", "Authentication is required.") end def call(conn, {:error, :bad_request, detail}) when is_binary(detail) do ErrorJSON.send_problem(conn, 400, "bad_request", detail) end def call(conn, {:error, :duplicate, _existing}) do ErrorJSON.send_problem(conn, 409, "conflict", "An equivalent resource already exists.") end end