# 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 do |comment, i| posts << post_from_comment(comment, i, @question) end answers.each do |answer| posts << post_from_answer(answer) comments = answer['comments'] comments.each_with_index do |comment, i| posts << post_from_comment(comment, i, answer) end end order_replies posts end def order_replies(posts) posts = posts.sort_by { |p| p[:created_at] } posts.each_with_index do |p, i| p[:post_number] = i + 2 end 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