discourse/script/import_scripts/nodebb/redis.rb

110 lines
2.6 KiB
Ruby

require 'redis'
module NodeBB
class Redis
attr_reader :redis
def initialize(params)
@redis = ::Redis.new(params)
end
def groups
group_keys = redis.zrange('groups:visible:createtime', 0, -1)
group_keys.map { |group_key| group(group_key) }
end
def group(id)
group = redis.hgetall("group:#{id}")
group["createtime"] = timestamp_to_date(group["createtime"])
group["member_ids"] = redis.zrange("group:#{id}:members", 0, -1)
group["owner_ids"] = redis.smembers("group:#{id}:owners")
group
end
def users
user_keys = redis.zrange('users:joindate', 0, -1)
user_keys.map { |user_key| user(user_key) }
end
def user(id)
user = redis.hgetall("user:#{id}")
user["joindate"] = timestamp_to_date(user["joindate"])
user["lastonline"] = timestamp_to_date(user["lastonline"])
user
end
def categories
category_keys = redis.zrange('categories:cid', 0, -1)
{}.tap do |categories|
category_keys.each do |category_key|
category = redis.hgetall("category:#{category_key}")
categories[category['cid']] = category
end
end
end
def topics(offset = 0, page_size = 2000)
# redis get keys inclusive
# so we move the offset a bit to continue in the next item
offset = offset + 1 unless offset == 0
from = offset
to = page_size + offset
topic_keys = redis.zrange('topics:tid', from, to)
topic_keys.map { |topic_key| topic(topic_key) }
end
def topic(id)
topic = redis.hgetall("topic:#{id}")
topic["lastposttime"] = timestamp_to_date(topic["lastposttime"])
topic["timestamp"] = timestamp_to_date(topic["timestamp"])
topic["mainpost"] = post(topic["mainPid"])
topic
end
def topic_count
redis.zcard('topics:tid')
end
def posts(offset = 0, page_size = 2000)
# redis get keys inclusive
# so we move the offset a bit to continue in the next item
offset = offset + 1 unless offset == 0
from = offset
to = page_size + offset
post_keys = redis.zrange('posts:pid', from, to)
post_keys.map { |post_key| post(post_key) }
end
def post(id)
post = redis.hgetall("post:#{id}")
post["timestamp"] = timestamp_to_date(post["timestamp"])
post["upvoted_by"] = redis.smembers("pid:#{id}:upvote")
post
end
def post_count
redis.zcard('posts:pid')
end
private
def timestamp_to_date(createtime)
Time.at(createtime[0..-4].to_i).utc if createtime
end
end
end