lib/common.ex

defmodule Sucrose.Common do
  alias Absinthe.Resolution
  require Logger

  @moduledoc """
  This is the common module to be shared / used amongst the
  middleware policies.
  """

  @doc """
  This is the default error handler to put when we want to deny something.
  """
  def handle_error(check, message \\ "Unauthorized") do
    Logger.warn(fn ->
      "Erroring out for: #{inspect(Map.take(check, [:child, :parent, :claim]))}"
    end)

    Resolution.put_result(check.resolution, {:error, message})
  end

  def handle_censor(check, censor) do
    Resolution.put_result(check.resolution, {:ok, censor})
  end

  @doc """
  Handle the responses, return, warn, or error based upon the response.

  1. `true` - return the normal response
  1. `{:ok, _}` -> return the normal response
  1. `{:censor, val}` -> censor the value and put the response
  1. `false` - return null / log warn message
  1. `:error` - return nil / log warn message
  1. `{:error, msg}` - return null / log warn message and return the `msg` on the payload
  """

  def handle_response(response, check) do
    case response do
      {:ok, _} ->
        check.resolution

      :ok ->
        check.resolution

      {:censor, val} ->
        handle_censor(check, val)

      true ->
        check.resolution

      {:error, msg} ->
        handle_error(check, msg)

      _ ->
        handle_error(check)
    end
  end
end