lib/securex_permissions.ex

defmodule SecureX.Permissions do
  alias SecureXWeb.{PermissionController}

  @moduledoc """
  Contains CRUD For Permissions.
  """

  @doc """
  Get list of Permissions by User Roles.
    List/1 is without pagination,
    List/2 & List/3 is with pagination.

  ## Examples

      iex> list([], 1)
      {:error, :bad_input}

      iex> list([])
      {:error, :bad_input}

      iex> list(["owner", "super_admin"], 1)
      {:ok,
        %Scrivener.Page{
          entries: [
            %{permission: 4, resource_id: "roles", role_id: "owner"},
            %{permission: 4, resource_id: "users", role_id: "owner"},
            %{permission: 4, resource_id: "stock_types", role_id: "owner"},
            %{permission: 4, resource_id: "sales", role_id: "owner"},
            %{permission: 4, resource_id: "stocks", role_id: "owner"},
            %{permission: 4, resource_id: "providers", role_id: "owner"},
            %{permission: 4, resource_id: "fuel_dispensers", role_id: "owner"},
            %{permission: 4, resource_id: "employees", role_id: "owner"},
            %{permission: 4, resource_id: "customers", role_id: "owner"},
            %{permission: 4, resource_id: "stock_stats", role_id: "owner"}
          ],
        page_number: 1,
        page_size: 10,
        total_entries: 22,
        total_pages: 3
      }
    }

    iex> list(["owner", "super_admin"])
      [
      %{ permission: 4, resource_id: "users", role_id: "admin"},
      %{ permission: 4, resource_id: "person_form", role_id: "super_admin"}
     ]
  """
  @spec list(list(), number(), number()) :: tuple()
  def list(list, page \\ nil, page_size \\ 10),
    do: PermissionController.list_permissions(list, page, page_size)

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

  ## Examples

      iex> add(%{"permission" => -1, "resource_id" => "users", "role_id" => "super_admin"})
      %Permission{
        id: 1,
        permission: -1,
        resource_id: "users",
        role_id: "super_admin"
      }
  """
  @spec add(map()) :: tuple()
  def add(params) do
    case PermissionController.create(params) do
      {:error, error} -> {:error, error}
      {:ok, role} -> {:ok, role}
    end
  end

  @doc """
  Update a Permission. You can send either `Atom Map` or `String Map` to update a Permission.

   ## Examples

      iex> update(%{"id" => "1", "resource_id" => "users", "permission" => 4, "role_id" => "admin"})
      %Permission{
        id: 1,
        permission: 4,
        resource_id: "users",
        role_id: "admin"
      }

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

  @doc """
  Delete a Permission.

  ## Examples

      iex> delete(%{"id" => 1)
      %Permission{
        id: 1,
        permission: 4,
        resource_id: "users",
        role_id: "admin"
      }
  """
  @spec delete(map()) :: tuple()
  def delete(params) do
    case PermissionController.delete(params) do
      {:error, error} -> {:error, error}
      {:ok, role} -> {:ok, role}
    end
  end
end