discourse/app/models/stat.rb
Vinoth Kannan 9dc6325821
DEV: add logo URL and locale details to the Discover stats. (#26320)
We will be collecting the logo URL and the site's default locale values along with existing basic details to display the site on the Discourse Discover listing page. It will be included only if the site is opted-in by enabling the "`include_in_discourse_discover`" site setting.

Also, we no longer going to use `about.json` and `site/statistics.json` endpoints retrieve these data. We will be using only the `site/basic-info.json` endpoint.
2024-04-04 00:22:28 +05:30

62 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class Stat
def initialize(name, show_in_ui: false, expose_via_api: false, &block)
@name = name
@show_in_ui = show_in_ui
@expose_via_api = expose_via_api
@block = block
end
attr_reader :name, :expose_via_api, :show_in_ui
def calculate
@block.call.transform_keys { |key| build_key(key) }
rescue StandardError => err
Discourse.warn_exception(err, message: "Unexpected error when collecting #{@name} About stats.")
{}
end
def self.all_stats
calculate(_all_stats)
end
def self.api_stats
calculate(_api_stats)
end
private
def build_key(key)
"#{@name}_#{key}".to_sym
end
def self._all_stats
core_stats.concat(plugin_stats)
end
def self.calculate(stats)
stats.map { |stat| stat.calculate }.reduce(Hash.new, :merge)
end
def self.core_stats
[
Stat.new("topics", show_in_ui: true, expose_via_api: true) { Statistics.topics },
Stat.new("posts", show_in_ui: true, expose_via_api: true) { Statistics.posts },
Stat.new("users", show_in_ui: true, expose_via_api: true) { Statistics.users },
Stat.new("active_users", show_in_ui: true, expose_via_api: true) { Statistics.active_users },
Stat.new("likes", show_in_ui: true, expose_via_api: true) { Statistics.likes },
]
end
def self._api_stats
_all_stats.select { |stat| stat.expose_via_api }
end
def self.plugin_stats
DiscoursePluginRegistry.stats
end
private_class_method :_all_stats, :calculate, :core_stats, :_api_stats, :plugin_stats
end