defmodule LiveGuard.Config do
@moduledoc ~S"""
The config module of LiveGuard.
"""
alias LiveGuard.Helpers
@default_configs [
current_user: :current_user,
unauthorized_handler: {Helpers, :handle_unauthorized}
]
@typedoc "The default configs."
@type default_configs() :: [
current_user: :current_user,
unauthorized_handler: {LiveGuard.Helpers, :handle_unauthorized}
]
@doc "The default configs of LiveGuard."
@spec default_configs() :: default_configs()
def default_configs(), do: @default_configs
@doc ~S"""
The `:current_user` config of LiveGuard.
**You need to assign the current user to the socket before LiveGuard [`on_mount/4`](https://hexdocs.pm/live_guard/LiveGuard.html#on_mount/4) callback is called.**.
The default assign name for the current user is `:current_user`.
If you assign the current user as another than `:current_user` you can set in the config:
```elixir
config :live_guard, :current_user, :user
```
"""
@spec current_user() :: atom()
def current_user(),
do: Application.get_env(:live_guard, :current_user, @default_configs[:current_user])
@doc ~S"""
The `:unauthorized_handler` config of LiveGuard.
This function handles unauthorized LiveView lifecycle stages.
It's called when the [`allowed?/4`](https://hexdocs.pm/live_guard/LiveGuard.Allowed.html#allowed?/4) function returns `false`.
By default it will put an error flash message with text "_You don't have permission to do that!_".
`:mount` and `:handle_params` LiveView lifecycle stages needs redirect after it detected as unauthorized.
In this case by default it will redirect to the home page (`/`).
You can set a custom handler in the config:
```elixir
config :live_guard, :unauthorized_handler, {MyModule, :my_handle_unauthorized}
```
It's called with 2 inputs, first is a `socket`, second is `is_redirect` _(boolean)_.
"""
@spec unauthorized_handler() :: {module(), atom()}
def unauthorized_handler(),
do:
Application.get_env(
:live_guard,
:unauthorized_handler,
@default_configs[:unauthorized_handler]
)
end