كيفية إنشاء مرشح للمواضيع بناءً على مجموعة المستخدم الحالية وموقع الموضوع

مرحباً،

أعمل على إضافة (plugin) تقوم بتصفية جميع المواضيع بناءً على مكان نشر الموضوع ومجموعة المستخدم الذي يشاهد الموضوع. حالة الاستخدام هنا هي وجود فريق دعم في دول مختلفة يتولى معالجة الأسئلة القادمة من مناطقهم الخاصة.

أنا مبتدئ في إنشاء إضافات Discourse ولا أزال أتعلم كيفية القيام بذلك. سيتم التعامل مع موقع الموضوع عبر إضافة المواقع (locations plugin) هنا: Locations Plugin 🌍

وسأضيف المستخدمين الذين يحتاجون إلى هذا العرض المصفى إلى مجموعة يُسمّى اسمها شيئاً مثل NA_queue أو EU_queue.

ستتحقق الإضافة مما إذا كان المستخدم قد سجل دخوله وما إذا كانت المجموعة الأساسية (primary group) محددة. إذا كانت محددة، فستقوم بتصفية جميع المواضيع لتتوافق مع طابور الانتظار (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

هل هذه طريقة جيدة لحل مشكلتي؟
أيضاً، هل لدى أي شخص اقتراحات حول ما يجب أن يكون عليه استعلام 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