diff --git a/gossamer_forums.rb b/gossamer_forums.rb index d4a19f4..695e61c 100644 --- a/gossamer_forums.rb +++ b/gossamer_forums.rb @@ -1,7 +1,7 @@ # Federated Computer, Inc. # David Sainty 2024 A.D. # Gossamer Threads to Discourse -- Migration-Import Script -# v0.57 Improve personal message handling and add commented line for doing specified blocks of PMs. +# v0.58 Final user import and personal message import run require 'mysql2' require 'open-uri' @@ -625,26 +625,35 @@ class GossamerForumsImporter < ImportScripts::Base # Fetch all users from Gossamer Forums execute_query("SELECT * FROM gforum_User").each do |row| - users << { - id: row['user_id'], - username: sanitize_username(row['user_username'], row['user_email'], row['user_real_name']), - email: row['user_email'], - created_at: Time.at(row['user_registered']), - updated_at: Time.at(row['user_last_seen']), - name: row['user_real_name'], - title: row['user_title'], - bio_raw: row['user_about'] || "", - website: row['user_homepage'], - location: row['user_location'], - custom_fields: { - md5_password: row['user_password'], - original_username: row['user_username'], - original_gossamer_id: row['user_id'] + username = sanitize_username(row['user_username'], row['user_email'], row['user_real_name']) + email = row['user_email'] + + # Check if the user already exists in Discourse by username or email + existing_user = User.find_by(username: username) || User.find_by(email: email) + + # Only add the user if they do not already exist + unless existing_user + users << { + id: row['user_id'], + username: username, + email: email, + created_at: Time.at(row['user_registered']), + updated_at: Time.at(row['user_last_seen']), + name: row['user_real_name'], + title: row['user_title'], + bio_raw: row['user_about'] || "", + website: row['user_homepage'], + location: row['user_location'], + custom_fields: { + md5_password: row['user_password'], + original_username: row['user_username'], + original_gossamer_id: row['user_id'] + } } - } + end end - # Create or update users in Discourse + # Create new users in Discourse create_users(users) do |user| # insert_user_id_mapping(user[:id], user.id) user @@ -1350,7 +1359,7 @@ class GossamerForumsImporter < ImportScripts::Base topic_created = true # rescue ActiveRecord::RecordInvalid => e - rescue => e + rescue => e if e.message.include?("Title has already been used") unique_title = "#{title} (#{suffix})" suffix += 1 @@ -1529,7 +1538,7 @@ class GossamerForumsImporter < ImportScripts::Base # Import topics and posts from Gossamer Forums to Discourse - def import_topics_and_posts_with_attachments + def import_topics_and_posts puts "Importing topics and posts with attachments..." # topic_last_post_time = {} @@ -1540,16 +1549,17 @@ class GossamerForumsImporter < ImportScripts::Base # topic_post_numbers = Hash.new { |hash, key| hash[key] = 0 } # Fetch the highest old_post_id from the url_map table - highest_old_post_id = fetch_highest_old_post_id.to_i - puts "Highest (OP) old_post_id in url_map: #{highest_old_post_id}" - highest_processed_post_id = fetch_highest_processed_post_id.to_i +# highest_old_post_id = fetch_highest_old_post_id.to_i +# puts "Highest (OP) old_post_id in url_map: #{highest_old_post_id}" +### highest_processed_post_id = fetch_highest_processed_post_id.to_i + highest_processed_post_id = 8179621 puts "Highest processed post_id: #{highest_processed_post_id}" # OVERRIDE........ # Attachment example: highest_processed_post_id = 1359862 # Execute the query to get all posts ordered by post_id - execute_query("SELECT post_id, user_id_fk, forum_id_fk, post_root_id, post_subject, post_time, post_message, post_father_id, post_likes, post_replies FROM gforum_Post ORDER BY post_id").each do |row| + execute_query("SELECT post_id, user_id_fk, forum_id_fk, post_root_id, post_subject, post_time, post_message, post_father_id, post_likes, post_replies FROM gforum_Post WHERE post_id > #{highest_processed_post_id} ORDER BY post_id").each do |row| post_id = row['post_id'].to_i # Skip posts that have already been processed @@ -1560,8 +1570,18 @@ class GossamerForumsImporter < ImportScripts::Base puts "Processing post_id #{row['post_id']} post_id #{row['post_root_id']} post_subject/title #{row['post_subject']} forum_id_fk/category_id #{row['forum_id_fk']}" # discourse_user_id = @user_id_map[row['user_id_fk']] - # Fetch the Discourse user and category IP mappings + # Fetch the Discourse user_id based on Gossamer data and mapping discourse_user_id = fetch_user_id_mapping(row['user_id_fk']) + + # Check to be certain user has not been deleted, etc. + if discourse_user_id.nil? || discourse_user_id == 0 + puts "discourse_user_id is NIL/ZERO for post_id #{row['post_id']}" + discourse_former_user = User.find_by(username: 'Former_User') + discourse_user_id = discourse_former_user.id + puts "discourse_user_id is NOW Former_User id #{discourse_user_id} for post_id #{row['post_id']}" + end + + # Fetch the Discourse category_id based on Gossamer data and mapping discourse_category_id = fetch_category_id_mapping(row['forum_id_fk']) puts "discourse_user_id #{discourse_user_id} discourse_category_id #{discourse_category_id}" next unless discourse_user_id && discourse_category_id @@ -1634,7 +1654,7 @@ class GossamerForumsImporter < ImportScripts::Base # Sanitize the post message sanitized_post_message = sanitize_post_message(row['post_message']) - puts "CREATE POST topic.id #{topic.id} discourse_user_id #{discourse_user_id}" + puts "CREATE TOPIC POST topic.id #{topic.id} discourse_user_id #{discourse_user_id}" # Increment the number of posts in the given topic. # topic_post_numbers[topic.id] += 1 @@ -2019,25 +2039,25 @@ class GossamerForumsImporter < ImportScripts::Base puts "Starting Gossamer Forums import... #{timestamp}" # add_former_user -# import_users + import_users -# generate_user_id_mapping -# export_username_mapping_to_csv("/bitnami/discourse/sqlite/gossamer-migration-username-mapping#{timestamp}") + generate_user_id_mapping + export_username_mapping_to_csv("/bitnami/discourse/sqlite/gossamer-migration-username-mapping#{timestamp}") # set_user_bio_images # import_categories -####### import_topics_and_posts_with_attachments +## import_topics_and_posts # threaded_topic_import -# update_topic_stats -# update_user_stats -# export_url_mapping_to_csv("/bitnami/discourse/sqlite/gossamer-migration-url-mapping#{timestamp}") -# export_nginx_rewrite_rules("/bitnami/discourse/sqlite/gossamer-redirects#{timestamp}.conf") +### update_topic_stats +### update_user_stats +#### export_url_mapping_to_csv("/bitnami/discourse/sqlite/gossamer-migration-url-mapping#{timestamp}") +#### export_nginx_rewrite_rules("/bitnami/discourse/sqlite/gossamer-redirects#{timestamp}.conf") -# update_existing_personal_message_activity - import_personal_messages +##### update_existing_personal_message_activity + import_personal_messages puts "Gossamer Forums import complete! #{timestamp}" end