From 930e8c03a2da6c6dd55dd67ebbd2be3589e47b02 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Wed, 19 Apr 2017 11:53:04 +0000 Subject: Merge branch 'fix/orphan-notification-settings' into 'master' Fix orphaned notification settings Closes #29688 See merge request !10763 --- .../fix-orphan-notification-settings.yml | 4 ++++ ...18103908_delete_orphan_notification_settings.rb | 24 ++++++++++++++++++++++ db/schema.rb | 2 +- spec/services/groups/destroy_service_spec.rb | 4 +++- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/fix-orphan-notification-settings.yml create mode 100644 db/migrate/20170418103908_delete_orphan_notification_settings.rb diff --git a/changelogs/unreleased/fix-orphan-notification-settings.yml b/changelogs/unreleased/fix-orphan-notification-settings.yml new file mode 100644 index 00000000000..7595b033336 --- /dev/null +++ b/changelogs/unreleased/fix-orphan-notification-settings.yml @@ -0,0 +1,4 @@ +--- +title: Removed orphaned notification settings without a namespace +merge_request: +author: diff --git a/db/migrate/20170418103908_delete_orphan_notification_settings.rb b/db/migrate/20170418103908_delete_orphan_notification_settings.rb new file mode 100644 index 00000000000..e4b9cf65936 --- /dev/null +++ b/db/migrate/20170418103908_delete_orphan_notification_settings.rb @@ -0,0 +1,24 @@ +class DeleteOrphanNotificationSettings < ActiveRecord::Migration + DOWNTIME = false + + def up + execute("DELETE FROM notification_settings WHERE EXISTS (SELECT true FROM (#{orphan_notification_settings}) AS ns WHERE ns.id = notification_settings.id)") + end + + def down + # This is a no-op method to make the migration reversible. + # If someone is trying to rollback for other reasons, we should not throw an Exception. + # raise ActiveRecord::IrreversibleMigration + end + + def orphan_notification_settings + <<-SQL + SELECT notification_settings.id + FROM notification_settings + LEFT OUTER JOIN namespaces + ON namespaces.id = notification_settings.source_id + WHERE notification_settings.source_type = 'Namespace' + AND namespaces.id IS NULL + SQL + end +end diff --git a/db/schema.rb b/db/schema.rb index 83b279ce71c..35be2565cdd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170330141723) do +ActiveRecord::Schema.define(version: 20170418103908) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb index 98c560ffb26..a37257d1bf4 100644 --- a/spec/services/groups/destroy_service_spec.rb +++ b/spec/services/groups/destroy_service_spec.rb @@ -6,7 +6,8 @@ describe Groups::DestroyService, services: true do let!(:user) { create(:user) } let!(:group) { create(:group) } let!(:nested_group) { create(:group, parent: group) } - let!(:project) { create(:project, namespace: group) } + let!(:project) { create(:empty_project, namespace: group) } + let!(:notification_setting) { create(:notification_setting, source: group)} let!(:gitlab_shell) { Gitlab::Shell.new } let!(:remove_path) { group.path + "+#{group.id}+deleted" } @@ -23,6 +24,7 @@ describe Groups::DestroyService, services: true do it { expect(Group.unscoped.all).not_to include(group) } it { expect(Group.unscoped.all).not_to include(nested_group) } it { expect(Project.unscoped.all).not_to include(project) } + it { expect(NotificationSetting.unscoped.all).not_to include(notification_setting) } end context 'file system' do -- cgit v1.2.3