From 2e9c6f46dc6c01a63123445da876f23780b3398d Mon Sep 17 00:00:00 2001 From: cmrd Senya Date: Thu, 12 Oct 2017 18:14:29 +0300 Subject: [PATCH] Clean up invalid contacts from the DB Cleans invalid contacts where the referenced user was deleted from the DB or where the referenced person owner was deleted from the DB. closes #7632 --- Changelog.md | 1 + app/models/notification.rb | 2 +- ...20171012202650_cleanup_invalid_contacts.rb | 44 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20171012202650_cleanup_invalid_contacts.rb diff --git a/Changelog.md b/Changelog.md index b6ce3f066..b1be0a091 100644 --- a/Changelog.md +++ b/Changelog.md @@ -39,6 +39,7 @@ after you've upgraded. * Avoid page to jump to top after a post deletion [#7638](https://github.com/diaspora/diaspora/pull/7638) * Handle duplicate account deletions [#7639](https://github.com/diaspora/diaspora/pull/7639) * Handle duplicate account migrations [#7641](https://github.com/diaspora/diaspora/pull/7641) +* Handle bugs related to missing users [#7632](https://github.com/diaspora/diaspora/pull/7632) ## Features * Ask for confirmation when leaving a submittable comment field [#7530](https://github.com/diaspora/diaspora/pull/7530) diff --git a/app/models/notification.rb b/app/models/notification.rb index f2dd7df9e..3f8fe719e 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -6,7 +6,7 @@ # class Notification < ApplicationRecord belongs_to :recipient, class_name: "User" - has_many :notification_actors, dependent: :destroy + has_many :notification_actors, dependent: :delete_all has_many :actors, class_name: "Person", through: :notification_actors, source: :person belongs_to :target, polymorphic: true diff --git a/db/migrate/20171012202650_cleanup_invalid_contacts.rb b/db/migrate/20171012202650_cleanup_invalid_contacts.rb new file mode 100644 index 000000000..709724723 --- /dev/null +++ b/db/migrate/20171012202650_cleanup_invalid_contacts.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +class CleanupInvalidContacts < ActiveRecord::Migration[5.1] + class Contact < ApplicationRecord + belongs_to :user + belongs_to :person + + has_many :aspect_memberships, dependent: :delete_all + + before_destroy :destroy_notifications + + def destroy_notifications + Notification.where( + target_type: "Person", + target_id: person_id, + recipient_id: user_id, + type: "Notifications::StartedSharing" + ).destroy_all + end + end + + class User < ApplicationRecord + end + + class Person < ApplicationRecord + belongs_to :owner, class_name: "User", optional: true + end + + class Notification < ApplicationRecord + self.inheritance_column = nil + has_many :notification_actors, dependent: :delete_all + end + + class NotificationActor < ApplicationRecord + end + + class AspectMembership < ApplicationRecord + end + + def up + Contact.left_outer_joins(:user).where("users.id is NULL").destroy_all + Contact.left_outer_joins(person: :owner).where("people.owner_id is NOT NULL").where("users.id is NULL").destroy_all + end +end