Current section

Files

Jump to
ami lib ami role.ex
Raw

lib/ami/role.ex

defmodule Ami.Role do
use Bitwise
def roles do
[
:admin,
:instructor,
:community_moderator,
:course_admin,
:learning_facilitator,
:buddy,
:accountibility_partner,
:respondent,
:system_admin
]
end
def roles_from_mask(mask) do
Enum.reject(roles(), fn role ->
(mask &&& :math.pow(2, Enum.find_index(roles(), fn r -> r == role end)) |> round) == 0
end)
end
def has_role?(user_struct, role) do
if user_struct.roles_mask != nil do
roles_from_mask(user_struct.roles_mask)
|> Enum.any?(fn r -> r == role end)
else
false
end
end
def has_any_role?(user_struct, roles) do
grants = MapSet.new(roles)
if user_struct.roles_mask != nil do
user_roles =
__MODULE__.roles_from_mask(user_struct.roles_mask)
|> Enum.into(MapSet.new())
MapSet.intersection(grants, user_roles) |> MapSet.size() > 0
else
false
end
end
def has_all_roles?(user_struct, roles) do
grants = MapSet.new(roles)
if user_struct.roles_mask != nil do
user_roles =
__MODULE__.roles_from_mask(user_struct.roles_mask)
|> Enum.into(MapSet.new())
MapSet.intersection(grants, user_roles)
|> MapSet.size() == MapSet.size(grants)
else
false
end
end
end