diff options
author | Benjamin Neff <benjamin@coding4coffee.ch> | 2017-10-11 00:50:13 +0300 |
---|---|---|
committer | Benjamin Neff <benjamin@coding4coffee.ch> | 2017-10-17 02:27:00 +0300 |
commit | 2711b9dc831d8c58bc9ba7c1bd917e6e16aa107e (patch) | |
tree | 692dc0d6f5d7a2d3b64ce926b2b991759f1bbbf9 /db | |
parent | 32067246df724b7f6455f3ef95f747391c48d043 (diff) |
Cleanup relayables where the signature is missing
When we should have the signature but don't have it, the user data
export fails. There are a few comments from back in 2011 where the
signature is missing.
Also some podmins maybe messed with signatures in their database, which
would also break the exports now.
closes #7637
Diffstat (limited to 'db')
-rw-r--r-- | db/migrate/20171009232054_cleanup_relayables_without_signature.rb | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/db/migrate/20171009232054_cleanup_relayables_without_signature.rb b/db/migrate/20171009232054_cleanup_relayables_without_signature.rb new file mode 100644 index 000000000..12af91f19 --- /dev/null +++ b/db/migrate/20171009232054_cleanup_relayables_without_signature.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +class CleanupRelayablesWithoutSignature < ActiveRecord::Migration[5.1] + class Comment < ApplicationRecord + belongs_to :commentable, polymorphic: true + + before_destroy do + Like.where(target_type: "Comment", target_id: id).destroy_all + ActsAsTaggableOn::Tagging.where(taggable_type: "Comment", taggable_id: id).destroy_all + end + + after_destroy do + commentable.update_comments_counter + end + end + + class Like < ApplicationRecord + belongs_to :target, polymorphic: true + + has_one :signature, class_name: "LikeSignature", dependent: :delete + + after_destroy do + target.update_likes_counter + end + end + + class PollParticipation < ApplicationRecord + belongs_to :poll_answer, counter_cache: :vote_count + end + + def up + cleanup_comments + cleanup_likes + cleanup_poll_participations + end + + def cleanup_comments + Comment.joins("INNER JOIN posts as post ON post.id = comments.commentable_id AND " \ + "comments.commentable_type = 'Post'") + .joins("INNER JOIN people as comment_author ON comment_author.id = comments.author_id") + .joins("INNER JOIN people as post_author ON post_author.id = post.author_id") + .where("comment_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \ + "AND NOT EXISTS(" \ + "SELECT NULL FROM comment_signatures WHERE comment_signatures.comment_id = comments.id" \ + ")") + .destroy_all + end + + def cleanup_likes + Like.joins("INNER JOIN posts as post ON post.id = likes.target_id AND likes.target_type = 'Post'") + .joins("INNER JOIN people as like_author ON like_author.id = likes.author_id") + .joins("INNER JOIN people as post_author ON post_author.id = post.author_id") + .where("like_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \ + "AND NOT EXISTS(" \ + "SELECT NULL FROM like_signatures WHERE like_signatures.like_id = likes.id" \ + ")") + .destroy_all + Like.joins("INNER JOIN comments as comment ON comment.id = likes.target_id AND likes.target_type = 'Comment'") + .joins("INNER JOIN posts as post ON post.id = comment.commentable_id AND comment.commentable_type = 'Post'") + .joins("INNER JOIN people as like_author ON like_author.id = likes.author_id") + .joins("INNER JOIN people as post_author ON post_author.id = post.author_id") + .where("like_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \ + "AND NOT EXISTS(" \ + "SELECT NULL FROM like_signatures WHERE like_signatures.like_id = likes.id" \ + ")") + .destroy_all + end + + def cleanup_poll_participations + PollParticipation.joins("INNER JOIN polls as poll ON poll.id = poll_participations.poll_id") + .joins("INNER JOIN posts as post ON post.id = poll.status_message_id") + .joins("INNER JOIN people as pp_author ON pp_author.id = poll_participations.author_id") + .joins("INNER JOIN people as post_author ON post_author.id = post.author_id") + .where("pp_author.owner_id IS NULL AND post_author.owner_id IS NOT NULL " \ + "AND NOT EXISTS(" \ + "SELECT NULL FROM poll_participation_signatures " \ + "WHERE poll_participation_signatures.poll_participation_id = poll_participations.id" \ + ")") + .destroy_all + end +end |