mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 18:18:33 +08: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
113 lines
2.9 KiB
Ruby
113 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
Report.add_report('post_edits') do |report|
|
|
category_filter = report.filters.dig(:category)
|
|
report.add_filter('category', default: category_filter)
|
|
|
|
report.modes = [:table]
|
|
|
|
report.labels = [
|
|
{
|
|
type: :post,
|
|
properties: {
|
|
topic_id: :topic_id,
|
|
number: :post_number,
|
|
truncated_raw: :post_raw
|
|
},
|
|
title: I18n.t("reports.post_edits.labels.post")
|
|
},
|
|
{
|
|
type: :user,
|
|
properties: {
|
|
username: :editor_username,
|
|
id: :editor_id,
|
|
avatar: :editor_avatar_template,
|
|
},
|
|
title: I18n.t("reports.post_edits.labels.editor")
|
|
},
|
|
{
|
|
type: :user,
|
|
properties: {
|
|
username: :author_username,
|
|
id: :author_id,
|
|
avatar: :author_avatar_template,
|
|
},
|
|
title: I18n.t("reports.post_edits.labels.author")
|
|
},
|
|
{
|
|
type: :text,
|
|
property: :edit_reason,
|
|
title: I18n.t("reports.post_edits.labels.edit_reason")
|
|
},
|
|
]
|
|
|
|
report.data = []
|
|
|
|
sql = <<~SQL
|
|
WITH period_revisions AS (
|
|
SELECT pr.user_id AS editor_id,
|
|
pr.number AS revision_version,
|
|
pr.created_at,
|
|
pr.post_id,
|
|
u.username AS editor_username,
|
|
u.uploaded_avatar_id as editor_avatar_id
|
|
FROM post_revisions pr
|
|
JOIN users u
|
|
ON u.id = pr.user_id
|
|
WHERE u.id > 0
|
|
AND pr.created_at >= '#{report.start_date}'
|
|
AND pr.created_at <= '#{report.end_date}'
|
|
ORDER BY pr.created_at DESC
|
|
LIMIT #{report.limit || 20}
|
|
)
|
|
SELECT pr.editor_id,
|
|
pr.editor_username,
|
|
pr.editor_avatar_id,
|
|
p.user_id AS author_id,
|
|
u.username AS author_username,
|
|
u.uploaded_avatar_id AS author_avatar_id,
|
|
pr.revision_version,
|
|
p.version AS post_version,
|
|
pr.post_id,
|
|
left(p.raw, 40) AS post_raw,
|
|
p.topic_id,
|
|
p.post_number,
|
|
p.edit_reason,
|
|
pr.created_at
|
|
FROM period_revisions pr
|
|
JOIN posts p
|
|
ON p.id = pr.post_id
|
|
JOIN users u
|
|
ON u.id = p.user_id
|
|
SQL
|
|
|
|
if category_filter
|
|
sql += <<~SQL
|
|
JOIN topics t
|
|
ON t.id = p.topic_id
|
|
WHERE p.user_id != editor_id AND t.category_id = ? OR t.category_id IN (SELECT id FROM categories WHERE categories.parent_category_id = ?)
|
|
SQL
|
|
else
|
|
sql += "WHERE p.user_id != editor_id"
|
|
end
|
|
|
|
result = category_filter ? DB.query(sql, category_filter, category_filter) : DB.query(sql)
|
|
|
|
result.each do |r|
|
|
revision = {}
|
|
revision[:editor_id] = r.editor_id
|
|
revision[:editor_username] = r.editor_username
|
|
revision[:editor_avatar_template] = User.avatar_template(r.editor_username, r.editor_avatar_id)
|
|
revision[:author_id] = r.author_id
|
|
revision[:author_username] = r.author_username
|
|
revision[:author_avatar_template] = User.avatar_template(r.author_username, r.author_avatar_id)
|
|
revision[:edit_reason] = r.revision_version == r.post_version ? r.edit_reason : nil
|
|
revision[:created_at] = r.created_at
|
|
revision[:post_raw] = r.post_raw
|
|
revision[:topic_id] = r.topic_id
|
|
revision[:post_number] = r.post_number
|
|
|
|
report.data << revision
|
|
end
|
|
end
|