Packages

phoenix_kit

1.7.65
1.7.210 1.7.209 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 modules connections connection_history.ex
Raw

lib/modules/connections/connection_history.ex

defmodule PhoenixKit.Modules.Connections.ConnectionHistory do
@moduledoc """
Schema for connection activity history.
Records all connection-related events for auditing and activity feeds.
The main `Connection` table stores only current state per user pair,
while this table preserves the complete history of actions.
## Actions
- `"requested"` - User requested a connection
- `"accepted"` - User accepted a connection request
- `"rejected"` - User rejected a connection request
- `"removed"` - User removed an existing connection
## Fields
- `user_a_uuid` / `user_b_uuid` - The two users involved (stored with lower UUID first for consistency)
- `actor_uuid` - The user who performed this action
"""
use Ecto.Schema
import Ecto.Changeset
alias PhoenixKit.Utils.Date, as: UtilsDate
@primary_key {:uuid, UUIDv7, autogenerate: true}
@foreign_key_type UUIDv7
schema "phoenix_kit_user_connections_history" do
belongs_to :user_a, PhoenixKit.Users.Auth.User,
foreign_key: :user_a_uuid,
references: :uuid,
type: UUIDv7
belongs_to :user_b, PhoenixKit.Users.Auth.User,
foreign_key: :user_b_uuid,
references: :uuid,
type: UUIDv7
belongs_to :actor, PhoenixKit.Users.Auth.User,
foreign_key: :actor_uuid,
references: :uuid,
type: UUIDv7
field :action, :string
field :inserted_at, :utc_datetime
end
@actions ~w(requested accepted rejected removed)
@doc """
Creates a changeset for a connection history record.
The user_a_uuid and user_b_uuid are automatically normalized so that
the lower UUID is always stored as user_a_uuid for consistent querying.
"""
def changeset(history, attrs) do
attrs = normalize_user_uuids(attrs)
history
|> cast(attrs, [
:user_a_uuid,
:user_b_uuid,
:actor_uuid,
:action
])
|> validate_required([:user_a_uuid, :user_b_uuid, :actor_uuid, :action])
|> validate_inclusion(:action, @actions)
|> put_timestamp()
|> foreign_key_constraint(:user_a_uuid)
|> foreign_key_constraint(:user_b_uuid)
|> foreign_key_constraint(:actor_uuid)
end
# Normalize user UUIDs so user_a_uuid < user_b_uuid for consistent storage
defp normalize_user_uuids(%{user_a_uuid: a_uuid, user_b_uuid: b_uuid} = attrs)
when is_binary(a_uuid) and is_binary(b_uuid) and a_uuid > b_uuid do
%{attrs | user_a_uuid: b_uuid, user_b_uuid: a_uuid}
end
defp normalize_user_uuids(attrs), do: attrs
defp put_timestamp(changeset) do
put_change(
changeset,
:inserted_at,
UtilsDate.utc_now()
)
end
end