lib/ash_json_api/error/not_found.ex

defmodule AshJsonApi.Error.NotFound do
  @moduledoc """
  Returned when a record was explicitly requested, but could not be found.
  """
  @detail @moduledoc
  @title "Entity Not Found"
  @status_code 404

  use AshJsonApi.Error

  def new(opts) do
    opts
    |> Keyword.put(:detail, detail(opts))
    |> Keyword.put(:log_level, :info)
    |> Keyword.drop([:filter, :resource])
    |> super()
  end

  defp detail(opts) do
    filter = Keyword.get(opts, :filter)
    resource = Keyword.get(opts, :resource)

    if is_map(filter) || Keyword.keyword?(filter) do
      filter =
        Enum.map_join(filter, ", ", fn {key, value} ->
          try do
            "#{key}: #{to_string(value)}"
          rescue
            _ ->
              "#{key}: #{inspect(value)}"
          end
        end)

      "No #{AshJsonApi.Resource.Info.type(resource)} record found with `#{filter}`"
    else
      "No #{AshJsonApi.Resource.Info.type(resource)} record found with `#{inspect(filter)}`"
    end
  end
end