discourse/app/controllers/admin/reports_controller.rb

84 lines
2.0 KiB
Ruby

require_dependency 'report'
class Admin::ReportsController < Admin::AdminController
def index
reports_methods = Report.singleton_methods.grep(/^report_(?!about)/)
reports = reports_methods.map do |name|
type = name.to_s.gsub('report_', '')
description = I18n.t("reports.#{type}.description", default: '')
{
type: type,
title: I18n.t("reports.#{type}.title"),
description: description.presence ? description : nil,
}
end
render_json_dump(reports: reports.sort_by { |report| report[:title] })
end
def show
report_type = params[:type]
raise Discourse::NotFound unless report_type =~ /^[a-z0-9\_]+$/
start_date = (params[:start_date].present? ? params[:start_date].to_date : 30.days.ago).beginning_of_day
end_date = (params[:end_date].present? ? params[:end_date].to_date : start_date + 30.days).end_of_day
if params.has_key?(:category_id) && params[:category_id].to_i > 0
category_id = params[:category_id].to_i
else
category_id = nil
end
if params.has_key?(:group_id) && params[:group_id].to_i > 0
group_id = params[:group_id].to_i
else
group_id = nil
end
facets = nil
if Array === params[:facets]
facets = params[:facets].map { |s| s.to_s.to_sym }
end
limit = nil
if params.has_key?(:limit) && params[:limit].to_i > 0
limit = params[:limit].to_i
end
args = {
start_date: start_date,
end_date: end_date,
category_id: category_id,
group_id: group_id,
facets: facets,
limit: limit
}
report = nil
if (params[:cache])
report = Report.find_cached(report_type, args)
end
if report
return render_json_dump(report: report)
end
hijack do
report = Report.find(report_type, args)
raise Discourse::NotFound if report.blank?
if (params[:cache])
Report.cache(report, 35.minutes)
end
render_json_dump(report: report)
end
end
end