discourse-import_scripts/goss-cleanup.rb

163 lines
4.7 KiB
Ruby

# Federated Computer, Inc.
# David Sainty <saint@federated.computer> 2024 A.D.
# Gossamer Threads to Discourse -- CleanUp Script
# v0.16 Add parallel deletion of posts.
require 'concurrent-ruby'
require File.expand_path("../../../../config/environment", __FILE__)
class GossamerForumsCleaner
def cleanup_users
puts "Cleaning up imported users..."
# Find all users imported from Gossamer Forums and delete them
UserCustomField.where(name: 'original_gossamer_id').each do |field|
user = User.find_by(id: field.user_id)
if user
puts "Deleting user #{user.username} (ID: #{user.id})"
user.destroy
end
end
end
def cleanup_categories
puts "Cleaning up imported categories..."
# Find all categories that were imported and delete them
CategoryCustomField.where(name: 'original_gossamer_id').each do |field|
category = Category.find_by(id: field.category_id)
if category
puts "Deleting category #{category.name} (ID: #{category.id})"
category.destroy
end
end
end
def cleanup_topics
puts "Cleaning up imported topics..."
# Find all topics that were imported and delete them
TopicCustomField.where(name: 'original_gossamer_id').each do |field|
topic = Topic.find_by(id: field.topic_id)
if topic
puts "Deleting topic #{topic.title} (ID: #{topic.id})"
# topic.posts.each do |post|
# puts "Deleting post #{post.id} in topic #{topic.id}"
# post.destroy
# end
topic.destroy
end
end
end
def cleanup_topics_former_user
puts "Cleaning up imported topics..."
# Find all topics that were imported
TopicCustomField.where(name: 'original_gossamer_id').each do |field|
topic = Topic.find_by(id: field.topic_id)
next unless topic
# Fetch the first post in the topic
first_post = topic.posts.order(:created_at).first
# Check if the first post has user_id 2
if first_post && first_post.user_id == 2
puts "Deleting topic #{topic.title} (ID: #{topic.id})"
# Destroy all posts in the topic
topic.posts.each do |post|
puts "Deleting post #{post.id} in topic #{topic.id}"
post.destroy
end
# Destroy the topic itself
topic.destroy
end
end
end
def cleanup_topics_with_invalid_posts_count
puts "Cleaning up topics with invalid posts_count..."
# Iterate through all topics
Topic.where("posts_count IS NULL OR posts_count = -1").find_each do |topic|
puts "Identified topic for deletion: Title: #{topic.title} Topic ID: #{topic.id}"
# Destroy all posts in the topic
# topic.posts.each do |post|
# puts "Deleting post #{post.id} in topic #{topic.id}"
# post.destroy
# end
#
# # Destroy the topic itself
# topic.destroy
end
end
def cleanup_posts
puts "Cleaning up imported posts..."
# Find all posts that were imported and delete them
PostCustomField.where(name: 'original_gossamer_id').each do |field|
post = Post.find_by(id: field.post_id)
if post
puts "Deleting post #{post.id} (ID: #{post.id})"
post.destroy
end
end
end
def cleanup_posts_parallel
puts "Cleaning up imported posts..."
# Define the number of threads to use
num_threads = 8
pool = Concurrent::FixedThreadPool.new(num_threads)
PostCustomField.where(name: 'original_gossamer_id').in_batches(of: 1000) do |batch|
batch.each do |field|
pool.post do
post = Post.find_by(id: field.post_id)
if post
puts "Deleting post #{post.id} (ID: #{post.id})"
post.destroy
end
end
end
end
# Wait for all threads to complete
pool.shutdown
pool.wait_for_termination
end
def cleanup_messages
puts "Cleaning up imported personal messages..."
# Find all personal messages (inbox) that were imported and delete them
TopicCustomField.where(name: 'original_gossamer_msg_id').each do |field|
topic = Topic.find_by(id: field.topic_id)
if topic
puts "Deleting personal message topic #{topic.title} (ID: #{topic.id})"
topic.posts.each do |post|
puts "Deleting post #{post.id} in personal message topic #{topic.id}"
post.destroy
end
topic.destroy
end
end
end
def perform_cleanup
puts "Cleanup beginning!"
# cleanup_messages
# cleanup_topics
# cleanup_topics_former_user
cleanup_topics_with_invalid_posts_count
# cleanup_posts_parallel
# cleanup_categories
# cleanup_users
puts "Cleanup complete!"
end
end
GossamerForumsCleaner.new.perform_cleanup