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
This commit is contained in:
cmrd Senya 2017-10-12 18:14:29 +03:00 committed by Benjamin Neff
parent ad025850ce
commit 2e9c6f46dc
No known key found for this signature in database
GPG key ID: 971464C3F1A90194
3 changed files with 46 additions and 1 deletions

View file

@ -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)

View file

@ -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

View file

@ -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