2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-08-12 04:59:00 +08:00
|
|
|
class About
|
2019-07-31 21:46:58 +08:00
|
|
|
class CategoryMods
|
|
|
|
include ActiveModel::Serialization
|
|
|
|
attr_reader :category_id, :moderators
|
|
|
|
|
|
|
|
def initialize(category_id, moderators)
|
|
|
|
@category_id = category_id
|
|
|
|
@moderators = moderators
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-08-12 04:59:00 +08:00
|
|
|
include ActiveModel::Serialization
|
2015-07-07 12:52:19 +08:00
|
|
|
include StatsCacheable
|
2014-08-12 04:59:00 +08:00
|
|
|
|
|
|
|
attr_accessor :moderators,
|
|
|
|
:admins
|
|
|
|
|
2015-07-07 12:52:19 +08:00
|
|
|
def self.stats_cache_key
|
|
|
|
'about-stats'
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.fetch_stats
|
|
|
|
About.new.stats
|
|
|
|
end
|
|
|
|
|
2019-07-31 21:46:58 +08:00
|
|
|
def initialize(user = nil)
|
|
|
|
@user = user
|
|
|
|
end
|
|
|
|
|
2014-08-12 06:15:35 +08:00
|
|
|
def version
|
|
|
|
Discourse::VERSION::STRING
|
|
|
|
end
|
|
|
|
|
2014-11-24 14:54:17 +08:00
|
|
|
def https
|
2016-06-27 17:26:43 +08:00
|
|
|
SiteSetting.force_https
|
2014-11-24 14:54:17 +08:00
|
|
|
end
|
|
|
|
|
2014-08-12 06:15:35 +08:00
|
|
|
def title
|
|
|
|
SiteSetting.title
|
|
|
|
end
|
|
|
|
|
|
|
|
def locale
|
|
|
|
SiteSetting.default_locale
|
|
|
|
end
|
|
|
|
|
|
|
|
def description
|
|
|
|
SiteSetting.site_description
|
|
|
|
end
|
|
|
|
|
2014-08-12 04:59:00 +08:00
|
|
|
def moderators
|
2014-08-21 00:42:33 +08:00
|
|
|
@moderators ||= User.where(moderator: true, admin: false)
|
2017-03-11 14:25:09 +08:00
|
|
|
.human_users
|
2019-01-15 19:55:22 +08:00
|
|
|
.order("last_seen_at DESC")
|
2014-08-12 04:59:00 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def admins
|
2019-01-15 19:55:22 +08:00
|
|
|
@admins ||= User.where(admin: true)
|
|
|
|
.human_users
|
|
|
|
.order("last_seen_at DESC")
|
2014-08-12 04:59:00 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def stats
|
|
|
|
@stats ||= {
|
|
|
|
topic_count: Topic.listable_topics.count,
|
|
|
|
post_count: Post.count,
|
2015-02-18 04:31:50 +08:00
|
|
|
user_count: User.real.count,
|
2014-08-12 04:59:00 +08:00
|
|
|
topics_7_days: Topic.listable_topics.where('created_at > ?', 7.days.ago).count,
|
2015-02-03 01:27:49 +08:00
|
|
|
topics_30_days: Topic.listable_topics.where('created_at > ?', 30.days.ago).count,
|
2014-08-12 04:59:00 +08:00
|
|
|
posts_7_days: Post.where('created_at > ?', 7.days.ago).count,
|
2015-02-03 01:27:49 +08:00
|
|
|
posts_30_days: Post.where('created_at > ?', 30.days.ago).count,
|
2014-08-12 06:15:35 +08:00
|
|
|
users_7_days: User.where('created_at > ?', 7.days.ago).count,
|
2015-02-03 01:27:49 +08:00
|
|
|
users_30_days: User.where('created_at > ?', 30.days.ago).count,
|
2015-01-31 06:23:52 +08:00
|
|
|
active_users_7_days: User.where('last_seen_at > ?', 7.days.ago).count,
|
2015-02-03 01:27:49 +08:00
|
|
|
active_users_30_days: User.where('last_seen_at > ?', 30.days.ago).count,
|
2014-08-12 06:15:35 +08:00
|
|
|
like_count: UserAction.where(action_type: UserAction::LIKE).count,
|
2015-02-03 01:27:49 +08:00
|
|
|
likes_7_days: UserAction.where(action_type: UserAction::LIKE).where("created_at > ?", 7.days.ago).count,
|
|
|
|
likes_30_days: UserAction.where(action_type: UserAction::LIKE).where("created_at > ?", 30.days.ago).count
|
2014-08-12 04:59:00 +08:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2019-07-31 21:46:58 +08:00
|
|
|
def category_moderators
|
2019-10-04 02:48:56 +08:00
|
|
|
allowed_cats = Guardian.new(@user).allowed_category_ids
|
|
|
|
return [] if allowed_cats.blank?
|
2021-03-28 16:25:30 +08:00
|
|
|
|
2019-10-04 02:48:56 +08:00
|
|
|
cats_with_mods = Category.where.not(reviewable_by_group_id: nil).pluck(:id)
|
2021-03-28 16:25:30 +08:00
|
|
|
|
2019-10-04 02:48:56 +08:00
|
|
|
category_ids = cats_with_mods & allowed_cats
|
2019-07-31 21:46:58 +08:00
|
|
|
return [] if category_ids.blank?
|
2019-10-04 02:48:56 +08:00
|
|
|
|
|
|
|
per_cat_limit = category_mods_limit / category_ids.size
|
|
|
|
per_cat_limit = 1 if per_cat_limit < 1
|
2021-03-28 16:25:30 +08:00
|
|
|
|
|
|
|
results = DB.query(<<~SQL, category_ids: category_ids)
|
|
|
|
SELECT c.id category_id
|
|
|
|
, (ARRAY_AGG(u.id ORDER BY u.last_seen_at DESC))[:#{per_cat_limit}] user_ids
|
|
|
|
FROM categories c
|
|
|
|
JOIN group_users gu ON gu.group_id = c.reviewable_by_group_id
|
|
|
|
JOIN users u ON u.id = gu.user_id
|
|
|
|
WHERE c.id IN (:category_ids)
|
|
|
|
GROUP BY c.id
|
|
|
|
ORDER BY c.position
|
2019-07-31 21:46:58 +08:00
|
|
|
SQL
|
2021-03-28 16:25:30 +08:00
|
|
|
|
|
|
|
moderators = User.where(id: results.map(&:user_ids).flatten.uniq).map { |u| [u.id, u] }.to_h
|
|
|
|
|
2019-07-31 21:46:58 +08:00
|
|
|
results.map do |row|
|
|
|
|
CategoryMods.new(row.category_id, row.user_ids.map { |id| moderators[id] })
|
|
|
|
end
|
|
|
|
end
|
2019-10-04 02:48:56 +08:00
|
|
|
|
|
|
|
def category_mods_limit
|
|
|
|
@category_mods_limit || 100
|
|
|
|
end
|
|
|
|
|
|
|
|
def category_mods_limit=(number)
|
|
|
|
@category_mods_limit = number
|
|
|
|
end
|
2014-08-12 04:59:00 +08:00
|
|
|
end
|