Current section

Files

Jump to
ami lib ami heimdall.ex
Raw

lib/ami/heimdall.ex

defmodule Ami.Heimdall do
import Ecto.{Query}
alias Ami.{
Tag,
Repo,
Role,
User,
Quiz,
Unit,
Video,
Course,
Answer,
Lesson,
Package,
Resource,
UnitLesson,
CoursePeriod,
CourseResource,
ResourceAttachment,
ThumbImageAttachment,
TeaserImageAttachment,
AffiliateLogoAttachment
}
@rules %{
:admin => %{ crud: :all, clone: :all},
:instructor => %{},
:community_moderator => %{
read: [
{Community, %{}}
],
create: [
{Course, %{}},
],
update: [
{Course, %{required: [:community_id]}},
{}
],
clone: [],
delete: [
{Course, %{required: [:community_id]}}
]
},
:learning_facilitator => %{},
:buddy => %{},
:accountibility_partner => %{},
:respondent => %{},
:system_admin => %{}
}
def can?(%User{}= user, action, struct) do
cond do
Role.has_any_role?(user, [:admin, :sytem_admin]) ->
true
Role.has_role?(user, :community_moderator) ->
case Enum.find(@rules[:community_moderator][action], fn({model, opts}) -> model == struct.__struct__ end) do
{model, opts} ->
if is_nil(opts[:required]) do
true
else
Enum.all?(opts[:required], fn attr -> !is_nil(Map.get(struct, attr)) end)
end
_ -> false
end
end
end
end