如何根据当前用户组和主题位置创建主题过滤器

你好,

我正在开发一个插件,该插件根据主题发布的位置以及查看主题的用户所属的群组来过滤所有主题。其应用场景是:不同国家的客服团队处理来自各自地区的问题。

我是一名 Discourse 插件开发新手,还在学习如何实现这一功能。主题位置将由 Locations 插件处理,详见:Locations Plugin 🌍

我还会将需要此过滤视图的用户添加到一个群组,例如命名为 NA_queue 或 EU_queue。

该插件将检查用户是否已登录,以及是否设置了主群组。如果已设置,它将过滤所有主题,使其仅匹配当前用户所属的队列。

我认为这可以通过类似以下代码来实现:

after_initialize do
  require_dependency 'topic_query'

  # 如果用户已登录且设置了主群组

  # 需要获取用户的主群组
  # 需要获取主题的位置

  TopicQuery.add_custom_filter(:location) do |results, topic_query|
    filter = "SOME SQL QUERY HERE"
    results = results.joins("{filter}")

    results
  end
end

这是否是解决我问题的合适方法?
另外,有人对 SQL 查询的内容或如何获取上述两处注释信息有任何建议吗?

我没有权限更新我的问题,所以只能在这里发布。更新:

我正纠结于如何从浏览器端的 JavaScript 将当前用户传递到服务器端运行的代码中。外面可能已有相关指南解释了这一点,但我尚未找到 :frowning:

以下代码作为帖子位置的过滤器效果很好:

after_initialize do

  # 从客户端以某种方式传递当前用户
  def self.filter_on_user

    require_dependency 'topic_query'

    # 如果当前用户有主要群组,则设置国家代码
    # 暂时假设美国用户的国家代码为 US
    countrycode = "us"

    # 针对该用户,对站点上所有话题查询按该国家代码进行过滤。
    TopicQuery.add_custom_filter(:location) do |results, topic_query|

      results = results.joins("JOIN topic_custom_fields tc ON
                               topics.id = tc.topic_id AND
                               tc.name = 'location' AND
                               tc.value LIKE '%countrycode\":\"#{countrycode}%'")
      results
    end
  end

  filter_on_user

end