Skip to content

Commit 26d85b5

Browse files
authored
fix(projecthub): rename project when it is soft deleted (#247)
1 parent 066c1a9 commit 26d85b5

File tree

3 files changed

+51
-17
lines changed

3 files changed

+51
-17
lines changed

projecthub/lib/projecthub/models/project.ex

+6-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,12 @@ defmodule Projecthub.Models.Project do
300300
end
301301

302302
def soft_destroy(project, user) do
303-
{:ok, _} = update_record(project, %{deleted_at: DateTime.utc_now(), deleted_by: user.id})
303+
current_datetime = DateTime.utc_now() |> DateTime.truncate(:second)
304+
305+
deleted_project_name = "#{project.name}-deleted-#{current_datetime |> DateTime.to_unix(:second)}"
306+
307+
{:ok, _} = update_record(project, %{name: deleted_project_name, deleted_at: current_datetime, deleted_by: user.id})
308+
304309
{:ok, _} = Events.ProjectDeleted.publish(project, soft_delete: true)
305310

306311
{:ok, nil}

projecthub/test/projecthub/api/grpc_server_test.exs

+26-14
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,8 @@ defmodule Projecthub.Api.GrpcServerTest do
660660
assert response.metadata.status ==
661661
InternalApi.Projecthub.ResponseMeta.Status.new(code: :OK)
662662

663-
assert response.project.metadata.name == project.name
663+
cut_timestamp = create_cut_timestamp()
664+
assert response.project.metadata.name =~ "#{project.name}-deleted-#{cut_timestamp}"
664665
assert response.project.metadata.id == project.id
665666
assert response.project.metadata.org_id == project.organization_id
666667
assert response.project.metadata.description == project.description
@@ -825,11 +826,12 @@ defmodule Projecthub.Api.GrpcServerTest do
825826

826827
test "when a soft_deleted project is requested by name and soft_deleted param is true => returns the project" do
827828
{:ok, project} = Support.Factories.Project.create_with_repo()
828-
{:ok, _} = Project.soft_destroy(project, %User{github_token: "token"})
829+
{:ok, nil} = Project.soft_destroy(project, %User{github_token: "token"})
830+
{:ok, soft_deleted_project} = Project.find(project.id, true)
829831

830832
{:ok, _project_with_same_name} =
831833
Support.Factories.Project.create(%{
832-
name: project.name
834+
name: soft_deleted_project.name
833835
})
834836

835837
{:ok, channel} =
@@ -848,11 +850,11 @@ defmodule Projecthub.Api.GrpcServerTest do
848850
api_version: "",
849851
kind: "",
850852
req_id: "",
851-
org_id: project.organization_id,
853+
org_id: soft_deleted_project.organization_id,
852854
user_id: Ecto.UUID.generate()
853855
),
854856
id: "",
855-
name: project.name,
857+
name: soft_deleted_project.name,
856858
soft_deleted: true
857859
)
858860

@@ -861,13 +863,15 @@ defmodule Projecthub.Api.GrpcServerTest do
861863
assert response.metadata.status ==
862864
InternalApi.Projecthub.ResponseMeta.Status.new(code: :OK)
863865

864-
assert response.project.metadata.name == project.name
865-
assert response.project.metadata.id == project.id
866-
assert response.project.metadata.org_id == project.organization_id
867-
assert response.project.metadata.description == project.description
868-
assert response.project.spec.repository.url == project.repository.url
869-
assert response.project.spec.repository.name == project.repository.name
870-
assert response.project.spec.repository.owner == project.repository.owner
866+
cut_timestamp = create_cut_timestamp()
867+
assert response.project.metadata.name == soft_deleted_project.name
868+
assert response.project.metadata.name =~ "#{project.name}-deleted-#{cut_timestamp}"
869+
assert response.project.metadata.id == soft_deleted_project.id
870+
assert response.project.metadata.org_id == soft_deleted_project.organization_id
871+
assert response.project.metadata.description == soft_deleted_project.description
872+
assert response.project.spec.repository.url == soft_deleted_project.repository.url
873+
assert response.project.spec.repository.name == soft_deleted_project.repository.name
874+
assert response.project.spec.repository.owner == soft_deleted_project.repository.owner
871875
end
872876

873877
test "when the project description is empty => returns the project" do
@@ -1182,9 +1186,11 @@ defmodule Projecthub.Api.GrpcServerTest do
11821186

