Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 16 additions & 17 deletions lib/diffo/provider/components/instance/extension/characteristic.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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}}
Expand Down Expand Up @@ -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
Expand Down
28 changes: 13 additions & 15 deletions lib/diffo/provider/components/instance/extension/feature.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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}}
Expand All @@ -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}}
Expand Down
27 changes: 9 additions & 18 deletions lib/diffo/provider/components/instance/extension/party.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
27 changes: 9 additions & 18 deletions lib/diffo/provider/components/instance/extension/place.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
52 changes: 13 additions & 39 deletions lib/diffo/provider/components/instance/extension/relationship.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 0 additions & 4 deletions lib/diffo/validations/is_related_different.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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} ->
Expand Down
Loading