From b040f85790c61a4155a044f3f1fa198e49a96925 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Thu, 24 Aug 2017 22:24:06 +0200 Subject: [PATCH] Remove root_guid from reshares when post is deleted And cleanup old reshares with deleted root posts closes #7578 --- Changelog.md | 1 + app/models/post.rb | 4 ++++ .../20170824202628_cleanup_root_guids_from_reshares.rb | 9 +++++++++ spec/models/post_spec.rb | 9 +++++++++ 4 files changed, 23 insertions(+) create mode 100644 db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb diff --git a/Changelog.md b/Changelog.md index fc4830613..a0a8e9049 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,7 @@ * Remove Internet Explorer workarounds [#7557](https://github.com/diaspora/diaspora/pull/7557) * Sort notifications by last interaction [#7568](https://github.com/diaspora/diaspora/pull/7568) * Remove tiff support from photos [#7576](https://github.com/diaspora/diaspora/pull/7576) +* Remove reference from reshares when original post is deleted [#7578](https://github.com/diaspora/diaspora/pull/7578) ## Bug fixes * Fix displaying polls with long answers [#7579](https://github.com/diaspora/diaspora/pull/7579) diff --git a/app/models/post.rb b/app/models/post.rb index 4a6c51744..e592400f6 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -33,6 +33,10 @@ class Post < ApplicationRecord self.touch(:interacted_at) end + before_destroy do + reshares.update_all(root_guid: nil) # rubocop:disable Rails/SkipsModelValidations + end + #scopes scope :includes_for_a_stream, -> { includes(:o_embed_cache, diff --git a/db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb b/db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb new file mode 100644 index 000000000..7a93cca9d --- /dev/null +++ b/db/migrate/20170824202628_cleanup_root_guids_from_reshares.rb @@ -0,0 +1,9 @@ +class CleanupRootGuidsFromReshares < ActiveRecord::Migration[5.1] + def up + # rubocop:disable Rails/SkipsModelValidations + Reshare.joins("LEFT OUTER JOIN posts as root ON root.guid = posts.root_guid") + .where("root.id is NULL AND posts.root_guid is NOT NULL") + .update_all(root_guid: nil) + # rubocop:enable Rails/SkipsModelValidations + end +end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index fdfc1f4b4..db63c2e26 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -387,4 +387,13 @@ describe Post, :type => :model do expect(post.interacted_at).not_to be_blank end end + + describe "#before_destroy" do + it "removes root_guid from reshares" do + post = FactoryGirl.create(:status_message, author: alice.person, public: true) + reshare = FactoryGirl.create(:reshare, author: bob.person, root: post) + post.destroy! + expect(reshare.reload.root_guid).to be_nil + end + end end