لدي موقع عضوية (مبني أيضًا باستخدام Rails) وأستخدم واجهة برمجة تطبيقات Discourse لإنشاء مجموعات منتديات مقيدة وملؤها تلقائيًا لجميع مجموعات المستخدمين الخاصة بي. هذا يعمل بشكل رائع؛ بل إنني أقوم حتى بتعيين منشور ويكي لكل مجموعة كبداية. (لقد نشرت الكود الخاص بي.)
الآن واجهت مشكلة تتمثل في أنني أحتاج أحيانًا إلى مزامنة عضوية المجموعة يدويًا، على سبيل المثال عند دمج المجموعات على موقعي أو عندما يقوم المنسق بحذف/إضافة أشخاص عن طريق الخطأ عبر المنتدى. لهذا الغرض، أريد حذف جميع أعضاء مجموعة Discourse ثم إعادة إضافة أولئك الذين يجب أن يكونوا فيها.
المشكلة الأولى: لا يبدو أن واجهة برمجة تطبيقات Discourse تتضمن أمرًا لحذف جميع الأعضاء دفعة واحدة، لذا يجب علي تحديد أسماء جميع الأشخاص الذين سيتم حذفهم.
المشكلة الثانية: لا يمكنني فعليًا استرجاع العضوية الحالية لمجموعة Discourse، لأن السبب غير معروف يجعلها تطلب مني اسم المجموعة بدلاً من معرفها (ID). لقد قمت بتخزين معرف المجموعة فقط على موقعي، لأن هذا هو ما تستخدمه Discourse لطلبات PUT/POST/DELETE ذات الصلة.
المشكلة الثالثة: يجب أن يكون الأمر واضحًا، لكنني لا أرى طريقة لاسترجاع اسم المجموعة عن طريق تزويدها بمعرفها (ID)، إلا إذا أردت استرجاع جميع المجموعات الـ 200+ أو أكثر والتدقيق فيها واحدة تلو الأخرى حتى أجد واحدة يتطابق معرفها. هذا يبدو قدرًا هائلاً من المتاعب كما أنه يتعارض مع تقاليد Rails.
ما الذي أفتقده؟
تعديل: كان @codinghorror مفيدًا للغاية في المرة السابقة - هل لديك أي أفكار الآن؟
يبدو أنك محق في هذا الأمر — لا يمكنك الوصول إلى موارد المجموعة باستخدام رقم المعرف (ID)، بل فقط باستخدام الاسم.
المعرف المشار إليه هنا ليس معرفًا رقميًا، بل هو الاسم، وفقًا لـ:
من المنطقي على الأرجح إعادة هيكلة المسار /g/<group-name> ليتوافق مع الطريقة التي نتعامل بها حاليًا مع المواضيع والفئات. شيء مثل /g/<group-name>/<id> أو /g/patrons/41 والسماح لـ /g/41 بالعمل بنفس الطريقة.
حتى نقوم بإصلاح ذلك، يبدو أن الطريقة الوحيدة لتحقيق ما تبحث عنه هي:
تخزين اسم المجموعة بجانب المعرف (ID).
إرسال طلب GET إلى g/<group-name>/members.json لاستعادة الأعضاء.
التكرار عليهم لحذف كل عضو حتى تتمكن من إعادة المزامنة.
هذه مشكلة رائعة تستحق الدراسة. شكرًا لك على طرحها، @Judith! المجموعات قوية جدًا وتتمتع بإمكانيات هائلة! لاحظت هذه المشكلة مؤخرًا أيضًا أثناء العمل على الحفاظ على عضوية المجموعات من ووردبريس. سيكون من الرائع جدًا إضافة أو إزالة الأشخاص من المجموعات تلقائيًا بناءً على البلد أو المنطقة التي يقولون إنهم مقيمون فيها، واللغات التي يتحدثونها، والمواضيع التي يهتمون بها، وما إلى ذلك، عند تسجيلهم وتحديث ملفاتهم الشخصية في ووردبريس.
اقتراح @justin بتخزين اسم المجموعة ومعرفها معًا هو اقتراح جيد، وسأقوم بنقله إلى الفريق الذي يعمل حاليًا على هذه التكاملات.
من الميزات التي أود أيضًا رؤيتها مضافة إلى واجهة المستخدم هي قدرة المدراء أو مالكي المجموعات على إزالة جميع الأعضاء من مجموعة وإعادة إضافتهم دفعة واحدة. هذا سيسمح لهم بإعادة تعيين عضويات المجموعة يدويًا من وقت لآخر بناءً على التصدير من ووردبريس، حتى لو لم يكن لديهم نظام آلي لإضافة أو إزالة الأشخاص من المجموعات عند تحديثهم لملفاتهم الشخصية في ووردبريس.
أوصي باستخدام SSO بين موقعك الرئيسي وDiscourse. بهذه الطريقة، ستحصل على إدارة عضوية المجموعات مجانًا، وستكون لديك نقطة نهاية sync_sso لتحديث العضوية بطريقة مباشرة.
في البداية، كنت أستخدم المصادقة الموحدة (SSO) فقط، لكنني واجهت مشكلة تتمثل في أنها لا تقوم بتحديث عضوية المجموعة إلا عند تسجيل دخول المستخدمين. في حالات عدم إعادة انتخاب شخص ما، أو فقدان حق الوصول إلى مجموعة ما، أو اكتساب هذا الحق (حيث يجب أن يتلقى إشعارات بريد إلكتروني بشأن الرسائل في منتديات المجموعة المقيدة)، أحتاج إلى إضافة أو إزالة المستخدمين عبر واجهة برمجة التطبيقات (API).
يوجد sync_sso لحل هذه المشكلة بالضبط! يمكنك تفعيل ما يُشبه تسجيل دخول “افتراضي” عبر SSO في أي وقت عند حدوث تغيير في العضوية لمزامنة بيانات المستخدم بالكامل.