Current section

Files

Jump to
blossom lib blossom models organizations.ex
Raw

lib/blossom/models/organizations.ex

defmodule Blossom.Models.Organizations do
alias Blossom.Models.Organizations
alias Blossom.Utils
alias KilnCore.Builders.Model, as: Builder
alias KilnCore.Utils, as: KilnCoreUtils
def allowed_embeds(params, user, ctx) do
if params["embeds"] != nil do
adminships = ctx[:org_roles].adminships(user)
allowed_orgs = Utils.filter_allowed(params["id"], adminships)
if Enum.count(allowed_orgs) != Enum.count(params["id"]) do
Map.delete(params, "embeds")
else
params
end
else
params
end
end
def fetch_orgs(func, params, user, ctx) do
if ctx[:org_roles].is_root_admin?(user) do
apply(ctx[:schema], func, [params])
else
new_params =
params
|> Utils.put_allowed_orgs("id", user, ctx[:org_roles])
|> Organizations.allowed_embeds(user, ctx)
apply(ctx[:schema], func, [new_params])
end
end
def get(params, user, ctx) do
case user do
:system ->
ctx[:schema].get(params)
%{"sub" => _} ->
Organizations.fetch_orgs(:get, params, user, ctx)
_ ->
[]
end
end
def get_count(params, user, ctx) do
case user do
:system ->
ctx[:schema].get_count(params)
%{"sub" => _} ->
Organizations.fetch_orgs(:get_count, params, user, ctx)
_ ->
0
end
end
def show(id, user, ctx) do
case user do
:system ->
ctx[:schema].show([id])
%{"sub" => _} ->
cond do
ctx[:org_roles].is_member?(id, user) -> ctx[:schema].show([id])
ctx[:org_roles].is_root_admin?(user) -> ctx[:schema].show([id])
true -> {:error, :forbidden}
end
_ ->
{:error, :forbidden}
end
end
def edit(params, id, user, ctx, protected_fields) do
case user do
:system ->
ctx[:schema].edit(params, id)
%{"sub" => _} ->
cond do
ctx[:org_roles].is_admin?(id, user) ->
params
|> Builder.handle_params(protected_fields, user)
|> Map.delete("id")
|> ctx[:schema].edit(id)
ctx[:org_roles].is_root_admin?(user) ->
ctx[:schema].edit(params, id)
true ->
{:error, :forbidden}
end
_ ->
{:error, :forbidden}
end
end
def delete(id, user, ctx) do
case user do
:system ->
ctx[:schema].delete(id)
%{"sub" => _} ->
cond do
ctx[:org_roles].is_admin?(id, user) -> ctx[:schema].delete(id)
ctx[:org_roles].is_root_admin?(user) -> ctx[:schema].delete(id)
true -> {:error, :forbidden}
end
_ ->
{:error, :forbidden}
end
end
defmacro __using__(opts \\ []) do
quote do
use KilnCore.Model,
protected_fields:
Keyword.get(unquote(opts), :protected_fields, ["enabled", "root"]),
schema: unquote(Keyword.get(opts, :schema))
@org_roles KilnCoreUtils.option_or_mod_replace(
@caller,
unquote(opts),
:organizations_roles,
OrganizationsRoles,
2
)
@ctx [schema: @schema, org_roles: @org_roles]
def get(params, user) do
Organizations.get(params, user, @ctx)
end
def get_count(params, user) do
Organizations.get_count(params, user, @ctx)
end
def show(id, user) do
Organizations.show(id, user, @ctx)
end
def edit(params, id, user) do
Organizations.edit(params, id, user, @ctx, @protected_fields)
end
def delete(id, user) do
Organizations.delete(id, user, @ctx)
end
end
end
end