Packages
phoenix_kit
1.7.24
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit/users/auth/scope.ex
defmodule PhoenixKit.Users.Auth.Scope do
@moduledoc """
Scope module for encapsulating PhoenixKit authentication state.
This module provides a structured way to handle user authentication context
throughout your Phoenix application, similar to Phoenix's built-in authentication
patterns but with PhoenixKit prefixing to avoid conflicts.
## Usage
# Create scope for authenticated user
scope = Scope.for_user(user)
# Create scope for anonymous user
scope = Scope.for_user(nil)
# Check authentication status
Scope.authenticated?(scope) # true or false
# Get user information
Scope.user(scope) # %User{} or nil
Scope.user_id(scope) # user.id or nil
Scope.user_email(scope) # user.email or nil
## Struct Fields
- `:user` - The current user struct or nil
- `:authenticated?` - Boolean indicating if user is authenticated
"""
alias PhoenixKit.Users.Auth.User
alias PhoenixKit.Users.Role
@type t :: %__MODULE__{
user: User.t() | nil,
authenticated?: boolean(),
cached_roles: [String.t()] | nil
}
defstruct user: nil, authenticated?: false, cached_roles: nil
@doc """
Creates a new scope for the given user.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1, email: "user@example.com"}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> scope.authenticated?
true
iex> scope.user.email
"user@example.com"
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> scope.authenticated?
false
iex> scope.user
nil
"""
@spec for_user(User.t() | nil) :: t()
def for_user(%User{} = user) do
# Pre-load user roles to cache them in the scope
cached_roles = User.get_roles(user)
%__MODULE__{
user: user,
authenticated?: true,
cached_roles: cached_roles
}
end
def for_user(nil) do
%__MODULE__{
user: nil,
authenticated?: false,
cached_roles: []
}
end
@doc """
Checks if the scope represents an authenticated user.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.authenticated?(scope)
true
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.authenticated?(scope)
false
"""
@spec authenticated?(t()) :: boolean()
def authenticated?(%__MODULE__{authenticated?: authenticated?}), do: authenticated?
@doc """
Gets the user from the scope.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1, email: "user@example.com"}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.user(scope)
%PhoenixKit.Users.Auth.User{id: 1, email: "user@example.com"}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.user(scope)
nil
"""
@spec user(t()) :: User.t() | nil
def user(%__MODULE__{user: user}), do: user
@doc """
Gets the user ID from the scope.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 123}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.user_id(scope)
123
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.user_id(scope)
nil
"""
@spec user_id(t()) :: integer() | nil
def user_id(%__MODULE__{user: %User{id: id}}), do: id
def user_id(%__MODULE__{user: nil}), do: nil
@doc """
Gets the user email from the scope.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1, email: "user@example.com"}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.user_email(scope)
"user@example.com"
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.user_email(scope)
nil
"""
@spec user_email(t()) :: String.t() | nil
def user_email(%__MODULE__{user: %User{email: email}}), do: email
def user_email(%__MODULE__{user: nil}), do: nil
@doc """
Checks if the scope represents an anonymous (non-authenticated) user.
## Examples
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.anonymous?(scope)
true
iex> user = %PhoenixKit.Users.Auth.User{id: 1}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.anonymous?(scope)
false
"""
@spec anonymous?(t()) :: boolean()
def anonymous?(%__MODULE__{authenticated?: authenticated?}), do: not authenticated?
@doc """
Checks if the user has a specific role.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.has_role?(scope, "Admin")
true
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.has_role?(scope, "Admin")
false
"""
@spec has_role?(t(), String.t()) :: boolean()
def has_role?(%__MODULE__{cached_roles: cached_roles}, role_name)
when is_binary(role_name) and is_list(cached_roles) do
role_name in cached_roles
end
def has_role?(%__MODULE__{user: nil}, _role_name), do: false
@doc """
Checks if the user is an owner.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.owner?(scope)
true
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.owner?(scope)
false
"""
@spec owner?(t()) :: boolean()
def owner?(%__MODULE__{cached_roles: cached_roles})
when is_list(cached_roles) do
roles = Role.system_roles()
roles.owner in cached_roles
end
def owner?(%__MODULE__{user: nil}), do: false
@doc """
Checks if the user is an admin or owner.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.admin?(scope)
true
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.admin?(scope)
false
"""
@spec admin?(t()) :: boolean()
def admin?(%__MODULE__{cached_roles: cached_roles}) when is_list(cached_roles) do
roles = Role.system_roles()
roles.admin in cached_roles or roles.owner in cached_roles
end
def admin?(%__MODULE__{user: nil}), do: false
@doc """
Gets all roles for the user.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.user_roles(scope)
["Admin", "User"]
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.user_roles(scope)
[]
"""
@spec user_roles(t()) :: [String.t()]
def user_roles(%__MODULE__{cached_roles: cached_roles}) when is_list(cached_roles) do
cached_roles
end
def user_roles(%__MODULE__{user: nil}), do: []
@doc """
Gets the user's full name.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{first_name: "John", last_name: "Doe"}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.user_full_name(scope)
"John Doe"
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.user_full_name(scope)
nil
"""
@spec user_full_name(t()) :: String.t() | nil
def user_full_name(%__MODULE__{user: %User{} = user}) do
User.full_name(user)
end
def user_full_name(%__MODULE__{user: nil}), do: nil
@doc """
Checks if the user is active.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{is_active: true}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.user_active?(scope)
true
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(nil)
iex> PhoenixKit.Users.Auth.Scope.user_active?(scope)
false
"""
@spec user_active?(t()) :: boolean()
def user_active?(%__MODULE__{user: %User{is_active: is_active}}) do
is_active
end
def user_active?(%__MODULE__{user: nil}), do: false
@doc """
Converts scope to a map for debugging or logging purposes.
## Examples
iex> user = %PhoenixKit.Users.Auth.User{id: 1, email: "user@example.com"}
iex> scope = PhoenixKit.Users.Auth.Scope.for_user(user)
iex> PhoenixKit.Users.Auth.Scope.to_map(scope)
%{
authenticated?: true,
user_id: 1,
user_email: "user@example.com",
user_roles: ["Admin", "User"],
owner?: false,
admin?: true
}
"""
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = scope) do
%{
authenticated?: authenticated?(scope),
user_id: user_id(scope),
user_email: user_email(scope),
user_full_name: user_full_name(scope),
user_roles: user_roles(scope),
owner?: owner?(scope),
admin?: admin?(scope),
user_active?: user_active?(scope)
}
end
end