From aa5b400dbceb3061505e1056320b9e0b3029028f Mon Sep 17 00:00:00 2001 From: Matt Beanland Date: Wed, 20 May 2026 00:49:30 +0930 Subject: [PATCH] minor refactorings --- .../instance/extension/characteristic.ex | 33 ++++++------ .../components/instance/extension/feature.ex | 28 +++++----- .../components/instance/extension/party.ex | 27 ++++------ .../components/instance/extension/place.ex | 27 ++++------ .../instance/extension/relationship.ex | 52 +++++-------------- lib/diffo/validations/is_related_different.ex | 4 -- 6 files changed, 60 insertions(+), 111 deletions(-) diff --git a/lib/diffo/provider/components/instance/extension/characteristic.ex b/lib/diffo/provider/components/instance/extension/characteristic.ex index a331175..9b003df 100644 --- a/lib/diffo/provider/components/instance/extension/characteristic.ex +++ b/lib/diffo/provider/components/instance/extension/characteristic.ex @@ -21,21 +21,21 @@ defmodule Diffo.Provider.Instance.Characteristic do """ def set_characteristics_argument(changeset, declarations) when is_struct(changeset, Ash.Changeset) and is_list(declarations) do - case characteristics = create_characteristics_from_declarations(declarations, :instance) do - [] -> + case create_characteristics_from_declarations(declarations, :instance) do + {:ok, []} -> changeset - {:error, error} -> - Ash.Changeset.add_error(changeset, error) - - _ -> + {:ok, characteristics} -> characteristic_ids = Enum.map(characteristics, &Map.get(&1, :id)) Ash.Changeset.force_set_argument(changeset, :characteristics, characteristic_ids) + + {:error, error} -> + Ash.Changeset.add_error(changeset, error) end end defp create_characteristics_from_declarations(declarations, type) do - Enum.reduce_while(declarations, [], fn %{name: name, value_type: value_type}, acc -> + Enum.reduce_while(declarations, {:ok, []}, fn %{name: name, value_type: value_type}, {:ok, acc} -> try do attrs = case value_type do @@ -48,7 +48,7 @@ defmodule Diffo.Provider.Instance.Characteristic do case Provider.create_characteristic(attrs) do {:ok, result} -> - {:cont, [result | acc]} + {:cont, {:ok, [result | acc]}} {:error, error} -> {:halt, {:error, error}} @@ -148,26 +148,25 @@ defmodule Diffo.Provider.Instance.Characteristic do end) characteristics = - Enum.reduce_while(characteristic_updates, [], fn {characteristic, value}, acc -> + Enum.reduce_while(characteristic_updates, {:ok, []}, fn {characteristic, value}, {:ok, acc} -> case Provider.update_characteristic(characteristic, %{value: value}) do {:ok, characteristic} -> - {:cont, [characteristic | acc]} + {:cont, {:ok, [characteristic | acc]}} {:error, error} -> - # preserve the error {:halt, {:error, error}} end end) case characteristics do - {:error, error} -> - {:error, error} - - [] -> + {:ok, []} -> {:error, "couldn't update characteristics"} - _ -> - {:ok, Map.put(result, :characteristics, characteristics)} + {:ok, updated} -> + {:ok, Map.put(result, :characteristics, updated)} + + {:error, error} -> + {:error, error} end end end diff --git a/lib/diffo/provider/components/instance/extension/feature.ex b/lib/diffo/provider/components/instance/extension/feature.ex index 9e1c723..4aa0da3 100644 --- a/lib/diffo/provider/components/instance/extension/feature.ex +++ b/lib/diffo/provider/components/instance/extension/feature.ex @@ -21,27 +21,26 @@ defmodule Diffo.Provider.Instance.Feature do """ def set_features_argument(changeset, declarations) when is_struct(changeset, Ash.Changeset) and is_list(declarations) do - case features = create_features_from_declarations(declarations) do - [] -> + case create_features_from_declarations(declarations) do + {:ok, []} -> changeset - {:error, error} -> - Ash.Changeset.add_error(changeset, error) - - _ -> + {:ok, features} -> feature_ids = Enum.map(features, &Map.get(&1, :id)) Ash.Changeset.force_set_argument(changeset, :features, feature_ids) + + {:error, error} -> + Ash.Changeset.add_error(changeset, error) end end defp create_features_from_declarations(declarations) do Enum.reduce_while( declarations, - [], - # create any feature characteristics - fn %{name: name, is_enabled?: isEnabled, characteristics: characteristics}, acc -> + {:ok, []}, + fn %{name: name, is_enabled?: isEnabled, characteristics: characteristics}, {:ok, acc} -> characteristic_ids = - Enum.reduce_while(characteristics, [], fn %{name: name, value_type: value_type}, acc -> + Enum.reduce_while(characteristics, {:ok, []}, fn %{name: name, value_type: value_type}, {:ok, ids} -> try do attrs = case value_type do @@ -54,7 +53,7 @@ defmodule Diffo.Provider.Instance.Feature do case Provider.create_characteristic(attrs) do {:ok, result} -> - {:cont, [result.id | acc]} + {:cont, {:ok, [result.id | ids]}} {:error, error} -> {:halt, {:error, error}} @@ -71,15 +70,14 @@ defmodule Diffo.Provider.Instance.Feature do {:error, error} -> {:halt, {:error, error}} - _ -> - # create feature with feature characteristics + {:ok, ids} -> case Provider.create_feature(%{ name: name, isEnabled: isEnabled, - characteristics: characteristic_ids + characteristics: ids }) do {:ok, result} -> - {:cont, [result | acc]} + {:cont, {:ok, [result | acc]}} {:error, error} -> {:halt, {:error, error}} diff --git a/lib/diffo/provider/components/instance/extension/party.ex b/lib/diffo/provider/components/instance/extension/party.ex index 7a9b800..eb219bc 100644 --- a/lib/diffo/provider/components/instance/extension/party.ex +++ b/lib/diffo/provider/components/instance/extension/party.ex @@ -89,24 +89,15 @@ defmodule Diffo.Provider.Instance.Party do {:ok, result} _ -> - party_refs = - Enum.reduce_while(parties, [], fn %{id: id, role: role}, acc -> - case Provider.create_party_ref(%{instance_id: result.id, party_id: id, role: role}) do - {:ok, party_ref} -> - {:cont, [party_ref | acc]} - - {:error, _error} -> - {:halt, []} - end - end) - - case party_refs do - [] -> - {:error, "couldn't relate parties"} - - _ -> - # sorted = Ash.Sort.runtime_sort(party_refs, [role: :asc, created_at: :desc]) - {:ok, result |> Map.put(:parties, party_refs)} + Enum.reduce_while(parties, {:ok, []}, fn %{id: id, role: role}, {:ok, acc} -> + case Provider.create_party_ref(%{instance_id: result.id, party_id: id, role: role}) do + {:ok, party_ref} -> {:cont, {:ok, [party_ref | acc]}} + {:error, error} -> {:halt, {:error, error}} + end + end) + |> case do + {:ok, party_refs} -> {:ok, Map.put(result, :parties, party_refs)} + {:error, error} -> {:error, error} end end end diff --git a/lib/diffo/provider/components/instance/extension/place.ex b/lib/diffo/provider/components/instance/extension/place.ex index 14f7780..b55a5bf 100644 --- a/lib/diffo/provider/components/instance/extension/place.ex +++ b/lib/diffo/provider/components/instance/extension/place.ex @@ -26,24 +26,15 @@ defmodule Diffo.Provider.Instance.Place do {:ok, result} _ -> - place_refs = - Enum.reduce_while(places, [], fn %{id: id, role: role}, acc -> - case Provider.create_place_ref(%{instance_id: result.id, place_id: id, role: role}) do - {:ok, place_ref} -> - {:cont, [place_ref | acc]} - - {:error, _error} -> - {:halt, []} - end - end) - - case place_refs do - [] -> - {:error, "couldn't relate places"} - - _ -> - # sorted = Ash.Sort.runtime_sort(place_refs, [role: :asc, created_at: :desc]) - {:ok, result |> Map.put(:places, place_refs)} + Enum.reduce_while(places, {:ok, []}, fn %{id: id, role: role}, {:ok, acc} -> + case Provider.create_place_ref(%{instance_id: result.id, place_id: id, role: role}) do + {:ok, place_ref} -> {:cont, {:ok, [place_ref | acc]}} + {:error, error} -> {:halt, {:error, error}} + end + end) + |> case do + {:ok, place_refs} -> {:ok, Map.put(result, :places, place_refs)} + {:error, error} -> {:error, error} end end end diff --git a/lib/diffo/provider/components/instance/extension/relationship.ex b/lib/diffo/provider/components/instance/extension/relationship.ex index 3d9a54e..e637dd6 100644 --- a/lib/diffo/provider/components/instance/extension/relationship.ex +++ b/lib/diffo/provider/components/instance/extension/relationship.ex @@ -26,53 +26,27 @@ defmodule Diffo.Provider.Instance.Relationship do {:ok, result} _ -> - created_relationships = - Enum.reduce_while(relationships, [], fn %{ + Enum.reduce_while(relationships, :ok, fn %{ id: id, alias: name, type: type, direction: direction }, - acc -> + :ok -> + attrs = case direction do - :reverse -> - case Provider.create_relationship(%{ - source_id: id, - party_id: result.id, - alias: name, - type: type - }) do - {:ok, relationship} -> - {:cont, [relationship | acc]} - - {:error, _error} -> - {:halt, []} - end - - _ -> - # default :forward - case Provider.create_relationship(%{ - source_id: result.id, - target_id: id, - alias: name, - type: type - }) do - {:ok, relationship} -> - {:cont, [relationship | acc]} - - {:error, _error} -> - {:halt, []} - end + :reverse -> %{source_id: id, party_id: result.id, alias: name, type: type} + _ -> %{source_id: result.id, target_id: id, alias: name, type: type} end - end) - - case created_relationships do - [] -> - {:error, "couldn't relate instances"} - _ -> - # we haven't put the relationships into the result, they might be forward_relationships or reverse_relationships - {:ok, result} + case Provider.create_relationship(attrs) do + {:ok, _} -> {:cont, :ok} + {:error, error} -> {:halt, {:error, error}} + end + end) + |> case do + :ok -> {:ok, result} + {:error, error} -> {:error, error} end end end diff --git a/lib/diffo/validations/is_related_different.ex b/lib/diffo/validations/is_related_different.ex index 4b69f39..5371f8f 100644 --- a/lib/diffo/validations/is_related_different.ex +++ b/lib/diffo/validations/is_related_different.ex @@ -25,10 +25,6 @@ defmodule Diffo.Validations.IsRelatedDifferent do def validate(changeset, opts, _context) do case Ash.Changeset.fetch_argument_or_change(changeset, opts[:related_id]) do :error -> - # related_id isn't changing - :ok - {:ok, nil} - # related_id is nil :ok {:ok, related_id} ->