110 lines
2.6 KiB
Ruby
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
|