refactor(portal): remove created_by_<identity/actor> columns (#9306)

Why:

* Now that we have started using the `created_by_subject` field on
various tables, we no longer need to keep the
`created_by_<identity/actor>` fields. This will help remove a foreign
key reference and will be one step closer to allowing us to hard delete
data rather than soft deleting all data in order to keep foreign key
references like these.
This commit is contained in:
Brian Manifold
2025-05-30 14:06:35 -07:00
committed by GitHub
parent 889c1a971c
commit a51b35a6b4
50 changed files with 129 additions and 283 deletions

View File

@@ -42,8 +42,7 @@ defmodule API.ClientJSON do
firebase_installation_id: client.firebase_installation_id,
verified_at: client.verified_at,
verified_by: client.verified_by,
verified_by_actor_id: client.verified_by_actor_id,
verified_by_identity_id: client.verified_by_identity_id,
verified_by_subject: client.verified_by_subject,
created_at: client.inserted_at,
updated_at: client.updated_at
}

View File

@@ -85,13 +85,9 @@ defmodule API.Schemas.Client do
description: "Client verification method",
enum: [:system, :actor, :identity]
},
verified_by_actor_id: %Schema{
type: :string,
description: "Actor ID who verified the client"
},
verified_by_identity_id: %Schema{
type: :string,
description: "Identity ID who verified the client"
verified_by_subject: %Schema{
type: :object,
description: "Actor Name and/or Identity email who verified the client"
},
created_at: %Schema{
type: :string,
@@ -220,8 +216,7 @@ defmodule API.Schemas.Client do
"firebase_installation_id" => nil,
"verified_at" => "2025-01-01T00:00:00Z",
"verified_by" => "identity",
"verified_by_actor_id" => nil,
"verified_by_identity_id" => "6ecc106b-75c1-48a5-846c-14782180c1ff",
"verified_by_subject" => %{"name" => "Foo", "email" => "foo@bar.com"},
"created_at" => "2025-01-01T00:00:00Z",
"updated_at" => "2025-01-01T00:00:00Z"
}
@@ -266,8 +261,7 @@ defmodule API.Schemas.Client do
"firebase_installation_id" => nil,
"verified_at" => "2025-01-01T00:00:00Z",
"verified_by" => "identity",
"verified_by_actor_id" => nil,
"verified_by_identity_id" => "6ecc106b-75c1-48a5-846c-14782180c1ff",
"verified_by_subject" => %{"name" => "Foo", "email" => "foo@bar.com"},
"created_at" => "2025-01-01T00:00:00Z",
"updated_at" => "2025-01-01T00:00:00Z"
},
@@ -293,8 +287,7 @@ defmodule API.Schemas.Client do
"firebase_installation_id" => nil,
"verified_at" => nil,
"verified_by" => nil,
"verified_by_actor_id" => nil,
"verified_by_identity_id" => nil,
"verified_by_subject" => %{"name" => "Foo", "email" => "foo@bar.com"},
"created_at" => "2025-01-01T00:00:00Z",
"updated_at" => "2025-01-01T00:00:00Z"
}

View File

@@ -152,8 +152,7 @@ defmodule API.ClientControllerTest do
"updated_at" => client.updated_at && DateTime.to_iso8601(client.updated_at),
"verified_at" => client.verified_at && DateTime.to_iso8601(client.verified_at),
"verified_by" => client.verified_by,
"verified_by_actor_id" => client.verified_by_actor_id,
"verified_by_identity_id" => client.verified_by_identity_id
"verified_by_subject" => client.verified_by_subject
}
}
end
@@ -210,8 +209,7 @@ defmodule API.ClientControllerTest do
assert resp["data"]["id"] == client.id
assert resp["data"]["verified_at"]
assert resp["data"]["verified_by"]
assert resp["data"]["verified_by_actor_id"]
refute resp["data"]["verified_by_identity_id"]
assert resp["data"]["verified_by_subject"]
end
end
@@ -233,8 +231,7 @@ defmodule API.ClientControllerTest do
assert resp["data"]["id"] == client.id
refute resp["data"]["verified_at"]
refute resp["data"]["verified_by"]
refute resp["data"]["verified_by_actor_id"]
refute resp["data"]["verified_by_identity_id"]
refute resp["data"]["verified_by_subject"]
end
end
@@ -285,8 +282,7 @@ defmodule API.ClientControllerTest do
"updated_at" => client.updated_at && DateTime.to_iso8601(client.updated_at),
"verified_at" => client.verified_at && DateTime.to_iso8601(client.verified_at),
"verified_by" => client.verified_by,
"verified_by_actor_id" => client.verified_by_actor_id,
"verified_by_identity_id" => client.verified_by_identity_id
"verified_by_subject" => client.verified_by_subject
}
}

View File

@@ -22,8 +22,6 @@ defmodule Domain.Actors.Group do
field :created_by, Ecto.Enum, values: ~w[actor identity provider system]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
belongs_to :account, Domain.Accounts.Account

View File

@@ -22,8 +22,6 @@ defmodule Domain.Auth.Identity do
field :created_by, Ecto.Enum, values: ~w[system provider identity]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
has_many :clients, Domain.Clients.Client, where: [deleted_at: nil]

View File

@@ -19,8 +19,6 @@ defmodule Domain.Auth.Provider do
field :created_by, Ecto.Enum, values: ~w[system identity actor]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
field :last_syncs_failed, :integer
field :last_sync_error, :string

View File

@@ -201,14 +201,6 @@ defmodule Domain.Clients do
with: &Client.Changeset.verify(&1, subject),
preload: [:online?]
)
|> case do
{:ok, client} ->
client = Repo.preload(client, [:verified_by_actor, :verified_by_identity])
{:ok, client}
{:error, reason} ->
{:error, reason}
end
end
end

View File

@@ -37,8 +37,6 @@ defmodule Domain.Clients.Client do
field :verified_at, :utc_datetime_usec
field :verified_by, Ecto.Enum, values: [:system, :actor, :identity]
field :verified_by_subject, :map
belongs_to :verified_by_actor, Domain.Actors.Actor
belongs_to :verified_by_identity, Domain.Auth.Identity
field :deleted_at, :utc_datetime_usec
timestamps()

View File

@@ -79,7 +79,7 @@ defmodule Domain.Clients.Client.Changeset do
clients,
clients.verified_by
),
verified_by_actor_id:
verified_by_subject:
fragment(
"""
CASE WHEN (EXCLUDED.device_serial = ?.device_serial OR ?.device_serial IS NULL)
@@ -98,28 +98,7 @@ defmodule Domain.Clients.Client.Changeset do
clients,
clients,
clients,
clients.verified_by_actor_id
),
verified_by_identity_id:
fragment(
"""
CASE WHEN (EXCLUDED.device_serial = ?.device_serial OR ?.device_serial IS NULL)
AND (EXCLUDED.device_uuid = ?.device_uuid OR ?.device_uuid IS NULL)
AND (EXCLUDED.identifier_for_vendor = ?.identifier_for_vendor OR ?.identifier_for_vendor IS NULL)
AND (EXCLUDED.firebase_installation_id = ?.firebase_installation_id OR ?.firebase_installation_id IS NULL)
THEN ?
ELSE NULL
END
""",
clients,
clients,
clients,
clients,
clients,
clients,
clients,
clients,
clients.verified_by_identity_id
clients.verified_by_subject
)
]
)
@@ -181,8 +160,6 @@ defmodule Domain.Clients.Client.Changeset do
|> change()
|> put_change(:verified_at, nil)
|> put_change(:verified_by, nil)
|> put_change(:verified_by_actor_id, nil)
|> put_change(:verified_by_identity_id, nil)
|> put_change(:verified_by_subject, nil)
end

View File

@@ -17,8 +17,6 @@ defmodule Domain.Gateways.Group do
field :created_by, Ecto.Enum, values: ~w[actor identity system]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
field :deleted_at, :utc_datetime_usec
timestamps()

View File

@@ -14,8 +14,6 @@ defmodule Domain.Policies.Policy do
field :created_by, Ecto.Enum, values: ~w[actor identity]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
belongs_to :replaced_by_policy, Domain.Policies.Policy
has_one :replaces_policy, Domain.Policies.Policy, foreign_key: :replaced_by_policy_id

View File

@@ -10,8 +10,6 @@ defmodule Domain.Relays.Group do
field :created_by, Ecto.Enum, values: ~w[system identity]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
field :deleted_at, :utc_datetime_usec
timestamps()

View File

@@ -163,7 +163,6 @@ defmodule Domain.Repo.Changeset do
changeset
|> put_default_value(field, :actor)
|> put_default_value(:"#{field}_subject", %{"name" => subject.actor.name, "email" => nil})
|> put_default_value(:"#{field}_actor_id", subject.actor.id)
end
def put_subject_trail(changeset, field, %Domain.Auth.Subject{} = subject) do
@@ -173,15 +172,11 @@ defmodule Domain.Repo.Changeset do
"name" => subject.actor.name,
"email" => subject.identity.email
})
|> put_default_value(:"#{field}_actor_id", subject.actor.id)
|> put_default_value(:"#{field}_identity_id", subject.identity.id)
end
def reset_created_by(changeset) do
changeset
|> put_change(:created_by, nil)
|> put_change(:created_by_identity_id, nil)
|> put_change(:created_by_actor_id, nil)
|> put_change(:created_by_subject, nil)
end

View File

@@ -8,8 +8,6 @@ defmodule Domain.Resources.Connection do
field :created_by, Ecto.Enum, values: ~w[actor identity system]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
belongs_to :account, Domain.Accounts.Account
end

View File

@@ -30,8 +30,6 @@ defmodule Domain.Resources.Resource do
field :created_by, Ecto.Enum, values: ~w[identity actor system]a
field :created_by_subject, :map
belongs_to :created_by_actor, Domain.Actors.Actor
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :replaced_by_resource, Domain.Resources.Resource
has_one :replaces_resource, Domain.Resources.Resource, foreign_key: :replaced_by_resource_id

View File

@@ -45,8 +45,6 @@ defmodule Domain.Tokens.Token do
# Maybe this is not needed and they should be in the join tables (eg. relay_group_tokens)
field :created_by, Ecto.Enum, values: ~w[actor identity system]a
field :created_by_subject, :map
belongs_to :created_by_identity, Domain.Auth.Identity
belongs_to :created_by_actor, Domain.Actors.Actor
field :created_by_user_agent, :string
field :created_by_remote_ip, Domain.Types.IP

View File

@@ -0,0 +1,28 @@
defmodule Domain.Repo.Migrations.UpdateVerifiedByConstraint do
use Ecto.Migration
def change do
execute("""
ALTER TABLE clients
DROP CONSTRAINT IF EXISTS verified_fields_set
""")
create(
constraint(:clients, :verified_fields_set,
check: """
(
verified_at IS NULL
AND verified_by IS NULL
AND verified_by_subject IS NULL
)
OR
(
verified_at IS NOT NULL
AND verified_by IS NOT NULL
AND verified_by_subject IS NOT NULL
)
"""
)
)
end
end

View File

@@ -780,7 +780,6 @@ defmodule Domain.AuthTest do
assert provider.created_by == :system
assert provider.created_by_subject == %{"email" => nil, "name" => "System"}
assert is_nil(provider.created_by_identity_id)
assert is_nil(provider.disabled_at)
assert is_nil(provider.deleted_at)
@@ -842,7 +841,6 @@ defmodule Domain.AuthTest do
assert {:ok, provider} = create_provider(account, attrs, subject)
assert provider.created_by == :identity
assert provider.created_by_identity_id == subject.identity.id
assert provider.created_by_subject == %{
"email" => subject.identity.email,
@@ -4094,7 +4092,6 @@ defmodule Domain.AuthTest do
refute token.identity_id
assert token.actor_id == actor.id
assert token.created_by == :identity
assert token.created_by_identity_id == subject.identity.id
assert token.created_by_user_agent == context.user_agent
assert token.created_by_remote_ip.address == context.remote_ip
@@ -4208,7 +4205,6 @@ defmodule Domain.AuthTest do
refute token.identity_id
assert token.actor_id == actor.id
assert token.created_by == :identity
assert token.created_by_identity_id == subject.identity.id
assert token.created_by_user_agent == context.user_agent
assert token.created_by_remote_ip.address == context.remote_ip

View File

@@ -469,7 +469,7 @@ defmodule Domain.ClientsTest do
Fixtures.Auth.create_subject(account: account, identity: previous_identity)
client = Fixtures.Clients.create_client(subject: previous_subject)
client = Fixtures.Clients.verify_client(client)
client = Fixtures.Clients.verify_client(client, previous_subject)
attrs =
Fixtures.Clients.client_attrs(
@@ -528,8 +528,11 @@ defmodule Domain.ClientsTest do
assert updated_client.verified_at == client.verified_at
assert updated_client.verified_by == client.verified_by
assert updated_client.verified_by_actor_id == client.verified_by_actor_id
assert updated_client.verified_by_identity_id == client.verified_by_identity_id
assert updated_client.verified_by_subject == %{
"email" => previous_subject.identity.email,
"name" => previous_subject.actor.name
}
assert updated_client.device_serial == client.device_serial
assert updated_client.device_uuid == client.device_uuid
@@ -602,8 +605,7 @@ defmodule Domain.ClientsTest do
refute created_client.verified_at
refute created_client.verified_by
refute created_client.verified_by_actor_id
refute created_client.verified_by_identity_id
refute created_client.verified_by_subject
assert created_client.device_serial == attrs.device_serial
assert created_client.device_uuid == attrs.device_uuid
@@ -653,14 +655,14 @@ defmodule Domain.ClientsTest do
)
attrs = Map.put(attrs, field, Ecto.UUID.generate())
assert {:ok, updated_client} = upsert_client(attrs, subject)
assert updated_client.id == client.id
assert Map.get(updated_client, field) == Map.get(attrs, field)
assert is_nil(updated_client.verified_at)
assert is_nil(updated_client.verified_by)
assert is_nil(updated_client.verified_by_actor_id)
assert is_nil(updated_client.verified_by_identity_id)
assert is_nil(updated_client.verified_by_subject)
end
end
@@ -694,7 +696,7 @@ defmodule Domain.ClientsTest do
:firebase_installation_id
] do
client = Fixtures.Clients.create_client(subject: previous_subject)
client = Fixtures.Clients.verify_client(client)
client = Fixtures.Clients.verify_client(client, previous_subject)
attrs =
Fixtures.Clients.client_attrs(
@@ -712,8 +714,7 @@ defmodule Domain.ClientsTest do
assert is_nil(updated_client.verified_at)
assert is_nil(updated_client.verified_by)
assert is_nil(updated_client.verified_by_actor_id)
assert is_nil(updated_client.verified_by_identity_id)
assert is_nil(updated_client.verified_by_subject)
end
end
@@ -762,8 +763,7 @@ defmodule Domain.ClientsTest do
refute is_nil(updated_client.verified_at)
refute is_nil(updated_client.verified_by)
refute is_nil(updated_client.verified_by_actor_id)
refute is_nil(updated_client.verified_by_identity_id)
refute is_nil(updated_client.verified_by_subject)
end
test "does not reserve additional addresses on update", %{
@@ -1014,8 +1014,11 @@ defmodule Domain.ClientsTest do
assert {:ok, client} = verify_client(client, subject)
assert client.verified_at
assert client.verified_by == :identity
assert client.verified_by_actor_id == subject.actor.id
assert client.verified_by_identity_id == subject.identity.id
assert client.verified_by_subject == %{
"email" => subject.identity.email,
"name" => actor.name
}
assert {:ok, double_verified_client} = verify_client(client, subject)
assert double_verified_client.verified_at == client.verified_at
@@ -1053,8 +1056,7 @@ defmodule Domain.ClientsTest do
assert is_nil(client.verified_at)
assert is_nil(client.verified_by)
assert is_nil(client.verified_by_actor_id)
assert is_nil(client.verified_by_identity_id)
assert is_nil(client.verified_by_subject)
end
test "expires flows for the unverified client", %{

View File

@@ -214,7 +214,6 @@ defmodule Domain.GatewaysTest do
assert group.name == "foo"
assert group.created_by == :identity
assert group.created_by_identity_id == subject.identity.id
assert group.created_by_subject == %{
"name" => subject.actor.name,
@@ -469,7 +468,6 @@ defmodule Domain.GatewaysTest do
assert token.account_id == account.id
assert token.gateway_group_id == group.id
assert token.created_by == :identity
assert token.created_by_identity_id == subject.identity.id
assert token.created_by_user_agent == context.user_agent
assert token.created_by_remote_ip.address == context.remote_ip

View File

@@ -173,7 +173,6 @@ defmodule Domain.RelaysTest do
assert group.name == attrs.name
assert group.created_by == :identity
assert group.created_by_identity_id == subject.identity.id
assert group.created_by_subject == %{
"name" => subject.actor.name,
@@ -225,7 +224,6 @@ defmodule Domain.RelaysTest do
assert group.name == attrs.name
assert group.created_by == :system
assert is_nil(group.created_by_identity_id)
assert group.created_by_subject == %{"name" => "System", "email" => nil}
end
end
@@ -436,7 +434,12 @@ defmodule Domain.RelaysTest do
assert token.account_id == account.id
assert token.relay_group_id == group.id
assert token.created_by == :identity
assert token.created_by_identity_id == subject.identity.id
assert token.created_by_subject == %{
"email" => subject.identity.email,
"name" => subject.actor.name
}
assert token.created_by_user_agent == subject.context.user_agent
assert token.created_by_remote_ip.address == subject.context.remote_ip
refute token.expires_at
@@ -453,7 +456,7 @@ defmodule Domain.RelaysTest do
refute token.account_id
assert token.relay_group_id == group.id
assert token.created_by == :system
refute token.created_by_identity_id
assert token.created_by_subject == %{"email" => nil, "name" => "System"}
refute token.created_by_user_agent
refute token.created_by_remote_ip
refute token.expires_at
@@ -503,7 +506,12 @@ defmodule Domain.RelaysTest do
assert token.account_id == account.id
assert token.relay_group_id == group.id
assert token.created_by == :identity
assert token.created_by_identity_id == subject.identity.id
assert token.created_by_subject == %{
"email" => subject.identity.email,
"name" => subject.actor.name
}
assert token.created_by_user_agent == context.user_agent
assert token.created_by_remote_ip.address == context.remote_ip
refute token.expires_at

View File

@@ -1235,7 +1235,6 @@ defmodule Domain.ResourcesTest do
assert resource.account_id == account.id
assert resource.created_by == :identity
assert resource.created_by_identity_id == subject.identity.id
assert resource.created_by_subject == %{
"name" => subject.actor.name,
@@ -1247,7 +1246,6 @@ defmodule Domain.ResourcesTest do
assert connection.gateway_group_id == gateway.group_id
assert connection.account_id == account.id
assert connection.created_by == :identity
assert connection.created_by_identity_id == subject.identity.id
assert resource.created_by_subject == %{
"name" => subject.actor.name,

View File

@@ -86,4 +86,11 @@ defmodule Domain.Fixtures.Clients do
{:ok, client} = Clients.verify_client(client, subject)
client
end
def verify_client(client, subject) do
client = Repo.preload(client, :account)
{:ok, client} = Clients.verify_client(client, subject)
client
end
end

View File

@@ -1115,7 +1115,7 @@ defmodule Web.CoreComponents do
end
@doc """
Renders creation timestamp and entity.
Renders creation timestamp from created_by_subject
"""
attr :schema, :any, required: true
@@ -1125,6 +1125,12 @@ defmodule Web.CoreComponents do
"""
end
def created_by(%{schema: %{created_by: :provider}} = assigns) do
~H"""
<.relative_datetime datetime={@schema.inserted_at} /> by Directory Sync
"""
end
def created_by(%{schema: %{created_by: :actor}} = assigns) do
~H"""
<.relative_datetime datetime={@schema.inserted_at} /> by {@schema.created_by_subject["name"]}
@@ -1137,14 +1143,8 @@ defmodule Web.CoreComponents do
"""
end
def created_by(%{schema: %{created_by: :provider}} = assigns) do
~H"""
<.relative_datetime datetime={@schema.inserted_at} /> by Directory Sync
"""
end
@doc """
Renders verification timestamp and entity.
Renders verification timestamp and entity from verified_by_subject.
"""
attr :schema, :any, required: true

View File

@@ -76,7 +76,7 @@ defmodule Web.Actors.Show do
end
def handle_identities_update!(socket, list_opts) do
list_opts = Keyword.put(list_opts, :preload, [:provider, created_by_identity: [:actor]])
list_opts = Keyword.put(list_opts, :preload, [:provider])
with {:ok, identities, metadata} <-
Auth.list_identities_for(socket.assigns.actor, socket.assigns.subject, list_opts) do
@@ -105,7 +105,6 @@ defmodule Web.Actors.Show do
list_opts =
Keyword.put(list_opts, :preload,
identity: [:provider],
created_by_identity: [:actor],
clients: []
)

View File

@@ -10,8 +10,6 @@ defmodule Web.Clients.Show do
preload: [
:online?,
:actor,
:verified_by_identity,
:verified_by_actor,
last_used_token: [identity: [:provider]]
]
) do
@@ -425,8 +423,6 @@ defmodule Web.Clients.Show do
Clients.fetch_client_by_id(client.id, socket.assigns.subject,
preload: [
:actor,
:verified_by_identity,
:verified_by_actor,
last_used_token: [identity: [:provider]]
]
)

View File

@@ -24,7 +24,7 @@ defmodule Web.Groups.Index do
end
def handle_groups_update!(socket, list_opts) do
list_opts = Keyword.put(list_opts, :preload, [:provider, created_by_identity: [:actor]])
list_opts = Keyword.put(list_opts, :preload, [:provider])
with {:ok, groups, metadata} <- Actors.list_groups(socket.assigns.subject, list_opts),
{:ok, group_actors} <- Actors.peek_group_actors(groups, 3, socket.assigns.subject) do

View File

@@ -5,13 +5,7 @@ defmodule Web.Groups.Show do
def mount(%{"id" => id}, _session, socket) do
with {:ok, group} <-
Actors.fetch_group_by_id(id, socket.assigns.subject,
preload: [
provider: [],
created_by_identity: [:actor],
created_by_actor: []
]
) do
Actors.fetch_group_by_id(id, socket.assigns.subject, preload: :provider) do
socket =
assign(socket,
page_title: "Group #{group.name}",

View File

@@ -9,8 +9,6 @@ defmodule Web.Policies.Show do
preload: [
actor_group: [:provider],
resource: [],
created_by_identity: :actor,
created_by_actor: [],
replaced_by_policy: [:actor_group, :resource],
replaces_policy: [:actor_group, :resource]
]
@@ -318,7 +316,6 @@ defmodule Web.Policies.Show do
preload: [
actor_group: [:provider],
resource: [],
created_by_identity: :actor,
replaced_by_policy: [:actor_group, :resource],
replaces_policy: [:actor_group, :resource]
]
@@ -337,7 +334,6 @@ defmodule Web.Policies.Show do
policy
| actor_group: socket.assigns.policy.actor_group,
resource: socket.assigns.policy.resource,
created_by_identity: socket.assigns.policy.created_by_identity,
replaced_by_policy: socket.assigns.policy.replaced_by_policy,
replaces_policy: socket.assigns.policy.replaces_policy
}
@@ -352,7 +348,6 @@ defmodule Web.Policies.Show do
policy
| actor_group: socket.assigns.policy.actor_group,
resource: socket.assigns.policy.resource,
created_by_identity: socket.assigns.policy.created_by_identity,
replaced_by_policy: socket.assigns.policy.replaced_by_policy,
replaces_policy: socket.assigns.policy.replaces_policy
}

View File

@@ -4,12 +4,7 @@ defmodule Web.RelayGroups.Show do
def mount(%{"id" => id}, _session, socket) do
with true <- Accounts.self_hosted_relays_enabled?(socket.assigns.account),
{:ok, group} <-
Relays.fetch_group_by_id(id, socket.assigns.subject,
preload: [
created_by_identity: [:actor]
]
) do
{:ok, group} <- Relays.fetch_group_by_id(id, socket.assigns.subject) do
if connected?(socket) do
:ok = Relays.subscribe_to_relays_presence_in_group(group)
end

View File

@@ -401,7 +401,6 @@ defmodule Web.Resources.Show do
preload: [
:gateway_groups,
:policies,
created_by_identity: [:actor],
replaced_by_resource: [],
replaces_resource: []
]
@@ -439,8 +438,6 @@ defmodule Web.Resources.Show do
Resources.fetch_internet_resource(subject,
preload: [
:gateway_groups,
:created_by_actor,
created_by_identity: [:actor],
replaced_by_resource: [],
replaces_resource: []
]
@@ -451,8 +448,6 @@ defmodule Web.Resources.Show do
Resources.fetch_resource_by_id_or_persistent_id(id, subject,
preload: [
:gateway_groups,
:created_by_actor,
created_by_identity: [:actor],
replaced_by_resource: [],
replaces_resource: []
]

View File

@@ -30,9 +30,6 @@ defmodule Web.Settings.ApiClients.Show do
end
def handle_tokens_update!(socket, list_opts) do
list_opts =
Keyword.put(list_opts, :preload, created_by_identity: [:actor])
with {:ok, tokens, metadata} <-
Tokens.list_tokens_for(socket.assigns.actor, socket.assigns.subject, list_opts) do
{:ok,
@@ -170,12 +167,7 @@ defmodule Web.Settings.ApiClients.Show do
{Cldr.DateTime.Formatter.date(token.expires_at, 1, "en", Web.CLDR, [])}
</:col>
<:col :let={token} label="created by">
<.link
class={[link_style()]}
navigate={~p"/#{@account}/actors/#{token.created_by_actor_id}"}
>
{get_identity_email(token.created_by_identity)}
</.link>
{token.created_by_subject["name"]}
</:col>
<:col :let={token} label="last used">
<.relative_datetime datetime={token.last_seen_at} />

View File

@@ -5,9 +5,7 @@ defmodule Web.Settings.IdentityProviders.GoogleWorkspace.Show do
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
),
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject),
{:ok, identities_count_by_provider_id} <-
Auth.fetch_identities_count_grouped_by_provider_id(socket.assigns.subject),
{:ok, groups_count_by_provider_id} <-
@@ -255,11 +253,7 @@ defmodule Web.Settings.IdentityProviders.GoogleWorkspace.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -267,11 +261,7 @@ defmodule Web.Settings.IdentityProviders.GoogleWorkspace.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -5,9 +5,7 @@ defmodule Web.Settings.IdentityProviders.JumpCloud.Show do
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
),
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject),
{:ok, identities_count_by_provider_id} <-
Auth.fetch_identities_count_grouped_by_provider_id(socket.assigns.subject),
{:ok, groups_count_by_provider_id} <-
@@ -266,11 +264,7 @@ defmodule Web.Settings.IdentityProviders.JumpCloud.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -278,11 +272,7 @@ defmodule Web.Settings.IdentityProviders.JumpCloud.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -5,9 +5,7 @@ defmodule Web.Settings.IdentityProviders.MicrosoftEntra.Show do
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
),
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject),
{:ok, identities_count_by_provider_id} <-
Auth.fetch_identities_count_grouped_by_provider_id(socket.assigns.subject),
{:ok, groups_count_by_provider_id} <-
@@ -253,11 +251,7 @@ defmodule Web.Settings.IdentityProviders.MicrosoftEntra.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -265,11 +259,7 @@ defmodule Web.Settings.IdentityProviders.MicrosoftEntra.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -5,9 +5,7 @@ defmodule Web.Settings.IdentityProviders.Mock.Show do
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
),
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject),
{:ok, identities_count_by_provider_id} <-
Auth.fetch_identities_count_grouped_by_provider_id(socket.assigns.subject),
{:ok, groups_count_by_provider_id} <-
@@ -258,11 +256,7 @@ defmodule Web.Settings.IdentityProviders.Mock.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -270,11 +264,7 @@ defmodule Web.Settings.IdentityProviders.Mock.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -5,9 +5,7 @@ defmodule Web.Settings.IdentityProviders.Okta.Show do
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
),
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject),
{:ok, identities_count_by_provider_id} <-
Auth.fetch_identities_count_grouped_by_provider_id(socket.assigns.subject),
{:ok, groups_count_by_provider_id} <-
@@ -273,11 +271,7 @@ defmodule Web.Settings.IdentityProviders.Okta.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -285,11 +279,7 @@ defmodule Web.Settings.IdentityProviders.Okta.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -4,10 +4,7 @@ defmodule Web.Settings.IdentityProviders.OpenIDConnect.Show do
alias Domain.{Auth, Actors}
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
) do
with {:ok, provider} <- Auth.fetch_provider_by_id(provider_id, socket.assigns.subject) do
safe_to_delete_actors_count = Actors.count_synced_actors_for_provider(provider)
socket =
@@ -227,11 +224,7 @@ defmodule Web.Settings.IdentityProviders.OpenIDConnect.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -239,11 +232,7 @@ defmodule Web.Settings.IdentityProviders.OpenIDConnect.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -4,10 +4,7 @@ defmodule Web.Settings.IdentityProviders.System.Show do
alias Domain.Auth
def mount(%{"provider_id" => provider_id}, _session, socket) do
with {:ok, provider} <-
Auth.fetch_provider_by_id(provider_id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
) do
with {:ok, provider} <- Auth.fetch_provider_by_id(provider_id, socket.assigns.subject) do
socket =
assign(socket, provider: provider, page_title: "Identity Provider #{provider.name}")
@@ -122,11 +119,7 @@ defmodule Web.Settings.IdentityProviders.System.Show do
def handle_event("enable", _params, socket) do
attrs = %{disabled_at: nil}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end
@@ -134,11 +127,7 @@ defmodule Web.Settings.IdentityProviders.System.Show do
def handle_event("disable", _params, socket) do
attrs = %{disabled_at: DateTime.utc_now()}
{:ok, provider} = Auth.update_provider(socket.assigns.provider, attrs, socket.assigns.subject)
{:ok, provider} =
Auth.fetch_provider_by_id(provider.id, socket.assigns.subject,
preload: [created_by_identity: [:actor]]
)
{:ok, provider} = Auth.fetch_provider_by_id(provider.id, socket.assigns.subject)
{:noreply, assign(socket, provider: provider)}
end

