Current section
Files
Jump to
Current section
Files
lib/skeleton/permission/live_view.ex
defmodule Skeleton.Permission.LiveView do
# Callbacks
defmacro __using__(opts) do
alias Skeleton.Permission.LiveView
quote do
@permission_module unquote(opts[:permission]) || raise("Permission required")
def check_permission(%{halted: true} = socket, _, _, _), do: socket
def check_permission(socket, permission, permission_name, ctx_fun) do
LiveView.do_check_permission(socket, @permission_module, permission, permission_name, ctx_fun)
end
def check_permission(%{halted: true} = socket, _, _), do: socket
def check_permission(socket, permission, permission_name) do
LiveView.do_check_permission(socket, @permission_module, permission, permission_name, fn _, ctx ->
ctx
end)
end
end
end
# Do check permission
def do_check_permission(socket, permission_module, permission, permission_name, ctx_fun) do
context =
socket
|> build_permission_context(permission_module, permission, ctx_fun)
|> permission.preload_data([permission_name])
if permission.check(permission_name, context) do
socket
else
unauthorized(socket)
end
end
# Do build context
def build_permission_context(socket, permission_module, permission, ctx_fun) do
default_context = permission_module.context(socket)
permission_context = permission.context(socket, default_context)
ctx_fun.(socket, Map.merge(default_context, permission_context))
end
# Return unauthorized
def unauthorized(_socket) do
{:error, :unauthorized}
end
def forbidden(_socket) do
{:error, :forbidden}
end
end