refactor: fix review issues - member_count aggregate, migration down, docs, actor handling
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
fc8306cfee
commit
e92c98b559
3 changed files with 37 additions and 32 deletions
|
|
@ -67,12 +67,12 @@ defmodule Mv.Membership.Group do
|
|||
validate present(:name)
|
||||
|
||||
# Case-insensitive name uniqueness validation
|
||||
validate fn changeset, _context ->
|
||||
validate fn changeset, context ->
|
||||
name = Ash.Changeset.get_attribute(changeset, :name)
|
||||
current_id = Ash.Changeset.get_attribute(changeset, :id)
|
||||
|
||||
if name do
|
||||
check_name_uniqueness(name, current_id)
|
||||
check_name_uniqueness(name, current_id, context)
|
||||
else
|
||||
:ok
|
||||
end
|
||||
|
|
@ -115,24 +115,8 @@ defmodule Mv.Membership.Group do
|
|||
many_to_many :members, Mv.Membership.Member, through: Mv.Membership.MemberGroup
|
||||
end
|
||||
|
||||
calculations do
|
||||
calculate :member_count, :integer do
|
||||
description "Number of members in this group"
|
||||
|
||||
calculation fn [group], _context ->
|
||||
system_actor = SystemActor.get_system_actor()
|
||||
opts = Helpers.ash_actor_opts(system_actor)
|
||||
|
||||
query =
|
||||
Mv.Membership.MemberGroup
|
||||
|> Ash.Query.filter(group_id == ^group.id)
|
||||
|
||||
case Ash.read(query, opts) do
|
||||
{:ok, member_groups} -> [length(member_groups)]
|
||||
{:error, _} -> [0]
|
||||
end
|
||||
end
|
||||
end
|
||||
aggregates do
|
||||
count :member_count, :member_groups
|
||||
end
|
||||
|
||||
identities do
|
||||
|
|
@ -140,14 +124,21 @@ defmodule Mv.Membership.Group do
|
|||
end
|
||||
|
||||
# Private helper function for case-insensitive name uniqueness check
|
||||
defp check_name_uniqueness(name, exclude_id) do
|
||||
# Uses context actor if available (respects policies), falls back to system actor
|
||||
defp check_name_uniqueness(name, exclude_id, context) do
|
||||
# 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.Group
|
||||
|> Ash.Query.filter(fragment("LOWER(?) = LOWER(?)", name, ^name))
|
||||
|> 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, []} ->
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue