From 34fd5693d717db317ac4834cebd6e4999aa901c2 Mon Sep 17 00:00:00 2001 From: bmanifold Date: Tue, 12 Sep 2023 19:43:02 -0400 Subject: [PATCH] Update new/edit policy pages (#1946) Why: * The new and edit policy pages had previously only been pulling live data from the DB, but had not been able to use the forms to create or update policies. This commit allows the forms to function as intended. --- elixir/apps/domain/lib/domain/policies.ex | 4 + .../20230825174719_update_policy_indexes.exs | 17 ++ .../domain/test/support/fixtures/accounts.ex | 5 +- .../domain/test/support/fixtures/policies.ex | 14 ++ .../web/lib/web/components/form_components.ex | 11 +- .../lib/web/components/table_components.ex | 18 ++ .../lib/web/controllers/auth_controller.ex | 2 +- elixir/apps/web/lib/web/live/auth/sign_in.ex | 21 ++- elixir/apps/web/lib/web/live/policies/edit.ex | 63 ++++--- .../apps/web/lib/web/live/policies/index.ex | 26 ++- elixir/apps/web/lib/web/live/policies/new.ex | 103 ++++++------ elixir/apps/web/lib/web/live/policies/show.ex | 9 +- .../google_workspace/show.ex | 2 +- .../identity_providers/openid_connect/show.ex | 2 +- elixir/apps/web/test/web/auth_test.exs | 12 +- .../web/controllers/auth_controller_test.exs | 26 +-- .../web/test/web/live/policies/edit_test.exs | 148 ++++++++++++++++ .../web/test/web/live/policies/index_test.exs | 78 +++++++++ .../web/test/web/live/policies/new_test.exs | 158 ++++++++++++++++++ .../web/test/web/live/policies/show_test.exs | 146 ++++++++++++++++ .../google_workspace/connect_test.exs | 4 +- .../openid_connect/connect_test.exs | 8 +- 22 files changed, 754 insertions(+), 123 deletions(-) create mode 100644 elixir/apps/domain/priv/repo/migrations/20230825174719_update_policy_indexes.exs create mode 100644 elixir/apps/web/test/web/live/policies/edit_test.exs create mode 100644 elixir/apps/web/test/web/live/policies/index_test.exs create mode 100644 elixir/apps/web/test/web/live/policies/new_test.exs create mode 100644 elixir/apps/web/test/web/live/policies/show_test.exs diff --git a/elixir/apps/domain/lib/domain/policies.ex b/elixir/apps/domain/lib/domain/policies.ex index 2f3608539..4a99c073d 100644 --- a/elixir/apps/domain/lib/domain/policies.ex +++ b/elixir/apps/domain/lib/domain/policies.ex @@ -80,6 +80,10 @@ defmodule Domain.Policies do end end + def new_policy(attrs, %Auth.Subject{} = subject) do + Policy.Changeset.create(attrs, subject) + end + def ensure_has_access_to(%Auth.Subject{} = subject, %Policy{} = policy) do if subject.account.id == policy.account_id do :ok diff --git a/elixir/apps/domain/priv/repo/migrations/20230825174719_update_policy_indexes.exs b/elixir/apps/domain/priv/repo/migrations/20230825174719_update_policy_indexes.exs new file mode 100644 index 000000000..6ca87acdf --- /dev/null +++ b/elixir/apps/domain/priv/repo/migrations/20230825174719_update_policy_indexes.exs @@ -0,0 +1,17 @@ +defmodule Domain.Repo.Migrations.UpdatePolicyIndexes do + use Ecto.Migration + + def change do + drop(index(:policies, [:account_id, :name], unique: true)) + drop(index(:policies, [:account_id, :resource_id, :actor_group_id], unique: true)) + + create(index(:policies, [:account_id, :name], unique: true, where: "deleted_at IS NULL")) + + create( + index(:policies, [:account_id, :resource_id, :actor_group_id], + unique: true, + where: "deleted_at IS NULL" + ) + ) + end +end diff --git a/elixir/apps/domain/test/support/fixtures/accounts.ex b/elixir/apps/domain/test/support/fixtures/accounts.ex index 7231d1070..a3b8a4c09 100644 --- a/elixir/apps/domain/test/support/fixtures/accounts.ex +++ b/elixir/apps/domain/test/support/fixtures/accounts.ex @@ -3,8 +3,11 @@ defmodule Domain.Fixtures.Accounts do alias Domain.Accounts def account_attrs(attrs \\ %{}) do + unique_num = unique_integer() + Enum.into(attrs, %{ - name: "acc-#{unique_integer()}" + name: "acc-#{unique_num}", + slug: "acc_#{unique_num}" }) end diff --git a/elixir/apps/domain/test/support/fixtures/policies.ex b/elixir/apps/domain/test/support/fixtures/policies.ex index e24576985..2998f9e44 100644 --- a/elixir/apps/domain/test/support/fixtures/policies.ex +++ b/elixir/apps/domain/test/support/fixtures/policies.ex @@ -1,5 +1,6 @@ defmodule Domain.Fixtures.Policies do use Domain.Fixture + alias Domain.Policies def policy_attrs(attrs \\ %{}) do Enum.into(attrs, %{ @@ -42,4 +43,17 @@ defmodule Domain.Fixtures.Policies do policy end + + def delete_policy(policy) do + policy = Repo.preload(policy, :account) + + subject = + Fixtures.Auth.create_subject( + account: policy.account, + actor: [type: :account_admin_user] + ) + + {:ok, policy} = Policies.delete_policy(policy, subject) + policy + end end diff --git a/elixir/apps/web/lib/web/components/form_components.ex b/elixir/apps/web/lib/web/components/form_components.ex index 66a6eb104..7f673edcb 100644 --- a/elixir/apps/web/lib/web/components/form_components.ex +++ b/elixir/apps/web/lib/web/components/form_components.ex @@ -365,11 +365,12 @@ defmodule Web.FormComponents do def delete_button(assigns) do ~H""" -