mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 09:26:54 -06:00
30990006a9
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
112 lines
2.7 KiB
Ruby
112 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 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
|