Packages

phoenix_kit

1.7.56
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
phoenix_kit lib phoenix_kit users oauth_availability.ex
Raw

lib/phoenix_kit/users/oauth_availability.ex

defmodule PhoenixKit.Users.OAuthAvailability do
@moduledoc """
Checks OAuth availability and configured providers.
This module provides runtime checks to determine if OAuth dependencies are loaded
and which providers are properly configured. It enables graceful degradation when
OAuth dependencies are not installed.
"""
@doc """
Checks if Ueberauth library is loaded and available.
Returns `true` if the Ueberauth module is available, `false` otherwise.
## Examples
iex> PhoenixKit.Users.OAuthAvailability.ueberauth_loaded?()
true
iex> PhoenixKit.Users.OAuthAvailability.ueberauth_loaded?()
false
"""
@spec ueberauth_loaded? :: boolean()
def ueberauth_loaded? do
Code.ensure_loaded?(Ueberauth) and
Code.ensure_loaded?(Ueberauth.Strategy)
end
@doc """
Gets list of configured OAuth providers.
Returns a list of provider names (as atoms) that have both:
- Credentials configured in the database
- Provider enabled in settings
Returns an empty list if Ueberauth is not loaded or no providers are properly configured.
## Examples
iex> PhoenixKit.Users.OAuthAvailability.configured_providers()
[:google, :apple]
iex> PhoenixKit.Users.OAuthAvailability.configured_providers()
[]
"""
@spec configured_providers :: [atom()]
def configured_providers do
if ueberauth_loaded?() and Code.ensure_loaded?(PhoenixKit.Settings) do
try do
providers = []
# Check Google (direct DB read to avoid cache race conditions)
providers =
if provider_enabled?(:google) and
PhoenixKit.Settings.has_oauth_credentials_direct?(:google) do
[:google | providers]
else
providers
end
# Check Apple (direct DB read to avoid cache race conditions)
providers =
if provider_enabled?(:apple) and
PhoenixKit.Settings.has_oauth_credentials_direct?(:apple) do
[:apple | providers]
else
providers
end
# Check GitHub (direct DB read to avoid cache race conditions)
providers =
if provider_enabled?(:github) and
PhoenixKit.Settings.has_oauth_credentials_direct?(:github) do
[:github | providers]
else
providers
end
# Check Facebook (direct DB read to avoid cache race conditions)
providers =
if provider_enabled?(:facebook) and
PhoenixKit.Settings.has_oauth_credentials_direct?(:facebook) do
[:facebook | providers]
else
providers
end
Enum.reverse(providers)
rescue
# Handle cases where repo is not configured (like in tests)
_ -> []
end
else
[]
end
end
@doc """
Checks if OAuth is enabled in settings.
Returns `true` if OAuth is explicitly enabled in settings, defaults to `false`.
## Examples
iex> PhoenixKit.Users.OAuthAvailability.oauth_enabled_in_settings?()
true
"""
@spec oauth_enabled_in_settings? :: boolean()
def oauth_enabled_in_settings? do
if Code.ensure_loaded?(PhoenixKit.Settings) do
try do
PhoenixKit.Settings.get_boolean_setting("oauth_enabled", false)
rescue
# Handle cases where repo is not configured (like in tests)
_ -> false
end
else
false
end
end
@doc """
Checks if a specific OAuth provider is enabled in settings.
Returns `true` if both the master OAuth switch and the individual provider are enabled.
Requires the master `oauth_enabled` setting to be true.
## Examples
iex> PhoenixKit.Users.OAuthAvailability.provider_enabled?(:google)
true
iex> PhoenixKit.Users.OAuthAvailability.provider_enabled?(:apple)
false
"""
@spec provider_enabled?(atom()) :: boolean()
def provider_enabled?(provider) when provider in [:google, :apple, :github, :facebook] do
if Code.ensure_loaded?(PhoenixKit.Settings) do
try do
master_enabled = PhoenixKit.Settings.get_boolean_setting("oauth_enabled", false)
provider_key = "oauth_#{provider}_enabled"
provider_enabled = PhoenixKit.Settings.get_boolean_setting(provider_key, false)
master_enabled and provider_enabled
rescue
# Handle cases where repo is not configured (like in tests)
_ -> false
end
else
false
end
end
def provider_enabled?(_), do: false
@doc """
Checks if OAuth is available (enabled in settings, Ueberauth loaded, and at least one provider configured).
## Examples
iex> PhoenixKit.Users.OAuthAvailability.oauth_available?()
true
iex> PhoenixKit.Users.OAuthAvailability.oauth_available?()
false
"""
@spec oauth_available? :: boolean()
def oauth_available? do
oauth_enabled_in_settings?() and ueberauth_loaded?() and configured_providers() != []
end
@doc """
Checks if a specific provider is configured.
A provider is considered configured if:
- It's enabled in settings
- It has valid credentials in the database
- Ueberauth is loaded
## Examples
iex> PhoenixKit.Users.OAuthAvailability.provider_configured?(:google)
true
iex> PhoenixKit.Users.OAuthAvailability.provider_configured?(:github)
false
"""
@spec provider_configured?(atom() | String.t()) :: boolean()
def provider_configured?(provider) when is_atom(provider) do
provider in configured_providers()
end
def provider_configured?(provider) when is_binary(provider) do
provider_atom = String.to_existing_atom(provider)
provider_configured?(provider_atom)
rescue
ArgumentError -> false
end
@doc """
Gets OAuth status information for debugging and admin interfaces.
## Examples
iex> PhoenixKit.Users.OAuthAvailability.status()
%{
enabled_in_settings: true,
ueberauth_loaded: true,
providers: [:google, :apple],
available: true
}
"""
@spec status :: map()
def status do
%{
enabled_in_settings: oauth_enabled_in_settings?(),
ueberauth_loaded: ueberauth_loaded?(),
providers: configured_providers(),
available: oauth_available?()
}
end
end