discourse/script/import_scripts/nodebb/mongo.rb

124 lines
3.3 KiB
Ruby

# 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