Packages

phoenix_kit

1.7.22
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 posts schemas post_group_assignment.ex
Raw

lib/modules/posts/schemas/post_group_assignment.ex

defmodule PhoenixKit.Modules.Posts.PostGroupAssignment do
@moduledoc """
Junction schema for post-group assignments.
Many-to-many relationship between posts and groups. A post can be in multiple groups,
and a group can contain multiple posts. Position allows manual ordering within each group.
## Fields
- `post_id` - Reference to the post
- `group_id` - Reference to the group
- `position` - Display order within the group (0, 1, 2, etc.)
## Examples
# First post in group
%PostGroupAssignment{
post_id: "018e3c4a-9f6b-7890-abcd-ef1234567890",
group_id: "018e3c4a-1234-5678-abcd-ef1234567890",
position: 0
}
# Second post in group
%PostGroupAssignment{
post_id: "018e3c4a-5678-1234-abcd-ef1234567890",
group_id: "018e3c4a-1234-5678-abcd-ef1234567890",
position: 1
}
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key false
@type t :: %__MODULE__{
post_id: UUIDv7.t(),
group_id: UUIDv7.t(),
position: integer(),
post: PhoenixKit.Modules.Posts.Post.t() | Ecto.Association.NotLoaded.t(),
group: PhoenixKit.Modules.Posts.PostGroup.t() | Ecto.Association.NotLoaded.t(),
inserted_at: NaiveDateTime.t() | nil,
updated_at: NaiveDateTime.t() | nil
}
schema "phoenix_kit_post_group_assignments" do
field :position, :integer, default: 0
belongs_to :post, PhoenixKit.Modules.Posts.Post, type: UUIDv7, primary_key: true
belongs_to :group, PhoenixKit.Modules.Posts.PostGroup, type: UUIDv7, primary_key: true
timestamps(type: :naive_datetime)
end
@doc """
Changeset for creating a post-group assignment.
## Required Fields
- `post_id` - Reference to post
- `group_id` - Reference to group
## Validation Rules
- Position must be >= 0
- Unique constraint on (post_id, group_id) - post can't be in same group twice
"""
def changeset(assignment, attrs) do
assignment
|> cast(attrs, [:post_id, :group_id, :position])
|> validate_required([:post_id, :group_id])
|> validate_number(:position, greater_than_or_equal_to: 0)
|> foreign_key_constraint(:post_id)
|> foreign_key_constraint(:group_id)
|> unique_constraint([:post_id, :group_id],
name: :phoenix_kit_post_group_assignments_post_id_group_id_index,
message: "post already in this group"
)
end
end