Packages

phoenix_kit

1.4.7
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 referral_codes referral_code_usage.ex
Raw

lib/phoenix_kit/referral_codes/referral_code_usage.ex

defmodule PhoenixKit.ReferralCodeUsage do
@moduledoc """
ReferralCodeUsage schema for tracking referral code usage in PhoenixKit.
This schema records when and by whom referral codes are used.
It provides an audit trail for code usage and helps with analytics.
## Fields
- `code_id`: Foreign key to the referral code that was used
- `used_by`: User ID of the user who used the code
- `date_used`: Timestamp when the code was used
## Associations
- `referral_code`: Belongs to the referral code that was used
- `user`: Belongs to the User who used the code (via used_by field)
## Usage Examples
# Record a code usage
%ReferralCodeUsage{}
|> ReferralCodeUsage.changeset(%{
code_id: referral_code.id,
used_by: user.id
})
|> Repo.insert()
# Get all usage records for a code
from(usage in ReferralCodeUsage, where: usage.code_id == ^code_id)
|> Repo.all()
"""
use Ecto.Schema
import Ecto.Changeset
import Ecto.Query
@primary_key {:id, :id, autogenerate: true}
schema "phoenix_kit_referral_code_usage" do
field :used_by, :integer
field :date_used, :utc_datetime_usec
belongs_to :referral_code, PhoenixKit.ReferralCodes, foreign_key: :code_id
end
@doc """
Creates a changeset for referral code usage records.
Validates that all required fields are present and automatically
sets date_used on new records.
"""
def changeset(usage_record, attrs) do
usage_record
|> cast(attrs, [:code_id, :used_by, :date_used])
|> validate_required([:code_id, :used_by])
|> foreign_key_constraint(:code_id)
|> validate_number(:used_by, greater_than: 0)
|> maybe_set_date_used()
end
@doc """
Gets all usage records for a specific referral code.
Returns a query that can be executed to get usage records ordered by date_used (most recent first).
## Examples
iex> ReferralCodeUsage.for_code(code_id) |> Repo.all()
[%ReferralCodeUsage{}, ...]
"""
def for_code(code_id) do
from u in __MODULE__,
where: u.code_id == ^code_id,
order_by: [desc: u.date_used]
end
@doc """
Gets all usage records for a specific user.
Returns a query that can be executed to get usage records ordered by date_used (most recent first).
## Examples
iex> ReferralCodeUsage.for_user(user_id) |> Repo.all()
[%ReferralCodeUsage{}, ...]
"""
def for_user(user_id) do
from u in __MODULE__,
where: u.used_by == ^user_id,
order_by: [desc: u.date_used]
end
@doc """
Checks if a user has already used a specific referral code.
Returns true if the user has used the code before, false otherwise.
## Examples
iex> ReferralCodeUsage.user_used_code?(user_id, code_id)
false
"""
def user_used_code?(user_id, code_id) do
query =
from u in __MODULE__,
where: u.used_by == ^user_id and u.code_id == ^code_id,
limit: 1
PhoenixKit.RepoHelper.repo().exists?(query)
end
@doc """
Gets usage statistics for a referral code.
Returns a map with usage counts and recent activity information.
## Examples
iex> ReferralCodeUsage.get_usage_stats(code_id)
%{
total_uses: 5,
unique_users: 3,
last_used: ~U[2024-01-15 10:30:00.000000Z],
recent_users: [user_id1, user_id2]
}
"""
def get_usage_stats(code_id) do
repo = PhoenixKit.RepoHelper.repo()
base_query = from u in __MODULE__, where: u.code_id == ^code_id
total_uses = repo.aggregate(base_query, :count)
unique_users = repo.aggregate(base_query, :count, :used_by, distinct: true)
last_used_query =
from u in base_query,
order_by: [desc: u.date_used],
limit: 1,
select: u.date_used
last_used = repo.one(last_used_query)
recent_users_query =
from u in base_query,
order_by: [desc: u.date_used],
limit: 5,
select: u.used_by
recent_users = repo.all(recent_users_query)
%{
total_uses: total_uses,
unique_users: unique_users,
last_used: last_used,
recent_users: recent_users
}
end
# Private helper to set date_used on new records
defp maybe_set_date_used(changeset) do
case get_field(changeset, :id) do
nil -> put_change(changeset, :date_used, DateTime.utc_now())
_id -> changeset
end
end
end