55 lines
1.5 KiB
Elixir
55 lines
1.5 KiB
Elixir
defmodule Mv.Membership.Helpers.VisibilityConfig do
|
|
@moduledoc """
|
|
Helper functions for normalizing member field visibility configuration.
|
|
|
|
Handles conversion between string keys (from JSONB) and atom keys (Elixir convention).
|
|
JSONB in PostgreSQL converts atom keys to string keys when storing.
|
|
This module provides functions to normalize these back to atoms for Elixir usage.
|
|
"""
|
|
|
|
@doc """
|
|
Normalizes visibility config map keys from strings to atoms.
|
|
|
|
JSONB in PostgreSQL converts atom keys to string keys when storing.
|
|
This function converts them back to atoms for Elixir usage.
|
|
|
|
## Parameters
|
|
|
|
- `config` - A map with either string or atom keys
|
|
|
|
## Returns
|
|
|
|
A map with atom keys (where possible)
|
|
|
|
## Examples
|
|
|
|
iex> normalize(%{"first_name" => true, "email" => false})
|
|
%{first_name: true, email: false}
|
|
|
|
iex> normalize(%{first_name: true, email: false})
|
|
%{first_name: true, email: false}
|
|
|
|
iex> normalize(%{"invalid_field" => true})
|
|
%{}
|
|
"""
|
|
@spec normalize(map()) :: map()
|
|
def normalize(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
|
|
|
|
def normalize(_), do: %{}
|
|
end
|