lib/securex_res.ex

defmodule SecureX.Res do
  alias SecureXWeb.{ResourceController}

  @moduledoc """
  Contains CRUD For Resources.
  """

  @doc """
  Get list of Resources.

  ## Examples

      iex> list()
      [
      %Resource{
        id: "person_farm",
        name: "Persons Farm"
      },
      %Resource{
        id: "users",
        name: "Users"
      }
      ]
  """
  @spec list() :: tuple()
  def list() do
    case ResourceController.list_resources() do
      [] -> {:error, :no_resources_found}
      res -> {:ok, res}
    end
  end

  @doc """
  Get a Resource.

  ## Examples

      iex> get(%{"res" => "person_farm"})
      %Resource{
        id: "person_farm",
        name: "Persons Farm"
      }
  """
  @spec get(map()) :: tuple()
  def get(params) do
    case ResourceController.get(params) do
      {:error, error} -> {:error, error}
      {:ok, res} -> {:ok, res}
    end
  end

  @doc """
  Add a Resource. You can send either `Atom Map` or `String Map` to add a Resource.

  ## Examples

      iex> add(%{"res" => "Person Farm"})
      %Resource{
        id: "person_farm",
        name: "Persons Farm"
      }
  """
  @spec add(map()) :: tuple()
  def add(params) do
    case ResourceController.create(params) do
      {:error, error} -> {:error, error}
      {:ok, role} -> {:ok, role}
    end
  end

  @doc """
  Update a Resource. You can update any resource along with its permissions.
  You can send either `Atom Map` or `String Map` to update a Role. It will automatically
  update `resource_id` in `Permissions` table.

  ## Examples

      iex> update(%{"id" => "person_farm", "res" => "Person Organization"})
      %Resource{
        id: "person_organization",
        name: "Person Organization",
        permissions: :successfully_updated_permissions
      }

  """
  @spec update(map()) :: tuple()
  def update(params) do
    case ResourceController.update(params) do
      {:error, error} -> {:error, error}
      {:ok, role} -> {:ok, role}
    end
  end

  @doc """
  Delete a Resource. All `Permissions` will be removed against this resource.

  ## Examples

      iex> delete(%{"id" => "person_organization")
      %Resource{
        id: "person_organization",
        name: "Person Organization",
        permissions: :successfully_removed_permissions
      }
  """
  @spec delete(map()) :: tuple()
  def delete(params) do
    case ResourceController.delete(params) do
      {:error, error} -> {:error, error}
      {:ok, role} -> {:ok, role}
    end
  end
end