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