refactor: fix review issues - member_count aggregate, migration down, docs, actor handling
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Simon 2026-01-27 17:09:07 +01:00
parent fc8306cfee
commit e92c98b559
Signed by: simon
GPG key ID: 40E7A58C4AA1EDB2
3 changed files with 37 additions and 32 deletions

View file

@ -24,11 +24,18 @@ defmodule Mv.Membership.MemberGroup do
## Examples
# Add member to group
MemberGroup.create!(%{member_id: member.id, group_id: group.id})
{:ok, member_group} =
Membership.create_member_group(%{member_id: member.id, group_id: group.id})
# Remove member from group
member_group = MemberGroup.get_by_member_and_group!(member.id, group.id)
MemberGroup.destroy!(member_group)
{:ok, [member_group]} =
Ash.read(
Mv.Membership.MemberGroup
|> Ash.Query.filter(member_id == ^member.id and group_id == ^group.id),
domain: Mv.Membership
)
:ok = Membership.destroy_member_group(member_group)
"""
use Ash.Resource,
domain: Mv.Membership,
@ -54,13 +61,13 @@ defmodule Mv.Membership.MemberGroup do
validate present(:group_id)
# Prevent duplicate associations
validate fn changeset, _context ->
validate fn changeset, context ->
member_id = Ash.Changeset.get_attribute(changeset, :member_id)
group_id = Ash.Changeset.get_attribute(changeset, :group_id)
current_id = Ash.Changeset.get_attribute(changeset, :id)
if member_id && group_id do
check_duplicate_association(member_id, group_id, current_id)
check_duplicate_association(member_id, group_id, current_id, context)
else
:ok
end
@ -96,17 +103,24 @@ defmodule Mv.Membership.MemberGroup do
end
# Private helper function to check for duplicate associations
defp check_duplicate_association(member_id, group_id, exclude_id) do
# Uses context actor if available (respects policies), falls back to system actor
defp check_duplicate_association(member_id, group_id, exclude_id, context) do
alias Mv.Helpers
alias Mv.Helpers.SystemActor
# Use context actor if available (respects user permissions), otherwise fall back to system actor
actor =
case context do
%{actor: actor} when not is_nil(actor) -> actor
_ -> SystemActor.get_system_actor()
end
query =
Mv.Membership.MemberGroup
|> Ash.Query.filter(member_id == ^member_id and group_id == ^group_id)
|> maybe_exclude_id(exclude_id)
system_actor = SystemActor.get_system_actor()
opts = Helpers.ash_actor_opts(system_actor)
opts = Helpers.ash_actor_opts(actor)
case Ash.read(query, opts) do
{:ok, []} ->