lib/middleware/simple_policy.ex

defmodule Sucrose.Middleware.SimplePolicy do
  alias Absinthe.Resolution
  alias Sucrose.Common

  @behaviour Absinthe.Middleware
  @moduledoc """
  This is a simple policy handler that takes a very simple approach to absinthe resolution handling
  The basis for all of the handlers is to have a common response type:

  To use this policy you must return the common return handler.
  `Sucrose.Common.handle_response/2`
  """

  @error_message :no_proper_resolution_or_config

  def call(resolution = %{context: %{claim: _}}, %{handler: handler}) do
    check = simple_resolution(resolution)

    response =
      case check do
        %{parent: :mutation} -> handler.can_mutate?(check)
        _ -> handler.can_query?(check)
      end

    Common.handle_response(response, check)
  rescue
    _ ->
      {:error, @error_message}
  end

  def call(_, _) do
    {:error, @error_message}
  end

  @spec simple_resolution(map()) :: %{
          child: :atom,
          parent: :atom,
          claim: any(),
          resolution: map()
        }
  def simple_resolution(resolution) do
    %{
      child: resolution.definition.schema_node.identifier,
      parent: resolution.parent_type.identifier,
      claim: resolution.context.claim,
      resolution: resolution
    }
  end
end