Skip to content

Commit 8ac8b7d

Browse files
authored
refactor(guard): do not remove org and projects deletion after user deletion (#205)
1 parent d733bff commit 8ac8b7d

File tree

2 files changed

+37
-66
lines changed

2 files changed

+37
-66
lines changed

guard/lib/guard/store/user.ex

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -254,27 +254,17 @@ defmodule Guard.Store.User do
254254
end
255255
end)
256256
|> Ecto.Multi.run(:delete_related_data, fn repo, _changes ->
257-
from(o in Repo.Organization, where: o.creator_id == ^user_id)
258-
|> repo.all()
259-
|> Enum.each(fn org ->
260-
:ok = Guard.Api.Project.destroy_all_projects_by_org_id(org.id)
261-
262-
repo.delete_all(from(m in Repo.Member, where: m.organization_id == ^org.id))
263-
264-
repo.delete_all(
265-
from(s in Repo.OrganizationSuspension, where: s.organization_id == ^org.id)
257+
members_query =
258+
from(m in Guard.FrontRepo.Member,
259+
join: rha in Guard.FrontRepo.RepoHostAccount,
260+
on: m.github_uid == rha.github_uid,
261+
where: rha.user_id == ^user_id
266262
)
267263

268-
repo.delete_all(
269-
from(c in Repo.OrganizationContact, where: c.organization_id == ^org.id)
270-
)
271-
end)
272-
264+
repo.delete_all(members_query)
265+
repo.delete_all(from(r in Repo.RepoHostAccount, where: r.user_id == ^user_id))
273266
{:ok, :deleted_related_data}
274267
end)
275-
|> Ecto.Multi.delete_all(:delete_organizations, fn _changes ->
276-
from(o in Repo.Organization, where: o.creator_id == ^user_id)
277-
end)
278268
|> Ecto.Multi.delete(:delete_user, fn %{get_user: user} -> user end)
279269
|> Repo.transaction()
280270

guard/test/guard/grpc_servers/user_server_test.exs

Lines changed: 30 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -548,9 +548,8 @@ defmodule Guard.GrpcServers.UserServerTest do
548548
end
549549

550550
describe "delete_with_owned_orgs" do
551-
test "delete_with_owned_orgs should delete the user and their organizations", %{
552-
grpc_channel: channel,
553-
another_user: another_user
551+
test "delete_with_owned_orgs should delete the user", %{
552+
grpc_channel: channel
554553
} do
555554
alias Guard.FrontRepo
556555

@@ -576,55 +575,37 @@ defmodule Guard.GrpcServers.UserServerTest do
576575
name: user.name
577576
)
578577

579-
orgs =
580-
1..2
581-
|> Enum.map(fn i ->
582-
Support.Factories.Organization.insert!(creator_id: user.id, username: "test-org-#{i}")
583-
end)
584-
585-
another_orgs =
586-
1..2
587-
|> Enum.map(fn i ->
588-
Support.Factories.Organization.insert!(
589-
creator_id: another_user.id,
590-
username: "another-test-org-#{i}"
591-
)
592-
end)
578+
{:ok, repo_host_account} =
579+
Support.Members.insert_repo_host_account(
580+
login: "test",
581+
name: "test",
582+
github_uid: "123123",
583+
user_id: user.id,
584+
token: "token",
585+
revoked: false,
586+
permission_scope: "repo"
587+
)
588+
589+
{:ok, member} = Support.Members.insert_member(github_uid: "123123")
593590

594591
request = User.DeleteWithOwnedOrgsRequest.new(user_id: user.id)
595592

596-
with_mocks [
597-
{Guard.Api.Project, [], destroy_all_projects_by_org_id: fn _ -> :ok end}
598-
] do
599-
{:ok, response} =
600-
channel
601-
|> Stub.delete_with_owned_orgs(request)
602-
603-
id = user.id
604-
assert %User.User{id: ^id} = response
605-
606-
# check if the user is deleted
607-
assert nil == FrontRepo.get(FrontRepo.User, id)
608-
609-
# check if the organizations are deleted
610-
orgs
611-
|> Enum.each(fn org ->
612-
assert nil == FrontRepo.get(FrontRepo.Organization, org.id)
613-
end)
614-
615-
# check if the another user organizations are not deleted
616-
another_orgs
617-
|> Enum.each(fn org ->
618-
assert %FrontRepo.Organization{} = FrontRepo.get(FrontRepo.Organization, org.id)
619-
end)
620-
621-
receive do
622-
{:user_deleted_test, received_message} ->
623-
user_deleted = User.UserDeleted.decode(received_message)
624-
assert user_deleted.user_id == user.id
625-
after
626-
5000 -> flunk("Timeout: Message not received within 5 seconds")
627-
end
593+
{:ok, response} = channel |> Stub.delete_with_owned_orgs(request)
594+
595+
id = user.id
596+
assert %User.User{id: ^id} = response
597+
598+
# check if the user is deleted
599+
assert nil == FrontRepo.get(FrontRepo.User, id)
600+
assert nil == FrontRepo.get(FrontRepo.RepoHostAccount, repo_host_account.id)
601+
assert nil == FrontRepo.get(FrontRepo.Member, member.id)
602+
603+
receive do
604+
{:user_deleted_test, received_message} ->
605+
user_deleted = User.UserDeleted.decode(received_message)
606+
assert user_deleted.user_id == user.id
607+
after
608+
5000 -> flunk("Timeout: Message not received within 5 seconds")
628609
end
629610
end
630611

0 commit comments

Comments
 (0)