refactor(settings): unify JSONB single-field update between member-field changes
This commit is contained in:
parent
e66fb5d3d9
commit
ef70dd2935
3 changed files with 124 additions and 113 deletions
|
|
@ -19,9 +19,7 @@ defmodule Mv.Membership.Setting.Changes.UpdateSingleMemberField do
|
|||
"""
|
||||
use Ash.Resource.Change
|
||||
|
||||
alias Ash.Error.Invalid
|
||||
alias Ecto.Adapters.SQL
|
||||
require Logger
|
||||
alias Mv.Membership.Setting.Changes.JsonbResult
|
||||
|
||||
def change(changeset, _opts, _context) do
|
||||
with {:ok, field} <- get_and_validate_field(changeset),
|
||||
|
|
@ -118,62 +116,21 @@ defmodule Mv.Membership.Setting.Changes.UpdateSingleMemberField do
|
|||
|
||||
uuid_binary = Ecto.UUID.dump!(settings.id)
|
||||
|
||||
case SQL.query(Mv.Repo, sql, [field, show_in_overview, required, uuid_binary]) do
|
||||
{:ok, %{rows: [[updated_visibility, updated_required] | _]}} ->
|
||||
vis = normalize_jsonb_result(updated_visibility)
|
||||
req = normalize_jsonb_result(updated_required)
|
||||
|
||||
updated_settings = %{
|
||||
JsonbResult.run_update(
|
||||
sql: sql,
|
||||
params: [field, show_in_overview, required, uuid_binary],
|
||||
on_row: fn [updated_visibility, updated_required | _] ->
|
||||
%{
|
||||
settings
|
||||
| member_field_visibility: vis,
|
||||
member_field_required: req
|
||||
| member_field_visibility: JsonbResult.normalize(updated_visibility),
|
||||
member_field_required: JsonbResult.normalize(updated_required)
|
||||
}
|
||||
|
||||
{:ok, updated_settings}
|
||||
|
||||
{:ok, %{rows: []}} ->
|
||||
{:error,
|
||||
Invalid.exception(
|
||||
field: :member_field_required,
|
||||
message: "Settings not found"
|
||||
)}
|
||||
|
||||
{:error, error} ->
|
||||
Logger.error("Failed to atomically update member field settings: #{inspect(error)}")
|
||||
|
||||
{:error,
|
||||
Invalid.exception(
|
||||
field: :member_field_required,
|
||||
message: "Failed to update member field settings"
|
||||
)}
|
||||
end
|
||||
end,
|
||||
error_field: :member_field_required,
|
||||
not_found_message: "Settings not found",
|
||||
error_message: "Failed to update member field settings",
|
||||
log_message: "Failed to atomically update member field settings"
|
||||
)
|
||||
end)
|
||||
end
|
||||
|
||||
defp normalize_jsonb_result(updated_jsonb) do
|
||||
case updated_jsonb do
|
||||
map when is_map(map) ->
|
||||
Enum.reduce(map, %{}, fn
|
||||
{k, v}, acc when is_atom(k) -> Map.put(acc, Atom.to_string(k), v)
|
||||
{k, v}, acc -> Map.put(acc, k, v)
|
||||
end)
|
||||
|
||||
binary when is_binary(binary) ->
|
||||
case Jason.decode(binary) do
|
||||
{:ok, decoded} when is_map(decoded) ->
|
||||
decoded
|
||||
|
||||
{:ok, _} ->
|
||||
%{}
|
||||
|
||||
{:error, reason} ->
|
||||
Logger.warning("Failed to decode JSONB: #{inspect(reason)}")
|
||||
%{}
|
||||
end
|
||||
|
||||
_ ->
|
||||
Logger.warning("Unexpected JSONB format: #{inspect(updated_jsonb)}")
|
||||
%{}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue