Current section

Files

Jump to
blossom lib blossom models realms.ex
Raw

lib/blossom/models/realms.ex

defmodule Blossom.Models.Realms do
alias Blossom.Models.Realms
alias Blossom.Utils
alias KilnCore.Builders.Model, as: Builder
alias KilnCore.Utils, as: KilnCoreUtils
def expand_perms(action) do
Utils.expand_perms("realms", "realms", action)
end
def new(params, user, ctx) do
if user == :system do
ctx[:schema].new(params)
else
{:error, :forbidden}
end
end
def set_fetch_params(assignments, params) do
{realms, _casks, _ids} = assignments
Map.put(params, "allowed_ids", realms)
end
def fetch(func, params, user, ctx) do
new_params =
"list"
|> Realms.expand_perms()
|> ctx[:roles_assignments].get_reduced(:any, :any, user)
|> Realms.set_fetch_params(params)
apply(ctx[:schema], func, [new_params])
end
def get(params, user, ctx) do
case user do
:system ->
ctx[:schema].get(params)
%{"sub" => _} ->
Realms.fetch(:get, params, user, ctx)
_ ->
[]
end
end
def get_count(params, user, ctx) do
case user do
:system ->
ctx[:schema].get_count(params)
%{"sub" => _} ->
Realms.fetch(:get_count, params, user, ctx)
_ ->
[]
end
end
def show(id, user, ctx) do
case user do
:system -> ctx[:schema].show(id)
%{"sub" => _} -> ctx[:schema].show(user["iss"])
_ -> {:error, :forbidden}
end
end
def edit(params, id, user, ctx) do
case user do
:system ->
ctx[:schema].edit(params, id)
%{"sub" => _} ->
perms = Realms.expand_perms("edit")
if Utils.has_item_perms?(id, user, perms, ctx) do
params
|> Builder.handle_params(ctx[:protected_fields], user)
|> Map.delete("id")
|> ctx[:schema].edit(id)
else
{:error, :forbidden}
end
_ ->
{:error, :forbidden}
end
end
def delete(id, user, ctx) do
case user do
:system ->
ctx[:schema].delete(id)
%{"sub" => _} ->
perms = Realms.expand_perms("delete")
if Utils.has_item_perms?(id, user, perms, ctx) do
ctx[:schema].delete(id)
else
{:error, :forbidden}
end
_ ->
{:error, :forbidden}
end
end
defmacro __using__(opts \\ []) do
quote do
use KilnCore.Model,
protected_fields: Keyword.get(unquote(opts), :protected_fields, []),
schema: unquote(Keyword.get(opts, :schema))
@roles_assignments KilnCoreUtils.option_or_mod_replace(
@caller,
unquote(opts),
:roles_assignments,
RolesAssignments,
2
)
@users KilnCoreUtils.option_or_mod_replace(
@caller,
unquote(opts),
:users,
Users,
2
)
@ctx [
schema: @schema,
protected_fields: @protected_fields,
roles_assignments: @roles_assignments,
users: @users
]
def new(params, user) do
Realms.new(params, user, @ctx)
end
def get(params, user) do
Realms.get(params, user, @ctx)
end
def get_count(params, user) do
Realms.get_count(params, user, @ctx)
end
def show(id, user) do
Realms.show(id, user, @ctx)
end
def edit(params, id, user) do
Realms.edit(params, id, user, @ctx)
end
def delete(id, user) do
Realms.delete(id, user, @ctx)
end
end
end
end