diff --git a/Changelog.md b/Changelog.md index b6ce3f0666c3ee91b4cf15ab72db1c1207b392ff..b1be0a0912ff4c88ae827b8dfaa481816489c03a 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 f2dd7df9eb9743647a2339f3f745aa9e2329a68c..3f8fe719e8e4a63f0fb90c06b9a5ba8da80210d4 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 0000000000000000000000000000000000000000..7097247231681e45ad55a5a834bd60b69f8e20fb --- /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