Packages
phoenix_kit
1.7.59
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/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_uuid` - Reference to the post
- `group_uuid` - Reference to the group
- `position` - Display order within the group (0, 1, 2, etc.)
## Examples
# First post in group
%PostGroupAssignment{
post_uuid: "018e3c4a-9f6b-7890-abcd-ef1234567890",
group_uuid: "018e3c4a-1234-5678-abcd-ef1234567890",
position: 0
}
# Second post in group
%PostGroupAssignment{
post_uuid: "018e3c4a-5678-1234-abcd-ef1234567890",
group_uuid: "018e3c4a-1234-5678-abcd-ef1234567890",
position: 1
}
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key false
@type t :: %__MODULE__{
post_uuid: UUIDv7.t(),
group_uuid: 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: DateTime.t() | nil,
updated_at: DateTime.t() | nil
}
schema "phoenix_kit_post_group_assignments" do
field :position, :integer, default: 0
belongs_to :post, PhoenixKit.Modules.Posts.Post,
foreign_key: :post_uuid,
references: :uuid,
type: UUIDv7,
primary_key: true
belongs_to :group, PhoenixKit.Modules.Posts.PostGroup,
foreign_key: :group_uuid,
references: :uuid,
type: UUIDv7,
primary_key: true
timestamps(type: :utc_datetime)
end
@doc """
Changeset for creating a post-group assignment.
## Required Fields
- `post_uuid` - Reference to post
- `group_uuid` - Reference to group
## Validation Rules
- Position must be >= 0
- Unique constraint on (post_uuid, group_uuid) - post can't be in same group twice
"""
def changeset(assignment, attrs) do
assignment
|> cast(attrs, [:post_uuid, :group_uuid, :position])
|> validate_required([:post_uuid, :group_uuid])
|> validate_number(:position, greater_than_or_equal_to: 0)
|> foreign_key_constraint(:post_uuid)
|> foreign_key_constraint(:group_uuid)
|> unique_constraint([:post_uuid, :group_uuid],
name: :phoenix_kit_post_group_assignments_post_uuid_group_uuid_index,
message: "post already in this group"
)
end
end