diff --git a/elixir/apps/domain/lib/domain/auth/identity/changeset.ex b/elixir/apps/domain/lib/domain/auth/identity/changeset.ex index 5d95eca83..4c4606999 100644 --- a/elixir/apps/domain/lib/domain/auth/identity/changeset.ex +++ b/elixir/apps/domain/lib/domain/auth/identity/changeset.ex @@ -57,6 +57,7 @@ defmodule Domain.Auth.Identity.Changeset do Actors.Actor.Changeset.sync(actor, attrs) end ) + |> put_change(:deleted_at, nil) |> changeset() end diff --git a/elixir/apps/domain/lib/domain/auth/identity/sync.ex b/elixir/apps/domain/lib/domain/auth/identity/sync.ex index 086f1bac0..0267f3157 100644 --- a/elixir/apps/domain/lib/domain/auth/identity/sync.ex +++ b/elixir/apps/domain/lib/domain/auth/identity/sync.ex @@ -55,7 +55,8 @@ defmodule Domain.Auth.Identity.Sync do end defp fetch_and_lock_provider_identities_query(provider) do - Identity.Query.by_account_id(provider.account_id) + Identity.Query.all() + |> Identity.Query.by_account_id(provider.account_id) |> Identity.Query.by_provider_id(provider.id) |> Identity.Query.lock() end @@ -66,18 +67,17 @@ defmodule Domain.Auth.Identity.Sync do identities, {provider_identifiers, [], []}, fn identity, {insert, update, delete} -> - if identity.provider_identifier in provider_identifiers do - { - insert -- [identity.provider_identifier], - [identity.provider_identifier] ++ update, - delete - } - else - { - insert -- [identity.provider_identifier], - update, - [identity.provider_identifier] ++ delete - } + insert = insert -- [identity.provider_identifier] + + cond do + identity.provider_identifier in provider_identifiers -> + {insert, [identity.provider_identifier] ++ update, delete} + + not is_nil(identity.deleted_at) -> + {insert, update, delete} + + true -> + {insert, update, [identity.provider_identifier] ++ delete} end end ) diff --git a/elixir/apps/domain/test/domain/auth_test.exs b/elixir/apps/domain/test/domain/auth_test.exs index e04cea41c..4917627f8 100644 --- a/elixir/apps/domain/test/domain/auth_test.exs +++ b/elixir/apps/domain/test/domain/auth_test.exs @@ -1570,6 +1570,82 @@ defmodule Domain.AuthTest do assert Enum.count(actor_ids_by_provider_identifier) == 2 end + test "does not re-create actors for deleted identities", %{ + account: account, + provider: provider + } do + identity = + Fixtures.Auth.create_identity( + account: account, + provider: provider, + provider_identifier: "USER_ID1", + actor: [type: :account_admin_user] + ) + |> Fixtures.Auth.delete_identity() + + attrs_list = [ + %{ + "actor" => %{ + "name" => "Brian Manifold", + "type" => "account_user" + }, + "provider_identifier" => "USER_ID1" + } + ] + + multi = sync_provider_identities_multi(provider, attrs_list) + + assert {:ok, + %{ + identities: [fetched_identity], + plan_identities: {[], ["USER_ID1"], []}, + delete_identities: [], + insert_identities: [], + actor_ids_by_provider_identifier: actor_ids_by_provider_identifier + }} = Repo.transaction(multi) + + assert fetched_identity.actor_id == identity.actor_id + assert actor_ids_by_provider_identifier == %{"USER_ID1" => identity.actor_id} + + identity = Repo.get(Auth.Identity, identity.id) + assert identity.actor_id == identity.actor_id + refute identity.deleted_at + + actor = Repo.get(Domain.Actors.Actor, identity.actor_id) + assert actor.name == "Brian Manifold" + end + + test "does not attempt to delete identities that are already deleted", %{ + account: account, + provider: provider + } do + identity = + Fixtures.Auth.create_identity( + account: account, + provider: provider, + provider_identifier: "USER_ID1", + actor: [type: :account_admin_user] + ) + |> Fixtures.Auth.delete_identity() + + attrs_list = [] + multi = sync_provider_identities_multi(provider, attrs_list) + + assert {:ok, + %{ + identities: [fetched_identity], + plan_identities: {[], [], []}, + delete_identities: [], + insert_identities: [], + actor_ids_by_provider_identifier: %{} + }} = Repo.transaction(multi) + + assert fetched_identity.id == identity.id + + identity = Repo.get(Auth.Identity, identity.id) + assert identity.deleted_at + end + test "deletes removed identities", %{account: account, provider: provider} do provider_identifiers = ["USER_ID1", "USER_ID2"]