لقد قمتُ مؤخرًا ببعض العمل مع واجهة برمجة التطبيقات (API) الخاصة بـ groups، ولديّ بعض الأفكار حول التصفح (pagination)، وتحديدًا في سياق غير الاكتشاف.
السياق
ولأجل الوضوح، أعني بـ “سياق الاكتشاف” التصفح الموجود في list_controller.rb و tags_controller.rb، والتي تستخدم أساليب مشابهة لـ construct_url_with لتوليد روابط الصفحات السابقة والتالية.
وفي هذا الصدد، يمكن دمج أساليب construct_url_with هذه في وحدة (module) مُضمَّنة نظرًا لتشابهها الكبير، ومع ذلك فإن هذا التصفح جزء جوهري من عملية إنشاء قائمة المواضيع، لذا فهو يُعتبر فئة منفصلة إلى حد ما.
النمط
في السياق غير الاكتشافي، يستخدم التصفح نسخةً ما من التالي:
page = params[:page].to_i
page_size = 38
items = items.offset(page * page_size).limit(page_size)
يمكنك رؤية نسخة من هذا النمط في وحدات تحكم مختلفة، على سبيل المثال (وليس حصرًا):
- المجموعات (groups)
- الويب هوكس (web hooks)
- رسائل البريد الإلكتروني (emails)
- الإشعارات (notifications)
- عناصر الدليل (directory items)
- سجلات إجراءات الطاقم (staff action logs)
…
هناك بعض المشكلات في التصفح عند استخدام هذه النقاط النهائية من عميل طرف ثالث.
المشكلات
محدد: تضمين رابط “تحميل المزيد”
بعض هذه النقاط النهائية تُرجع رابط “تحميل المزيد” (مع الصفحة التالية)، حتى لو لم تكن هناك صفحات إضافية.
على سبيل المثال، هناك 9 مجموعات مرئية (بالنسبة لي) على موقع meta. ومع ذلك، ستحصل على إدخال “load_more_groups” مع صفحة ثانية غير موجودة (الصفحة “1” هي الصفحة الثانية حيث يبدأ ترقيم الصفحات فعليًا من 0) في ملف .json لتلك الصفحة:
https://meta.discourse.org/g.json
...
"total_rows_groups":9,
"load_more_groups":"/groups?page=1"
يمكن وصف هذا ربما بأنه “خلل” في نقطة النهاية، حيث أن عميل واجهة برمجة التطبيقات غالبًا ما يسعى لاستخدام رابط “تحميل المزيد” عند التصفح عبر الصفحات، بدلاً من محاولة معالجة عد الصفحات بنفسه.
عام: تسميات مختلفة، ومعالجة حجم الصفحة، والبيانات المتعلقة بالتصفح المُرجعة
بشكل عام، هناك قدر كبير من التباين في تسميات التصفح، وأحجام الصفحات، والبيانات المتعلقة بالتصفح التي تُرجع في السياقات غير الاكتشافية. على سبيل المثال:
- يُسمى “الصفحة” إما
:pageأو:offset. - “إجمالي عدد العناصر” يُدرج أحيانًا كـ
total_rows_*، ومع ذلك لا يُدرج دائمًا، وأحيانًا يُسمى باسم آخر. - تُعيّن معظم أحجام الصفحات إلى متغيرات محلية في الإجراء (action) ذي الصلة، وتختلف إلى حد ما، مما يعني أنك بحاجة إلى البحث عنها.
الاقتراح
الآن، هناك أسباب مختلفة للعديد من الأمور التي أشرت إليها. تُستهلك العديد من النقاط النهائية غير الاكتشافية بشكل أساسي (أو حصريًا) من قبل عميل تطبيق Discourse وهي مصممة خصيصًا لذلك العميل. وهذا أمر منطقي.
ومع ذلك، قد يكون هناك تحول يبدأ في نقل التصفح غير الاكتشافي تدريجيًا، وخاصة للنقاط النهائية التي يُستهلكها عملاء خارجيون غالبًا (مثل المجموعات)، نحو مزيد من التوحيد القياسي، مما سيجعل أيضًا من الأسهل معالجة مشكلات مثل تضمين رابط “تحميل المزيد”.
ما في ذهني في الأساس هو وحدة “Pagination” تُجسّد هذا النمط ويمكنها معالجة التصفح في بعض النقاط النهائية المختارة، ربما بالبدء مع المجموعات (Groups).
ربما أقوم بتقديم طلب سحب (PR) لذلك، لكن اعتقدتُ أنه يجب طرحه للنقاش أولاً.