View File

@@ -4,12 +4,7 @@ defmodule Web.Sites.Show do
def mount(%{"id" => id}, _session, socket) do
with {:ok, group} <-
Gateways.fetch_group_by_id(id, socket.assigns.subject,
preload: [
created_by_identity: [:actor],
created_by_actor: []
]
) do
Gateways.fetch_group_by_id(id, socket.assigns.subject) do
if connected?(socket) do
:ok = Gateways.subscribe_to_gateways_presence_in_group(group)
end
@@ -32,8 +27,6 @@ defmodule Web.Sites.Show do
Resources.fetch_internet_resource(socket.assigns.subject,
preload: [
:gateway_groups,
:created_by_actor,
created_by_identity: [:actor],
replaced_by_resource: [],
replaces_resource: []
]

View File

@@ -323,8 +323,7 @@ defmodule Web.Live.Actors.ShowTest do
Fixtures.Auth.create_identity(account: account, actor: actor)
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: admin_identity.id,
created_by_subject: %{"name" => actor.name, "email" => admin_identity.email}
created_by_subject: %{"email" => admin_identity.email, "name" => actor.name}
)
|> Repo.update!()
@@ -386,7 +385,7 @@ defmodule Web.Live.Actors.ShowTest do
Fixtures.Auth.create_identity(account: account, actor: actor, provider: provider)
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: admin_identity.id
created_by_subject: %{"email" => admin_identity.email, "name" => ""}
)
|> Repo.update!()
@@ -425,7 +424,7 @@ defmodule Web.Live.Actors.ShowTest do
)
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: admin_identity.id
created_by_subject: %{"email" => admin_identity.email, "name" => ""}
)
|> Repo.update!()
@@ -457,7 +456,7 @@ defmodule Web.Live.Actors.ShowTest do
Fixtures.Auth.create_identity(account: account, actor: actor, provider: provider)
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: admin_identity.id
created_by_subject: %{"email" => admin_identity.email, "name" => ""}
)
|> Repo.update!()
@@ -536,7 +535,7 @@ defmodule Web.Live.Actors.ShowTest do
Fixtures.Auth.create_identity(account: account, actor: actor, provider: email_provider)
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: admin_identity.id
created_by_subject: %{"email" => admin_identity.email, "name" => ""}
)
|> Repo.update!()
@@ -582,7 +581,7 @@ defmodule Web.Live.Actors.ShowTest do
Fixtures.Auth.create_identity(account: account, actor: actor)
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: admin_identity.id
created_by_subject: %{"email" => admin_identity.email, "name" => ""}
)
|> Repo.update!()

