Packages
phoenix_kit
1.7.201
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/referrals.ex
defmodule PhoenixKit.Users.Referrals do
@moduledoc """
Core-side runtime bridge to the optional `phoenix_kit_referrals` package.
The referral-codes feature lives in the standalone `phoenix_kit_referrals`
module. Core has **no compile-time dependency** on it — this facade resolves
the installed module at runtime by its `PhoenixKit.Module` key (`"referrals"`)
via `PhoenixKit.ModuleRegistry` and dispatches through it.
When the package isn't installed (or doesn't export a given function) every
call degrades safely: the system reads as disabled, lookups return `nil`, and
`use_code/2` is a no-op. That lets the registration / OAuth / magic-link flows
treat referrals as optional — with the module absent, the referral field never
appears and nothing is recorded.
The function surface here mirrors exactly what the signup flows call, so those
call sites only had to swap their alias to this module.
"""
alias PhoenixKit.ModuleRegistry
@key "referrals"
# Shape core reads from `get_config/0` when no module is installed.
@disabled_config %{enabled: false, required: false}
@doc """
Referral-codes configuration map. Disabled defaults when the module is absent.
"""
def get_config do
case dispatch(:get_config, []) do
{:ok, config} -> config
:error -> @disabled_config
end
end
@doc "Whether a referrals module is installed and enabled."
def enabled? do
get_config()[:enabled] == true
end
@doc "Look up a referral code struct by its string, or `nil`."
def get_code_by_string(code_string) do
case dispatch(:get_code_by_string, [code_string]) do
{:ok, code} -> code
:error -> nil
end
end
@doc "Whether the given code is expired (`false` when the module is absent)."
def expired?(code) do
case dispatch(:expired?, [code]) do
{:ok, result} -> result
:error -> false
end
end
@doc "Whether the given code hit its usage limit (`false` when absent)."
def usage_limit_reached?(code) do
case dispatch(:usage_limit_reached?, [code]) do
{:ok, result} -> result
:error -> false
end
end
@doc """
Record a use of `code_string` by `user_uuid`.
No-op returning `{:error, :referrals_not_installed}` when the module is absent.
"""
def use_code(code_string, user_uuid) do
case dispatch(:use_code, [code_string, user_uuid]) do
{:ok, result} -> result
:error -> {:error, :referrals_not_installed}
end
end
# Resolve the installed referrals module by key and call it. Returns
# `{:ok, result}` or `:error` when nothing handles it. `apply/3` keeps the
# target out of compile-time xref, so core needs no dependency on the package.
defp dispatch(fun, args) do
with mod when not is_nil(mod) <- ModuleRegistry.get_by_key(@key),
true <- function_exported?(mod, fun, length(args)) do
{:ok, apply(mod, fun, args)}
else
_ -> :error
end
end
end