105 lines
2.7 KiB
Ruby
105 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "json"
|
|
require "cgi"
|
|
require "time"
|
|
|
|
class QuandoraQuestion
|
|
def initialize(question_json)
|
|
@question = JSON.parse question_json
|
|
end
|
|
|
|
def topic
|
|
topic = {}
|
|
topic[:id] = @question["uid"]
|
|
topic[:author_id] = @question["author"]["uid"]
|
|
topic[:title] = unescape @question["title"]
|
|
topic[:raw] = unescape @question["content"]
|
|
topic[:created_at] = Time.parse @question["created"]
|
|
topic
|
|
end
|
|
|
|
def users
|
|
users = {}
|
|
user = user_from_author @question["author"]
|
|
users[user[:id]] = user
|
|
replies.each do |reply|
|
|
user = user_from_author reply[:author]
|
|
users[user[:id]] = user
|
|
end
|
|
users.values.to_a
|
|
end
|
|
|
|
def user_from_author(author)
|
|
email = author["email"]
|
|
email = "#{author["uid"]}@noemail.com" unless email
|
|
|
|
user = {}
|
|
user[:id] = author["uid"]
|
|
user[:name] = "#{author["firstName"]} #{author["lastName"]}"
|
|
user[:email] = email
|
|
user[:staged] = true
|
|
user
|
|
end
|
|
|
|
def replies
|
|
posts = []
|
|
answers = @question["answersList"]
|
|
comments = @question["comments"]
|
|
comments.each_with_index { |comment, i| posts << post_from_comment(comment, i, @question) }
|
|
answers.each do |answer|
|
|
posts << post_from_answer(answer)
|
|
comments = answer["comments"]
|
|
comments.each_with_index { |comment, i| posts << post_from_comment(comment, i, answer) }
|
|
end
|
|
order_replies posts
|
|
end
|
|
|
|
def order_replies(posts)
|
|
posts = posts.sort_by { |p| p[:created_at] }
|
|
posts.each_with_index { |p, i| p[:post_number] = i + 2 }
|
|
posts.each do |p|
|
|
parent = posts.select { |pp| pp[:id] == p[:parent_id] }
|
|
p[:reply_to_post_number] = parent[0][:post_number] if parent.size > 0
|
|
end
|
|
posts
|
|
end
|
|
|
|
def post_from_answer(answer)
|
|
post = {}
|
|
post[:id] = answer["uid"]
|
|
post[:parent_id] = @question["uid"]
|
|
post[:author] = answer["author"]
|
|
post[:author_id] = answer["author"]["uid"]
|
|
post[:raw] = unescape answer["content"]
|
|
post[:created_at] = Time.parse answer["created"]
|
|
post
|
|
end
|
|
|
|
def post_from_comment(comment, index, parent)
|
|
if comment["created"]
|
|
created_at = Time.parse comment["created"]
|
|
else
|
|
created_at = Time.parse parent["created"]
|
|
end
|
|
parent_id = parent["uid"]
|
|
parent_id = "#{parent["uid"]}-#{index - 1}" if index > 0
|
|
post = {}
|
|
id = "#{parent["uid"]}-#{index}"
|
|
post[:id] = id
|
|
post[:parent_id] = parent_id
|
|
post[:author] = comment["author"]
|
|
post[:author_id] = comment["author"]["uid"]
|
|
post[:raw] = unescape comment["text"]
|
|
post[:created_at] = created_at
|
|
post
|
|
end
|
|
|
|
private
|
|
|
|
def unescape(html)
|
|
return nil unless html
|
|
CGI.unescapeHTML html
|
|
end
|
|
end
|