Packages

phoenix_kit

1.6.18
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 role_assignment.ex
Raw

lib/phoenix_kit/users/role_assignment.ex

defmodule PhoenixKit.Users.RoleAssignment do
@moduledoc """
Role assignment schema for PhoenixKit authorization system.
This schema represents the many-to-many relationship between users and roles,
with additional metadata about when and by whom the role was assigned.
## Fields
- `user_id`: Reference to the user who has the role
- `role_id`: Reference to the role being assigned
- `assigned_by`: Reference to the user who assigned this role (can be nil for system assignments)
- `assigned_at`: Timestamp when the role was assigned
## Features
- Tracks role assignment history
- Supports bulk role management
- Audit trail for security purposes
- Direct deletion for role removal
"""
use Ecto.Schema
import Ecto.Changeset
@type t :: %__MODULE__{
id: integer() | nil,
user_id: integer(),
role_id: integer(),
assigned_by: integer() | nil,
assigned_at: NaiveDateTime.t(),
inserted_at: NaiveDateTime.t()
}
schema "phoenix_kit_user_role_assignments" do
belongs_to :user, PhoenixKit.Users.Auth.User
belongs_to :role, PhoenixKit.Users.Role
belongs_to :assigned_by_user, PhoenixKit.Users.Auth.User, foreign_key: :assigned_by
field :assigned_at, :naive_datetime
timestamps(updated_at: false)
end
@doc """
A role assignment changeset for creating role assignments.
## Parameters
- `role_assignment`: The role assignment struct to modify
- `attrs`: Attributes to update
## Examples
iex> changeset(%RoleAssignment{}, %{user_id: 1, role_id: 2})
%Ecto.Changeset{valid?: true}
iex> changeset(%RoleAssignment{}, %{})
%Ecto.Changeset{valid?: false}
"""
def changeset(role_assignment, attrs) do
role_assignment
|> cast(attrs, [:user_id, :role_id, :assigned_by, :assigned_at])
|> validate_required([:user_id, :role_id])
|> put_assigned_at()
|> unique_constraint([:user_id, :role_id],
name: :phoenix_kit_user_role_assignments_user_id_role_id_index,
message: "user already has this role"
)
|> foreign_key_constraint(:user_id)
|> foreign_key_constraint(:role_id)
|> foreign_key_constraint(:assigned_by)
end
# Set assigned_at to current time if not provided
defp put_assigned_at(changeset) do
case get_field(changeset, :assigned_at) do
nil ->
put_change(
changeset,
:assigned_at,
NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
)
_ ->
changeset
end
end
end