mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 22:39:36 +08:00
124 lines
3.3 KiB
Ruby
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
|