feat: add atomic update for single member field visibility

This commit is contained in:
carla 2026-01-08 11:28:27 +01:00
parent 9af7381843
commit 4a1042ab1a
3 changed files with 177 additions and 24 deletions

View file

@ -40,6 +40,8 @@ defmodule Mv.Membership.Member do
import Ash.Expr
require Logger
alias Mv.Membership.Helpers.VisibilityConfig
# Module constants
@member_search_limit 10
@ -607,7 +609,7 @@ defmodule Mv.Membership.Member do
{:ok, settings} ->
visibility_config = settings.member_field_visibility || %{}
# Normalize map keys to atoms (JSONB may return string keys)
normalized_config = normalize_visibility_config(visibility_config)
normalized_config = VisibilityConfig.normalize(visibility_config)
# Get value from normalized config, use field-specific default
Map.get(normalized_config, field, default_visibility)
@ -959,29 +961,6 @@ defmodule Mv.Membership.Member do
defp error_type(error) when is_atom(error), do: error
defp error_type(_), do: :unknown
# Normalizes visibility config map keys from strings to atoms.
# JSONB in PostgreSQL converts atom keys to string keys when storing.
defp normalize_visibility_config(config) when is_map(config) do
Enum.reduce(config, %{}, fn
{key, value}, acc when is_atom(key) ->
Map.put(acc, key, value)
{key, value}, acc when is_binary(key) ->
try do
atom_key = String.to_existing_atom(key)
Map.put(acc, atom_key, value)
rescue
ArgumentError ->
acc
end
_, acc ->
acc
end)
end
defp normalize_visibility_config(_), do: %{}
@doc """
Performs fuzzy search on members using PostgreSQL trigram similarity.