11831187
assert Enum.count(response.projects) == 2
11841188

1189+
cut_timestamp = create_cut_timestamp()
11851190
names = Enum.map(response.projects, fn p -> p.metadata.name end)
1186-
assert Enum.member?(names, project1.name)
1187-
assert Enum.member?(names, project2.name)
1191+
assert Enum.any?(names, fn name -> name =~ "#{project1.name}-deleted-#{cut_timestamp}" end)
1192+
assert Enum.any?(names, fn name -> name =~ "#{project2.name}-deleted-#{cut_timestamp}" end)
1193+
assert Enum.all?(names, fn name -> name =~ "-deleted-#{cut_timestamp}" end)
11881194
end
11891195

11901196
test "when there are no projects => returns empty list" do
@@ -3179,4 +3185,10 @@ defmodule Projecthub.Api.GrpcServerTest do
31793185
end
31803186
end
31813187
end
3188+
3189+
defp create_cut_timestamp do
3190+
DateTime.utc_now()
3191+
|> DateTime.to_unix(:second)
3192+
|> Integer.floor_div(1000)
3193+
end
31823194
end

projecthub/test/projecthub/models/project_test.exs

+19-2
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,9 @@ defmodule Projecthub.Models.ProjectTest do
551551
soft_deleted_project = Project |> Repo.get(project.id)
552552
assert soft_deleted_project.deleted_at != nil
553553
assert soft_deleted_project.deleted_by == user.id
554+
555+
cut_timestamp = create_cut_timestamp()
556+
assert soft_deleted_project.name =~ "#{project.name}-deleted-#{cut_timestamp}"
554557
end
555558
end
556559

@@ -599,9 +602,10 @@ defmodule Projecthub.Models.ProjectTest do
599602
project = create_and_soft_destroy()
600603

601604
{:ok, found_project} = Project.find(project.id, true)
602-
605+
cut_timestamp = create_cut_timestamp()
603606
assert found_project.id == project.id
604607
assert found_project.name == project.name
608+
assert found_project.name =~ "-deleted-#{cut_timestamp}"
605609
end
606610
end
607611

@@ -637,8 +641,11 @@ defmodule Projecthub.Models.ProjectTest do
637641

638642
{:ok, found_project} = Project.find_by_name(project.name, project.organization_id, true)
639643

644+
cut_timestamp = create_cut_timestamp()
645+
640646
assert found_project.id == project.id
641647
assert found_project.name == project.name
648+
assert found_project.name =~ "-deleted-#{cut_timestamp}"
642649
end
643650
end
644651

@@ -697,7 +704,9 @@ defmodule Projecthub.Models.ProjectTest do
697704

698705
projects = Project.find_many(org_id, [project1.id, project2.id], true)
699706

707+
cut_timestamp = create_cut_timestamp()
700708
assert Enum.count(projects) == 2
709+
assert Enum.all?(projects, fn project -> project.name =~ "-deleted-#{cut_timestamp}" end)
701710
end
702711
end
703712

@@ -739,6 +748,7 @@ defmodule Projecthub.Models.ProjectTest do
739748
test "it returns a page of soft deleted projects" do
740749
org_id = Ecto.UUID.generate()
741750

751+
cut_timestamp = create_cut_timestamp()
742752
create_and_soft_destroy_many(org_id: org_id, quantity: 4)
743753

744754
{:ok, _non_deleted_project} = Support.Factories.Project.create()
@@ -752,6 +762,7 @@ defmodule Projecthub.Models.ProjectTest do
752762

753763
entries = page.entries
754764
assert Enum.count(entries) == 3
765+
assert Enum.all?(entries, fn project -> project.name =~ "-deleted-#{cut_timestamp}" end)
755766
end
756767

757768
test "it filter projects by owner_id" do
@@ -886,7 +897,13 @@ defmodule Projecthub.Models.ProjectTest do
886897
user = %User{id: Ecto.UUID.generate(), github_token: "token"}
887898

888899
{:ok, _} = Project.soft_destroy(project, user)
889-
900+
{:ok, project} = Project.find(project.id, true)
890901
project
891902
end
903+
904+
defp create_cut_timestamp do
905+
DateTime.utc_now()
906+
|> DateTime.to_unix(:second)
907+
|> Integer.floor_div(1000)
908+
end
892909
end

0 commit comments

Comments
 (0)