diff --git a/app/services/organizations/delete_service.rb b/app/services/organizations/delete_service.rb index 219bde906..976a18317 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,20 @@ def execute details: organization.errors) 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: organization.ensure_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 98ea67256..a14035d02 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,16 @@ 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, author_id: current_authentication.user.id, 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 9c782e074..1933cde8c 100644 --- a/spec/services/organizations/delete_service_spec.rb +++ b/spec/services/organizations/delete_service_spec.rb @@ -43,14 +43,18 @@ 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, 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 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)