طوّرنا إضافة مرافقة صغيرة لاستطلاع RSS (discourse-rss-onebox): حيث تُعرض المقالات المدونة المستوردة على شكل “واِن بوكس” (onebox) للمقال، مع ملخصات اختيارية للقنوات، وأوصاف YouTube، وأنواع تنسيق العناوين. أجبرتنا ثلاث ثغرات على استخدام طريقة تغليف الدوال الأساسية بدلاً من استخدام الخطافات (hooks) الموثقة.
-
لا يوجد منفذ إضافة (plugin outlet) في نموذج القناة. لا يحتوي rss-polling-feed-form.gjs#L287-L351 على
PluginOutlet، ويتقبل عقد التحديث (update contract) مجموعة ثابتة من السمات (update.rb#L9-L14). لا يمكن للإضافة إضافة خيار لكل قناة على حدة، لذا احتاجت إضافتنا إلى صفحة إدارية منفصلة. كان من الممكن تغطية هذا المنفذ بالإضافة إلى طريقة لحفظ حقول إضافية (مثل حقول مخصصة للقناة). -
معرّف القناة (feed ID) لا يصل أبداً إلى عملية الاستيراد. يعرف مهمة الاستطلاع (poll job) قيمة
rss_feed_id، لكنTopicEmbed.import(poll_feed.rb#L110) ومعدّلtopic_embed_import_create_args(topic_embed.rb#L108) لا يتلقّيان هذه القيمة أبداً. نقوم بتغليف مهمة الاستطلاع لالتقاطها. سيسمح تمريرها كخيار للإضافات بالتصرف بشكل خاص لكل قناة. -
لا توجد خطاف (hook) في مسار التحديث. عندما يتغير محتوى عنصر القناة، تُعدّل
TopicEmbed.importالمنشور بمحتوى القناة (topic_embed.rb#L147-L152)، متجاوزةً أي شيء قام به معدّل الإنشاء (create modifier). يقوم المدون الذي يعدّل منشوراً بتحويل موضوع مُصاغ بواسطة إضافة إلى نص القناة بصمت. سيُغلق معدّل على تغييرات التحديث، يحاكيtopic_embed_import_create_args، هذه الثغرة.
الحل البديل للنقطتين 2 و3 هو إضافة TopicEmbed.import ومهمة الاستطلاع في البداية (prepending). هذا الحل هش: فقد أضافت الفرع الرئيسي (main) منذ ذلك الحين كلمة مفتاحية truncate: إلى TopicEmbed.import، مما يكسر أي غلاف يحاكي توقيع إصدار 2026.7 - كان علينا إصدار نسخة فقط لتمرير هذه الكلمة المفتاحية. كانت الخطافات الموثقة ستجنبنا هذا النوع من الأعطال.