defmodule Sucrose.Middleware.SimpleOrPolicy do alias Absinthe.Resolution alias Sucrose.Common @behaviour Absinthe.Middleware @error_message :no_proper_resolution_or_config def call(resolution = %{context: %{claims: claims}}, %{handler: handler}) do check = simple_resolution(resolution) response = claims_check(check, claims, handler) # IO.puts("\n\nBEGIN") # IO.inspect(response) # IO.inspect("For: #{inspect(Map.take(check, [:child, :parent]))}") # IO.inspect("For Claims: #{inspect(claims)}") # IO.puts("END\n\n") Common.handle_response(response, check) # rescue # _ -> # {:error, @error_message} end def call(_, _) do {:error, @error_message} end def claims_check(check, claims, handler, last \\ :error) def claims_check(_check, [], _handler, last), do: last def claims_check(check, [head | rest], handler, last) do new_check = Map.put(check, :claim, head) current_claim_check = case new_check do %{from: :mutation} -> handler.can_mutate?(new_check) _ -> handler.can_query?(new_check) end # IO.inspect("For: #{inspect(Map.take(new_check, [:child, :parent, :claim]))}") # IO.inspect(current_claim_check) case current_claim_check do # immediate exits :ok -> :ok true -> :ok {:censor, _} -> claims_check(check, rest, handler, current_claim_check) :error_out -> :error {:error_out, msg} -> {:error, msg} # Continue on for anything else _ -> claims_check(check, rest, handler, last) end end @spec simple_resolution(map()) :: %{ child: :atom, parent: :atom, resolution: map() } def simple_resolution(resolution) do %{ child: resolution.definition.schema_node.identifier, parent: resolution.parent_type.identifier, resolution: resolution } end end