Packages
blossom
0.23.1
0.29.3
0.29.2
0.29.1
0.29.0
0.28.0
0.27.3
0.27.2
0.27.1
0.27.0
0.26.3
0.26.2
0.26.1
0.26.0
0.25.3
0.25.2
0.25.1
0.25.0
0.24.1
0.24.0
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.8
0.21.7
0.21.6
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.2
0.12.1
0.12.0
0.11.0
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Easy identity for easy authentication
Current section
Files
Jump to
Current section
Files
lib/blossom/models/users.ex
defmodule Blossom.Models.Users do
alias Blossom.Models.Users
alias KilnCore.Builders.Model, as: Builder
alias KilnCore.Utils, as: KilnCoreUtils
def fetch_users(func, params, user, ctx) do
if ctx[:realms].is_admin?(user["sub"], user["iss"]) do
apply(ctx[:schema], func, [Map.put(params, "realm", user["iss"])])
else
new_params =
params
|> Map.put("id", user["sub"])
|> Map.put("cask", ctx[:casks_roles].adminships(user))
apply(ctx[:schema], func, [new_params])
end
end
def is_item_realm_admin?(id, user, ctx) do
case ctx[:schema].get(%{"id" => id, "limit" => 1}) do
[] ->
false
[item] ->
if ctx[:realms].is_admin?(user["sub"], item.realm) do
true
else
false
end
end
end
def new(params, user, ctx) do
case user do
:system ->
ctx[:schema].new(params)
:public ->
params
|> Builder.handle_params(ctx[:protected_fields], user)
|> Map.delete("role")
|> ctx[:schema].new()
%{"sub" => _} ->
if ctx[:realms].is_admin?(user["sub"], params["realm"]) do
ctx[:schema].new(params)
else
{:error, :forbidden}
end
end
end
def get(params, user, ctx) do
case user do
:system ->
ctx[:schema].get(params)
%{"sub" => _} ->
Users.fetch_users(:get, params, user, ctx)
_ ->
[]
end
end
def get_count(params, user, ctx) do
case user do
:system ->
ctx[:schema].get_count(params)
%{"sub" => _} ->
Users.fetch_users(:get_count, params, user, ctx)
_ ->
0
end
end
def show_as_admin(id, user, ctx) do
params =
%{
"id" => id,
"items" => 1,
"access" => "show",
"cask" => ctx[:casks_roles].adminships(user)
}
case ctx[:schema].get(params) do
[] -> {:error, :forbidden}
users -> users
end
end
def show(id, user, ctx) do
case user do
:system ->
ctx[:schema].show(id)
%{"sub" => _} ->
cond do
id == user["sub"] ->
ctx[:schema].show(id)
Users.is_item_realm_admin?(id, user, ctx) ->
ctx[:schema].show(id)
true ->
Users.show_as_admin(id, user, ctx)
end
_ ->
{:error, :forbidden}
end
end
def edit(params, id, user, ctx) do
case user do
:system ->
ctx[:schema].edit(params, id)
%{"sub" => _} ->
cond do
Users.is_item_realm_admin?(id, user, ctx) ->
params
|> Map.delete("realm")
|> ctx[:schema].edit(id)
id == user["sub"] ->
params
|> Builder.handle_params(ctx[:protected_fields], user)
|> Map.drop(["id", "email", "realm", "role"])
|> ctx[:schema].edit(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
id == user["sub"] ->
ctx[:schema].delete(id)
Users.is_item_realm_admin?(id, user, ctx) ->
ctx[:schema].delete(id)
true ->
{:error, :forbidden}
end
_ ->
{:error, :forbidden}
end
end
defmacro __using__(opts \\ []) do
quote do
protected_fields = ["blocked", "email_verified"]
use KilnCore.Model,
protected_fields:
Keyword.get(unquote(opts), :protected_fields, protected_fields),
schema: unquote(Keyword.get(opts, :schema))
@casks_roles KilnCoreUtils.option_or_mod_replace(
@caller,
unquote(opts),
:casks_roles,
CasksRoles,
2
)
@realms KilnCoreUtils.option_or_mod_replace(
@caller,
unquote(opts),
:realms,
Realms,
2
)
@ctx [
schema: @schema,
casks_roles: @casks_roles,
realms: @realms,
protected_fields: @protected_fields
]
def new(params, user) do
Users.new(params, user, @ctx)
end
def get(params, user) do
Users.get(params, user, @ctx)
end
def get_count(params, user) do
Users.get_count(params, user, @ctx)
end
def edit(params, id, user) do
Users.edit(params, id, user, @ctx)
end
def show(id, user) do
Users.show(id, user, @ctx)
end
def delete(id, user) do
Users.delete(id, user, @ctx)
end
end
end
end