المستخدمون الذين قاموا بالوصول إلى موضوع في فئة محمية

أحتاج إلى بعض المساعدة. لا أعرف رأسي من مؤخرتي في SQL.

أقوم بإدارة منتدى لنقابة عمالية أعمل فيها. أنا ممثل منتخب، لكنني لست ضمن القيادة. السبب في أنني أدير المنتدى هو أن لدي خبرة سابقة مع منصة Discourse، وقد قمت بإعدادها لتحديث طريقة تواصلنا الداخلي (التعاون بين الفرق)، وأنا الشخص الوحيد حاليًا (من بين 20 شخصًا) الذي لديه أي فكرة عن كيفية القيام بأي شيء أكثر تقدمًا من الناحية التقنية في الخلفية يتجاوز استخدام منشئ المواقع لبناء موقع إلكتروني. النقطة الأساسية هي أن مجموعتنا متقنة للتكنولوجيا من منظور المستخدم النهائي، لكن ليس من منظور “الخلفية”.

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

وبما أنه لا توجد طريقة حقيقية لإخفاء المحتوى عن المشرف، فقد قمت بإنشاء مكون سمة (theme component) باستخدام CSS للقيام بالتالي:

  • إخفاء أزرار الرسائل في ملفات المستخدمين.
  • إخفاء زر انتحال الشخصية في ملفات المشرفين.
  • إخفاء معاينة المواضيع في صفحة الفئات.
  • إخفاء قائمة المواضيع داخل الفئات من الجميع.
    • ثم إضافة إمكانية العرض لقوائم المواضيع لأعضاء المجموعة (الرئيسية).

باختصار، أقوم بإنشاء سلسلة من سجلات التدقيق لتكون متاحة في حال رغبت في التحقق من أنني لا أقوم بالتجسس.

  1. يمكنهم الاطلاع على سجلات الموقع لرؤية ما إذا كنت قد لمست ذلك المكون السمة (تعديله/تعطيله) دون علمهم، ويمكنهم حينها سؤالني عن السبب ورؤية التفاصيل.
  2. إذا استخدمت يومًا ما ميزة انتحال الشخصية أو عرض الرسائل، فسيظهر ذلك في السجلات أيضًا.

بشكل أساسي، إذا قمت يومًا ما بالتلاعب بملف CSS الذي كتبته لإخفاء هذه الأمور، فيمكنهم رؤيته وطلب شرح مني.

  1. إذا أضفت نفسي إلى مجموعتهم بحيث يصبح المحتوى مرئيًا لي، فسيظهر في سجلات المجموعة أنني أضفتني/أزلت نفسي. يمكنهم حينها سؤالني عن السبب.

ما أحتاج إلى مساعدة فيه:
إذا قمت يومًا بعرض الصفحة مع تعطيل أنماط CSS، فيمكنني رؤية روابط المواضيع. ومن الواضح أنه يمكنني فتح المواضيع مباشرة. ما أريده هو استعلام من مستكشف البيانات (Data Explorer) يمكنهم (فريق التنفيذيين الذين يحصل جميعهم على صلاحيات المشرف) تشغيله بين الحين والآخر لعرض المواضيع التي تم عرضها داخل فئة معينة من قبل أي مستخدم ليس عضوًا في مجموعة “التنفيذيين”.

ليس لديهم أي فكرة عن إمكانية القيام بذلك، لكنني أريد تغطية كل الاحتمالات. أريد أن أضمن ذلك للمستقبل بما يتجاوز وجودي. بأفضل ما يمكنني باستخدام الأدوات المتاحة.

لذا مرة أخرى، أحتاج إلى استعلام مستكشف البيانات للقيام بما يلي:

  1. إذا لم يكن المستخدم جزءًا من مجموعة “التنفيذيين”
  2. فأعرض المواضيع التي تم عرضها بواسطة المستخدم(ين) في الفئة “EB” (أو معرف الفئة: 34)

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

هل يمكن لأي شخص المساعدة في هذا؟

أعتقد أنه يجب عليك فتح موضوع جديد حول هذا…

لكن، يمكنك المحاولة (وتعلم SQL) :wink:

النقطة 1:

-- [المعلمات]
-- string :gname = executive
-- string :uname = SidV
SELECT u.username, g.id as "معرف المجموعة", g.name
FROM group_users gu, users u, groups g
WHERE g.id = gu.group_id
AND u.id = gu.user_id
AND g.name ILIKE :gname
AND u.username ILIKE :uname

النقطة 2

لا أستطيع فهم نقطتك… ماذا تحتاج؟

تحقق من قائمة الاستعلامات وحاول تكييف أحد الاستعلامات حسب احتياجك.

اكتب استعلامًا لعرض أي مواضيع تمت قراءتها في الفئة 1 أو 2 من قبل أي مستخدم غير مُعيّن في المجموعة أ

المستخدمين الذين قاموا بالوصول إلى موضوع في فئة محمية

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

--[params]
-- string :group_name

WITH allowed_users AS (
SELECT user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :group_name
),
group_categories AS (
SELECT category_id
FROM category_groups cg
JOIN groups g
ON g.id = cg.group_id
WHERE g.name = :group_name
)

SELECT
tu.user_id,
tu.topic_id,
tu.last_visited_at::date
FROM topic_users tu
JOIN topics t
ON t.id = tu.topic_id
WHERE t.category_id IN (SELECT category_id FROM group_categories)
AND tu.user_id NOT IN (SELECT user_id FROM allowed_users)
ORDER BY t.category_id