Current section

Files

Jump to
annacl lib annacl.ex
Raw

lib/annacl.ex

defmodule Annacl do
@behaviour Annacl.Behaviour
alias Annacl.ACL
alias Annacl.ACL.Roles.Role
alias Annacl.ACL.Permissions.Permission
@spec create_permission(map()) :: {:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate create_permission(attrs), to: ACL
@spec get_permission!(binary) :: Permission.t()
defdelegate get_permission!(name), to: ACL
@spec assign_role_to_permission(Permission.t(), Role.t()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate assign_role_to_permission(permission, role), to: ACL
@spec remove_role_from_permission(Permission.t(), Role.t()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate(remove_role_from_permission(permission, role), to: ACL)
@spec create_role(map()) :: {:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate create_role(attrs), to: ACL
@spec get_role!(binary) :: Role.t()
defdelegate get_role!(name), to: ACL
@spec update_role(Role.t(), map()) :: {:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate update_role(role, attrs), to: ACL
@spec grant_permission_to_role(Role.t(), Permission.t()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate grant_permission_to_role(role, permission), to: ACL
@spec revoke_permission_from_role(Role.t(), Permission.t()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
defdelegate revoke_permission_from_role(role, permission), to: ACL
@spec role_can?(Role.t(), Permission.t()) :: boolean
defdelegate role_can?(role, permission), to: ACL
@spec assign_role!(%{performer_id: binary}, binary()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
def assign_role!(%{performer_id: performer_id}, role_name) do
role = ACL.get_role!(role_name)
performer_id
|> ACL.get_performer!()
|> ACL.assign_role_to_performer(role)
end
@spec remove_role!(%{performer_id: binary}, binary()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
def remove_role!(%{performer_id: performer_id}, role_name) do
role = ACL.get_role!(role_name)
performer_id
|> ACL.get_performer!()
|> ACL.remove_role_from_performer(role)
end
@spec grant_permission!(%{performer_id: binary}, binary()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
def grant_permission!(%{performer_id: performer_id}, permission_name) do
permission = ACL.get_permission!(permission_name)
performer_id
|> ACL.get_performer!()
|> ACL.grant_permission_to_performer(permission)
end
@spec revoke_permission!(%{performer_id: binary}, binary()) ::
{:ok, any} | {:error, Ecto.Changeset.t()}
def revoke_permission!(%{performer_id: performer_id}, permission_name) do
permission = ACL.get_permission!(permission_name)
performer_id
|> ACL.get_performer!()
|> ACL.revoke_permission_from_performer(permission)
end
@spec has_role?(%{performer_id: binary}, binary) :: boolean
def has_role?(%{performer_id: performer_id}, role_name) when is_binary(role_name) do
role = ACL.get_role!(role_name)
performer = ACL.get_performer!(performer_id)
superadmin?(performer) || ACL.performer_has_role?(performer, role)
end
@spec can?(%{performer_id: binary}, binary) :: boolean
def can?(%{performer_id: performer_id}, permission_name)
when is_binary(permission_name) do
permission = ACL.get_permission!(permission_name)
performer = ACL.get_performer!(performer_id)
superadmin?(performer) || ACL.performer_can?(performer, permission)
end
@spec list_roles(%{performer_id: binary}) :: [Role.t()]
def list_roles(%{performer_id: performer_id}) do
performer_id
|> ACL.get_performer!()
|> ACL.performer_list_roles()
end
@spec list_permissions(%{performer_id: binary}) :: [Permission.t()]
def list_permissions(%{performer_id: performer_id}) do
performer_id
|> ACL.get_performer!()
|> ACL.performer_list_permissions()
end
defp superadmin?(%{performer_id: performer_id}) do
performer_id
|> ACL.get_performer!()
|> superadmin?()
end
defp superadmin?(%ACL.Performers.Performer{} = performer) do
with %ACL.Roles.Role{} = superadmin_role <- ACL.get_role("superadmin") do
ACL.performer_has_role?(performer, superadmin_role)
else
_ ->
false
end
end
end