View File

@@ -135,7 +135,6 @@ defmodule Web.Live.Groups.NewTest do
refute group.provider_identifier
assert group.created_by == :identity
assert group.created_by_identity_id == identity.id
assert group.created_by_subject == %{"email" => identity.email, "name" => actor.name}
assert group.account_id == account.id

View File

@@ -124,7 +124,7 @@ defmodule Web.Live.Groups.ShowTest do
group
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id
created_by_subject: %{"email" => identity.email, "name" => actor.name}
)
|> Repo.update!()

View File

@@ -345,14 +345,18 @@ defmodule Web.Live.Resources.ShowTest do
assert Repo.get(Domain.Resources.Resource, resource.id).deleted_at
end
test "renders created_by link when created by Identity", %{
test "renders created_by info when created by Identity", %{
account: account,
actor: actor,
identity: identity,
conn: conn
} do
subject = Fixtures.Auth.create_subject(account: account, actor: actor)
resource =
Fixtures.Resources.create_resource(
account: account,
subject: subject,
address_description: "http://example.com"
)
@@ -361,13 +365,10 @@ defmodule Web.Live.Resources.ShowTest do
|> authorize_conn(identity)
|> live(~p"/#{account}/resources/#{resource}")
assert Floki.find(
html,
"a[href='#{~p"/#{account}/actors/#{resource.created_by_actor_id}"}']"
)
assert html =~ "by #{actor.name}"
end
test "renders created_by link when created by API client", %{
test "renders created_by info when created by API client", %{
account: account,
identity: identity,
conn: conn
@@ -387,9 +388,6 @@ defmodule Web.Live.Resources.ShowTest do
|> authorize_conn(identity)
|> live(~p"/#{account}/resources/#{resource}")
assert Floki.find(
html,
"a[href='#{~p"/#{account}/settings/api_clients/#{resource.created_by_actor_id}"}']"
)
assert html =~ "by #{subject.actor.name}"
end
end

View File

@@ -142,7 +142,6 @@ defmodule Web.Live.Settings.IdentityProviders.GoogleWorkspace.ShowTest do
provider
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id,
created_by_subject: %{"name" => actor.name, "email" => identity.email}
)
|> Repo.update!()

View File

@@ -163,7 +163,6 @@ defmodule Web.Live.Settings.IdentityProviders.JumpCloud.ShowTest do
provider
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id,
created_by_subject: %{"name" => actor.name, "email" => identity.email}
)
|> Repo.update!()

View File

@@ -142,7 +142,6 @@ defmodule Web.Live.Settings.IdentityProviders.MicrosoftEntra.ShowTest do
provider
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id,
created_by_subject: %{"name" => actor.name, "email" => identity.email}
)
|> Repo.update!()

View File

@@ -142,7 +142,6 @@ defmodule Web.Live.Settings.IdentityProviders.Okta.ShowTest do
provider
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id,
created_by_subject: %{"name" => actor.name, "email" => identity.email}
)
|> Repo.update!()

View File

@@ -103,7 +103,6 @@ defmodule Web.Live.Settings.IdentityProviders.OpenIDConnect.ShowTest do
provider
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id,
created_by_subject: %{"name" => actor.name, "email" => identity.email}
)
|> Repo.update!()

View File

@@ -92,7 +92,6 @@ defmodule Web.Live.Settings.IdentityProviders.System.ShowTest do
provider
|> Ecto.Changeset.change(
created_by: :identity,
created_by_identity_id: identity.id,
created_by_subject: %{"name" => actor.name, "email" => identity.email}
)
|> Repo.update!()