From 2c9b951f2c65b4253799cafc05e0890eb6a90751 Mon Sep 17 00:00:00 2001 From: Raphael Date: Wed, 8 Jul 2026 08:55:23 +0200 Subject: [PATCH 1/4] fix: deleted namespace when namespace holder is deleted --- app/services/organizations/delete_service.rb | 6 +++++- app/services/users/delete_service.rb | 4 ++++ spec/services/organizations/delete_service_spec.rb | 4 ++++ spec/services/users/delete_service_spec.rb | 5 +++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/services/organizations/delete_service.rb b/app/services/organizations/delete_service.rb index 219bde906..9ff908a2c 100644 --- a/app/services/organizations/delete_service.rb +++ b/app/services/organizations/delete_service.rb @@ -17,6 +17,8 @@ def execute end transactional do |t| + namespace = organization.ensure_namespace + organization.delete if organization.persisted? @@ -25,12 +27,14 @@ def execute details: organization.errors) end + namespace.delete + AuditService.audit( :organization_deleted, author_id: current_authentication.user.id, entity: organization, details: {}, - target: organization.ensure_namespace + target: namespace ) ServiceResponse.success(message: 'Organization deleted', payload: organization) diff --git a/app/services/users/delete_service.rb b/app/services/users/delete_service.rb index 98ea67256..891fb362f 100644 --- a/app/services/users/delete_service.rb +++ b/app/services/users/delete_service.rb @@ -17,6 +17,8 @@ def execute end transactional do |t| + namespace = user.namespace + user.destroy if user.persisted? @@ -27,6 +29,8 @@ def execute ) end + namespace&.delete + AuditService.audit( :user_deleted, author_id: current_authentication.user.id, diff --git a/spec/services/organizations/delete_service_spec.rb b/spec/services/organizations/delete_service_spec.rb index 9c782e074..68bda86a3 100644 --- a/spec/services/organizations/delete_service_spec.rb +++ b/spec/services/organizations/delete_service_spec.rb @@ -43,6 +43,10 @@ it { expect(service_response.payload).to eq(organization) } it { expect { service_response }.to change { Organization.count }.by(-1) } + it do + expect { service_response }.to change { Namespace.exists?(organization.namespace.id) }.from(true).to(false) + end + it do expect { service_response }.to create_audit_event( :organization_deleted, diff --git a/spec/services/users/delete_service_spec.rb b/spec/services/users/delete_service_spec.rb index b2a989b77..649f9e9d5 100644 --- a/spec/services/users/delete_service_spec.rb +++ b/spec/services/users/delete_service_spec.rb @@ -11,7 +11,12 @@ let(:current_user) { create(:user, :admin) } it 'deletes the user successfully' do + namespace_id = user.ensure_namespace.id + expect { service_response }.to change { User.exists?(user.id) }.from(true).to(false) + .and change { + Namespace.exists?(namespace_id) + }.from(true).to(false) expect(service_response).to be_success expect(service_response.payload).to eq(user) From 0ffd0264f67c65dcc6fb5653632354bda695fa5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raphael=20G=C3=B6tz?= <52959657+raphael-goetz@users.noreply.github.com> Date: Thu, 9 Jul 2026 19:52:09 +0200 Subject: [PATCH 2/4] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Niklas van Schrick Signed-off-by: Raphael Götz <52959657+raphael-goetz@users.noreply.github.com> --- app/services/organizations/delete_service.rb | 8 +++++++- app/services/users/delete_service.rb | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/services/organizations/delete_service.rb b/app/services/organizations/delete_service.rb index 9ff908a2c..4729cdb70 100644 --- a/app/services/organizations/delete_service.rb +++ b/app/services/organizations/delete_service.rb @@ -28,13 +28,19 @@ def execute end namespace.delete + + if namespace.persisted? + t.rollback_and_return! ServiceResponse.error(message: 'Failed to delete namespace', + error_code: :invalid_organization, + details: namespace.errors) + end AuditService.audit( :organization_deleted, author_id: current_authentication.user.id, entity: organization, details: {}, - target: namespace + target: AuditEvent::GLOBAL_TARGET ) ServiceResponse.success(message: 'Organization deleted', payload: organization) diff --git a/app/services/users/delete_service.rb b/app/services/users/delete_service.rb index 891fb362f..89efef079 100644 --- a/app/services/users/delete_service.rb +++ b/app/services/users/delete_service.rb @@ -30,6 +30,14 @@ def execute end namespace&.delete + + if namespace.present? && namespace.persisted? + t.rollback_and_return! ServiceResponse.error( + message: 'Failed to delete user namespace', + error_code: :invalid_user, + details: namespace.errors + ) + end AuditService.audit( :user_deleted, From 877e95155294c693c3f78f817c33432334be5ad5 Mon Sep 17 00:00:00 2001 From: Raphael Date: Thu, 9 Jul 2026 20:20:57 +0200 Subject: [PATCH 3/4] ref: made rubocop happy :D --- app/services/organizations/delete_service.rb | 2 +- app/services/users/delete_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/organizations/delete_service.rb b/app/services/organizations/delete_service.rb index 4729cdb70..976a18317 100644 --- a/app/services/organizations/delete_service.rb +++ b/app/services/organizations/delete_service.rb @@ -28,7 +28,7 @@ def execute end namespace.delete - + if namespace.persisted? t.rollback_and_return! ServiceResponse.error(message: 'Failed to delete namespace', error_code: :invalid_organization, diff --git a/app/services/users/delete_service.rb b/app/services/users/delete_service.rb index 89efef079..a14035d02 100644 --- a/app/services/users/delete_service.rb +++ b/app/services/users/delete_service.rb @@ -30,7 +30,7 @@ def execute end namespace&.delete - + if namespace.present? && namespace.persisted? t.rollback_and_return! ServiceResponse.error( message: 'Failed to delete user namespace', From 6ad97085d237944f8a86d69fb6a50caeeebd1ff8 Mon Sep 17 00:00:00 2001 From: Raphael Date: Thu, 9 Jul 2026 20:55:02 +0200 Subject: [PATCH 4/4] fix: correct audit events --- .../graphql/mutation/organizations/delete_mutation_spec.rb | 4 ++-- spec/services/organizations/delete_service_spec.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/requests/graphql/mutation/organizations/delete_mutation_spec.rb b/spec/requests/graphql/mutation/organizations/delete_mutation_spec.rb index 5a2989ce9..b4c093001 100644 --- a/spec/requests/graphql/mutation/organizations/delete_mutation_spec.rb +++ b/spec/requests/graphql/mutation/organizations/delete_mutation_spec.rb @@ -53,8 +53,8 @@ entity_id: organization.id, entity_type: 'Organization', details: {}, - target_id: organization.namespace.id, - target_type: 'Namespace' + target_id: 0, + target_type: 'global' ) end end diff --git a/spec/services/organizations/delete_service_spec.rb b/spec/services/organizations/delete_service_spec.rb index 68bda86a3..1933cde8c 100644 --- a/spec/services/organizations/delete_service_spec.rb +++ b/spec/services/organizations/delete_service_spec.rb @@ -53,8 +53,8 @@ author_id: current_user.id, entity_type: 'Organization', details: {}, - target_id: organization.namespace.id, - target_type: 'Namespace' + target_id: 0, + target_type: 'global' ) end end