mirror of
https://github.com/discourse/discourse.git
synced 2024-12-05 08:03:40 +08:00
41 lines
1.1 KiB
Ruby
41 lines
1.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class Chat::Api::HintsController < ApplicationController
|
||
|
before_action :ensure_logged_in
|
||
|
|
||
|
def check_group_mentions
|
||
|
RateLimiter.new(current_user, "group_mention_hints", 5, 10.seconds).performed!
|
||
|
group_names = params[:mentions]
|
||
|
|
||
|
raise Discourse::InvalidParameters.new(:mentions) if group_names.blank?
|
||
|
|
||
|
visible_groups =
|
||
|
Group.where("LOWER(name) IN (?)", group_names).visible_groups(current_user).pluck(:name)
|
||
|
|
||
|
mentionable_groups = filter_mentionable_groups(visible_groups)
|
||
|
|
||
|
result = {
|
||
|
unreachable: visible_groups - mentionable_groups.map(&:name),
|
||
|
over_members_limit:
|
||
|
mentionable_groups
|
||
|
.select { |g| g.user_count > SiteSetting.max_users_notified_per_group_mention }
|
||
|
.map(&:name),
|
||
|
}
|
||
|
|
||
|
result[:invalid] = (group_names - result[:unreachable]) - result[:over_members_limit]
|
||
|
|
||
|
render json: result
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def filter_mentionable_groups(group_names)
|
||
|
return [] if group_names.empty?
|
||
|
|
||
|
Group
|
||
|
.select(:name, :user_count)
|
||
|
.where(name: group_names)
|
||
|
.mentionable(current_user, include_public: false)
|
||
|
end
|
||
|
end
|