add mongo adapter to nodebb importer (#8000)

add mongo adapter to nodebb importer (#8000)

diff --git a/script/import_scripts/nodebb/mongo.rb b/script/import_scripts/nodebb/mongo.rb
new file mode 100644
index 0000000..b2d8c73
--- /dev/null
+++ b/script/import_scripts/nodebb/mongo.rb
@@ -0,0 +1,123 @@
+# frozen_string_literal: true
+
+require 'mongo'
+
+module NodeBB
+  class Mongo
+    attr_reader :mongo
+
+    ::Mongo::Logger.logger.level = Logger::WARN
+
+    def initialize(params)
+      client = ::Mongo::Client.new(params)
+      @mongo = client[:objects]
+    end
+
+    def groups
+      group_keys = mongo.find( { :_key => "groups:visible:createtime" } ).pluck(:value)
+
+      group_keys.map { |group_key| group(group_key) }
+    end
+
+    def group(id)
+      group = mongo.find( { :_key => "group:#{id}" } ).first
+      group["createtime"] = timestamp_to_date(group["createtime"])
+      group["member_ids"] = mongo.find( { :_key => "group:#{id}:members" } ).pluck(:value)
+      if mongo.find( { :_key => "group:#{id}:owners" } ).first
+        group["owner_ids"] = mongo.find( { :_key => "group:#{id}:owners" } ).first[:members]
+      else
+        group["owner_ids"] = []
+      end
+
+      group
+    end
+
+    def users
+      user_keys = mongo.find( { :_key => "users:joindate" } ).pluck(:value)
+
+      user_keys.map { |user_key| user(user_key) }
+    end
+
+    def user(id)
+      user = mongo.find( { :_key => "user:#{id}" } ).first
+
+      user["joindate"] = timestamp_to_date(user["joindate"])
+      user["lastonline"] = timestamp_to_date(user["lastonline"])
+      user['banned'] = user['banned'].to_s
+      user['uid'] = user['uid'].to_s
+
+      user
+    end
+
+    def categories
+      category_keys = mongo.find( { :_key => "categories:cid" } ).pluck(:value)
+
+      {}.tap do |categories|
+        category_keys.each do |category_key|
+          category = mongo.find( { :_key => "category:#{category_key}" } ).first
+
+          category['parentCid'] = category['parentCid'].to_s
+          category['disabled'] = category['disabled'].to_s
+          category['cid'] = category['cid'].to_s
+
+          categories[category['cid']] = category
+        end
+      end
+    end
+
+    def topics(offset = 0, page_size = 2000)
+      topic_keys = mongo.find( { :_key => 'topics:tid' } ).skip(offset).limit(page_size).pluck(:value)
+
+      topic_keys.map { |topic_key| topic(topic_key) }
+    end
+
+    def topic(id)
+      topic = mongo.find( { :_key => "topic:#{id}" } ).first
+
+      topic["lastposttime"] = timestamp_to_date(topic["lastposttime"])
+      topic["timestamp"] = timestamp_to_date(topic["timestamp"])
+      topic["mainpost"] = post(topic["mainPid"])
+      topic["mainPid"] = topic["mainPid"].to_s
+      topic["deleted"] = topic["deleted"].to_s
+      topic["pinned"] = topic["pinned"].to_s
+      topic["locked"] = topic["locked"].to_s
+
+      topic
+    end
+
+    def topic_count
+      mongo.find( { :_key => 'topics:tid' } ).count
+    end
+
+    def posts(offset = 0, page_size = 2000)
+      post_keys = mongo.find( { :_key => 'posts:pid' } ).skip(offset).limit(page_size).pluck(:value)
+
+      post_keys.map { |post_key| post(post_key) }
+    end
+
+    def post(id)
+      post = mongo.find( { :_key => "post:#{id}" } ).first
+      post["timestamp"] = timestamp_to_date(post["timestamp"])
+      if post["upvoted_by"] = mongo.find( { :_key => "pid:#{id}:upvote" } ).first
+        post["upvoted_by"] = mongo.find( { :_key => "pid:#{id}:upvote" } ).first[:members]
+      else
+        post["upvoted_by"] = []
+      end
+
+      post["pid"] = post["pid"].to_s
+      post["deleted"] = post["deleted"].to_s
+
+      post
+    end
+
+    def post_count
+      mongo.find( { :_key => 'posts:pid' } ).count
+    end
+
+    private
+
+    def timestamp_to_date(createtime)
+      Time.at(createtime.to_s[0..-6].to_i).utc if createtime
+    end
+  end
+end
diff --git a/script/import_scripts/nodebb/nodebb.rb b/script/import_scripts/nodebb/nodebb.rb
index 29a0ee7..45fe69c 100644
--- a/script/import_scripts/nodebb/nodebb.rb
+++ b/script/import_scripts/nodebb/nodebb.rb
@@ -1,7 +1,8 @@
 # frozen_string_literal: true
 
-require_relative '../base.rb'
+require_relative '../base'
 require_relative './redis'
+require_relative './mongo'
 
 class ImportScripts::NodeBB < ImportScripts::Base
   # CHANGE THESE BEFORE RUNNING THE IMPORTER
@@ -12,8 +13,10 @@ class ImportScripts::NodeBB < ImportScripts::Base
   def initialize
     super
 
-    adapter = NodeBB::Redis
+    # adapter = NodeBB::Mongo
+    # @client = adapter.new('mongodb://127.0.0.1:27017/nodebb')
 
+    adapter = NodeBB::Redis
     @client = adapter.new(
       host: "localhost",
       port: "6379",

GitHub sha: 6cc9fe42

1 Like

DEV: Make Rubocop happy