# Federated Computer, Inc. # David Sainty 2024 A.D. # Gossamer Threads to Discourse -- CleanUp Script # v0.5 We need to handle deletion of topic posts -- delete all posts in topic and then delete topic itself require 'mysql2' require 'active_record' # require 'concurrent-ruby' require File.expand_path("../../../../config/environment", __FILE__) require File.expand_path("../../../../script/import_scripts/base", __FILE__) class GossamerForumsDestroyDeletedPosts < ImportScripts::Base def initialize super begin # Initialize MySQL client to connect to Gossamer Forums database @mysql_client = Mysql2::Client.new( host: "slowtwitch.northend.network", username: "admin", password: "yxnh93Ybbz2Nm8#mp28zCVv", database: "slowtwitch" ) rescue Mysql2::Error => e puts "Error connecting to MySQL: #{e.message}" exit 1 end end # Define a method to find a post by custom field def find_post_by_custom_field(post_id) puts "DestroyDeletedPosts: Searching for post with original_gossamer_id: #{post_id}" post_custom_field = PostCustomField.find_by(name: 'original_gossamer_id', value: post_id.to_s) if post_custom_field post = post_custom_field.post puts "DestroyDeletedPosts: Found post with id: #{post.id}" post else puts "DestroyDeletedPosts: No post found with original_gossamer_id: #{post_id}" nil end end # Define a method to delete all posts in a topic def delete_all_posts_in_topic(topic_id) posts = Post.where(topic_id: topic_id) posts.each do |post| puts "DELETE ALL POSTS --- DiscourseDeletedPosts: Deleting post with id: #{post.id}" # post.destroy end end # Define a method to delete a topic def delete_topic(topic_id) topic = Topic.find_by(id: topic_id) if topic puts "DELETE TOPIC --- DiscourseDeletedPosts: Deleting topic with id: #{topic_id}" # topic.destroy end end # Define the method to delete posts based on the Gossamer Forums flag def destroy_deleted_posts_from_gossamer_with_user(username) # Query the user ID from the legacy MySQL database user_result = @mysql_client.query("SELECT user_id FROM gforum_User WHERE user_username = '#{username}' LIMIT 1") user_id_row = user_result.first if user_id_row.nil? puts "DiscourseDeletedPosts: No user found with username: #{username}" return end user_id = user_id_row['user_id'] # Find all posts marked as deleted by the given user posts_result = @mysql_client.query("SELECT post_id FROM gforum_Post WHERE post_deleted = 1 AND user_id_fk = #{user_id}") posts_result.each do |legacy_post| post_id = legacy_post['post_id'] # Look for the post in Discourse by custom field post = find_post_by_custom_field(post_id) if post # Check if this post is the topic post if post.post_number == 1 topic_id = post.topic_id # Delete all posts in the topic delete_all_posts_in_topic(topic_id) # Delete the topic itself delete_topic(topic_id) else # If not the topic post, just delete the individual post puts "DELETE POST --- DestroyDeletedPosts: Deleting post with id: #{post.id}" # post.destroy end end end end def perform_deleted_destroy puts "Destroy Deleted Posts beginning!" # destroy_deleted_posts_from_gossamer destroy_deleted_posts_from_gossamer_with_user('spudone') puts "Destroy Deleted Posts complete!" end end GossamerForumsDestroyDeletedPosts.new.perform_deleted_destroy