Skip to content

الإدارة والصلاحيات ​

بالإضافة إلى الإرسال والبحث الأساسيين، يوفّر Papex منطقة إدارية موجهة للمشغّلين ونظام صلاحيات دقيقًا. يتناول هذا الدليل أربع قدرات:

  1. الأدوار والصلاحيات (RBAC) — التحكم في نشر الورقة وعرضها وتنزيلها والتعليق عليها حسب الدور أو لكل مستخدم.
  2. إدارة صلاحيات المستخدم — تعيين أدوار إضافية وضبط تجاوزات السماح/الرفض لكل مستخدم لأي صلاحية.
  3. المراجعة المشتركة (تحكيم الأقران) — يرسل المدير طلبات المراجعة المشتركة؛ فيقبل المراجعون ويقدّمون آراءً ويستلمون إيصالات، مشكّلين حلقة مغلقة.
  4. الرسائل المصنّفة والبث — مركز إشعارات موحّد يشمل إشعارات النظام ونتائج المراجعة وإيصالات التذاكر وطلبات المراجعة المشتركة والرسائل الخاصة للإدارة والردود المجتمعية، إضافة إلى بث موجّه.

1. الأدوار والصلاحيات (RBAC) ​

يستخدم Papex نموذجًا من ثلاث طبقات — الدور الأساسي + الأدوار المعيّنة + تجاوزات كل مستخدم — يدعم كلًا من التخويل الجماعي القائم على الأدوار والقيود المخصصة لكل مستخدم.

1.1 نموذج الصلاحيات ​

الطبقةالوصفتُصان في
الدور الأساسيالدور المتأصل في كل مستخدم في users.role: author / moderator / adminافتراضي author عند التسجيل
الأدوار المعيّنةأدوار إضافية تُضاف على المستخدم عبر جدول الربط user_rolesصفحة إدارة المستخدمين
تجاوزات كل مستخدمسماح أو رفض صريح لصلاحية واحدة على مستخدم؛ ذو أعلى أولويةصفحة إدارة المستخدمين

ℹ️ reader دور RBAC مُعيَّن (في جدول roles)، ليس دورًا أساسيًا في قاعدة البيانات (users.role يسمح فقط بـ author / moderator / admin). يحدد الدور الأساسي حدود تسجيل الدخول والصلاحيات الافتراضية؛ وتُكدّس الأدوار المعيّنة فوقه.

1.2 سجل الصلاحيات ​

يأتي النظام بـ 15 صلاحية عبر 6 مجموعات:

المجموعةمفتاح الصلاحيةالاسمالوصف
paperpaper:publishنشر الورقةإرسال ورقة أو إصدار جديد
paper:viewعرض الورقةتصفّح الأوراق المنشورة
paper:downloadتنزيل الورقةتنزيل PDF / حزمة المصدر
paper:moderateإشراف الورقةالموافقة / الرفض / السحب
commentcomment:createنشر تعليقتعليق ورد تحت الأوراق
comment:viewعرض التعليقاتتصفّح قسم التعليقات
ticketticket:createإنشاء تذكرةفتح تعليق / تذكرة
ticket:manageإدارة التذاكرالرد على التذاكر / معالجتها
co_reviewco_review:assignتعيين المراجعة المشتركةإرسال طلب مراجعة مشتركة
co_review:respondتولّي المراجعة المشتركةقبول / رفض طلب
co_review:manageإدارة المراجعة المشتركةعرض كل تقدّم المراجعة المشتركة
messagemessage:broadcastبثإرسال رسائل للمستخدمين
adminuser:manageإدارة المستخدمينعرض / تعديل المستخدمين
role:manageإدارة الأدوارضبط الأدوار والصلاحيات
permission:manageإدارة التجاوزاتالسماح / الرفض لكل مستخدم

1.3 صلاحيات الأدوار الافتراضية ​

يكتب التعبئة الأولية (db:seed) خريطة صلاحيات افتراضية لكل دور نظام:

الدورالعددالصلاحيات
admin15كل الصلاحيات
moderator12عرض/تنزيل/إشراف الورقة، إنشاء/عرض التعليق، إنشاء/إدارة التذكرة، تعيين/تولّي/إدارة المراجعة المشتركة، البث، إدارة المستخدمين
author6نشر/عرض/تنزيل الورقة، إنشاء/عرض التعليق، إنشاء التذكرة
reader3عرض/تنزيل الورقة، عرض التعليق

1.4 ترتيب الحل ​

عند تشغيل عملية محمية، تُحل الصلاحيات الفعّالة كما يلي:

صلاحيات الدور الأساسي
  ∪ صلاحيات الأدوار المعيّنة      (اتحاد الأدوار)
  ∪ تجاوزات كل مستخدم الموسومة بالسماح
  − تجاوزات كل مستخدم الموسومة بالرفض  (التجاوزات تنتصر)

فحتى إن لم يمنح كل من الدور الأساسي والمعيّن paper:publish، فإن تجاوز سماح صريحًا ما زال يسمح به؛ وبالمقابل، يمنع تجاوز رفض صريحٌّه حتى حين تمنحه الأدوار.

تراجع: إن لم تُزرع جداول roles / permissions بعد (مثل قاعدة جديدة بلا db:seed)، يعود المحرّك إلى خريطة الافتراضيات الثابتة أعلاه لتفادي قفل الموقع كله. يظل تشغيل db:seed بعد النشر موصى به.

1.5 العمليات المحمية (البوابات) ​

عمليات رئيسية محمية؛ غياب الصلاحية يعيد 403:

  • POST /api/papers — يتطلب paper:publish
  • POST /api/papers/:id/comments — يتطلب comment:create
  • الإشراف ومعالجة التذاكر وتعيين/إدارة المراجعة المشتركة وتعديلات المستخدمين والأدوار والبث وغيرها تتطلب صلاحياتها، والطرق محمية بـ middleware (فقط moderator / admin قد يدخل /admin).

2. إدارة صلاحيات المستخدم ​

افتح /admin/users (يتطلب user:manage):

  • البحث عن المستخدمين بالاسم / البريد / الاسم المعروض، مع ترقيم صفحات.
  • تعيين أدوار إضافية: حدّد أدوار النظام (admin / moderator / author / reader) في محرر المستخدم لتُكدَّس على الدور الأساسي.
  • تجاوز صلاحية ثلاثي الحالات: لكل من الصلاحيات الـ15 عيّن:
    • وراثة (افتراضي) — اتبع نتيجة اتحاد الأدوار؛
    • سماح — منح قسري حتى لو أغفلته الأدوار؛
    • رفض — حجب قسري حتى لو تضمنته الأدوار.

كل التغييرات تُحفظ فورًا عبر PATCH /api/admin/users/:id وتُطبَّق على عمليات التخويل اللاحقة لذلك المستخدم.


3. المراجعة المشتركة (تحكيم الأقران) ​

المراجعة المشتركة حلقة تحكيم أقران كاملة تربط المدير ← المراجع ← المؤلف.

3.1 الحلقة المغلقة ​

يعيّن المدير ──► يتلقى المراجع رسالة "طلب مراجعة مشتركة"
     │
     ▼
يستجيب المراجع (قبول / رفض)
     │ قبول
     ▼
يقدّم المراجع رأيًا (موافقة / رفض / تعديل + تعليق)
     │
     ▼
إيصال النظام ──► يُعلم المعيّن "تم تقديم الرأي"
                ──► يُعلم المؤلف "اكتملت المراجعة المشتركة" (إن المؤلف ≠ المعيّن)

3.2 آلة الحالة ​

ينتقل سجل المراجعة المشتركة (co_reviews) كما يلي:

الحالةالمعنىتُدخل بواسطة
pendingبانتظار رد المراجعتعيين المدير (POST /api/co-reviews)
acceptedمقبولةقبول المراجع (POST /api/co-reviews/:id/respond {accepted:true})
declinedمرفوضةرفض المراجع (respond {accepted:false})
completedمكتملةتقديم المراجع الرأي (submit)
expiredمنتهية(حالة محجوزة للإغلاق عند المهلة)

لا يجوز للمراجع الاستجابة إلا بينما pending، ولا تقديم رأي إلا بينما accepted. حالة غير متطابقة تعيد INVALID_STATE.

3.3 نقاط الدخول والإشعارات ​

  • المدير: /admin/co-reviews لتعيين كل المراجعات المشتركة ومراقبتها؛ و/admin/co-reviews/:id للتفاصيل. يختار التعيين من الأوراق بحالة submitted.
  • المراجع: /co-reviews (مراجعاتي) و/co-reviews/:id (قبول / رفض + تقديم الرأي).
  • إشعارات موحّدة: كل تغيّر حالة يطلق رسالة co_review_request / co_review_result للأطراف المعنية (انظر القسم 4).

4. الرسائل المصنّفة والبث ​

4.1 فئات الرسائل ​

تُصنَّف الرسائل بـ kind إلى 8 فئات، ملوّنة ومجمّعة في صندوق الوارد:

kindالتسميةالنبرةالمصدر النموذجي
systemإشعار النظامافتراضيأحداث النظام
ticket_replyإيصال تذكرةأزرق معلوماترُدّت التذكرة
announcementإعلانأصفر تحذيربث المدير
review_resultنتيجة المراجعةأخضر نجاحموافقة/رفض الورقة
co_review_requestطلب مراجعة مشتركةبنفسجيعُيّنت مراجعة مشتركة
co_review_resultإيصال مراجعة مشتركةبنفسجيقُدّم رد / رأي
admin_messageرسالة خاصة للإدارةأحمر خطررسالة موجّهة مباشرة
community_replyرد مجتمعيأزرق معلوماترُدّ على تعليق

صندوق الوارد (/messages) يدعم الفلترة بالفئة (GET /api/messages?kind=...)؛ النقر على رسالة ينتقل إلى link المرتبط بها (ورقة، تذكرة، مراجعة مشتركة، …).

4.2 قمع الإشعارات الموحّد ​

تُصدَّر كل التنبيهات عبر الوحدات من خلال خدمة notifications واحدة ليتشارك المراجعة والتذاكر والمراجعة المشتركة والمجتمع عقد إشعارات واحدًا:

  • المراجعة: قرار الورقة ← إعلام المؤلف (review_result).
  • التذاكر: رد الموظف ← إعلام مقدّم التذكرة (ticket_reply).
  • المراجعة المشتركة: تعيين / رد / تقديم ← إعلام المراجع والمعيّن والمؤلف (co_review_request / co_review_result).
  • المجتمع: رُدّ على تعليق ← إعلام صاحب التعليق الأصلي (community_reply).

4.3 البث ​

افتح /admin/messages (يتطلب message:broadcast):

  • النطاق:
    • all — كل المستخدمين؛
    • role — دور أساسي (author / moderator / admin)؛
    • userIds — قائمة معرّفات مستخدمين محددة.
  • النوع: announcement / system / admin_message.
  • املأ العنوان والمتن (مع link اختياري)، وأرسل، فيُكتب الرسالة بكميات كبيرة للجمهور المستهدف؛ ويُعاد عدد النجاح.

5. تنقّل الإدارة ​

نقاط دخول الإدارة موجودة في قائمة المستخدم المسجّل وفي نظرة /admin العامة، وتشمل:

الوحدةالمسارالوصف
نظرة عامة/adminبطاقات إحصاءات + اختصارات الوحدات
قائمة المراجعة/admin/reviewالموافقة / رفض الأوراق (+ سبب)
الإحصاءات/admin/statsمقاييس المنصة
التذاكر/admin/ticketsمعالجة التذاكر
المراجعة المشتركة/admin/co-reviewsتعيين ومراقبة المراجعات المشتركة
المستخدمون/admin/usersالأدوار وتجاوزات الصلاحيات
الأدوار/admin/rolesمصفوفة صلاحيات الأدوار
الرسائل/admin/messagesالبث

هذه الطرق محمية بـ middleware؛ فقط المستخدمون ذوو الدور الأساسي moderator أو admin قد يصلون إليها، وكتابة الإجراءات تتطلب إضافة الصلاحية الدقيقة المطابقة.


6. العمليات: التهجير والتعبئة ​

تعتمد الأنظمة الأربعة على تهجير 0003_add_rbac_co_review_messages (يضيف roles / permissions / role_permissions / user_roles / user_permissions / co_reviews / moderation_logs، ويوسّع messages.kind إلى 8 فئات). عند النشر أو التهيئة المحلية شغّل:

bash
npm run db:migrate   # تطبيق التهجيرات (RBAC / المراجعة المشتركة / فئات الرسائل)
npm run db:seed      # كتابة 4 أدوار نظام + 15 صلاحية + افتراضيات (قابل للتكرار)

يستخدم زرع RBAC onConflictDoNothing وآمن لإعادة التشغيل. بعد التهجير + الزرع، يستخدم محرّك الصلاحيات جداول roles / permissions؛ وقبل الزرع يعود إلى الافتراضيات الثابتة (انظر 1.4).


7. مرجع سريع لـ API ​

الطريقةالمسارالوصف
GET/api/messages?kind=صندوق الوارد، فلترة بالفئة
POST/api/papers/:id/moderateإشراف {action:"approve"|"reject"|"withdraw", reason?}
GET/api/co-reviews?scope=mine|allقائمة المراجعات المشتركة (ملكي / الكل)
POST/api/co-reviewsتعيين {paperId, reviewerId, note?}
GET/api/co-reviews/:idتفاصيل المراجعة المشتركة
POST/api/co-reviews/:id/respondرد {accepted:boolean}
POST/api/co-reviews/:id/submitتقديم {decision:"approve"|"reject"|"revise", comment}
GET/api/admin/usersقائمة المستخدمين (ترقيم صفحات / بحث)
PATCH/api/admin/users/:idتعيين أدوار {roleKeys} أو تجاوز {permission:{key,grant}}
GET/api/admin/rolesقائمة الأدوار
PUT/api/admin/roles/:idتعيين صلاحيات الدور {permissionKeys}
POST/api/admin/messagesبث {scope, role?, userIds?, kind, title, body, link?}
GET/api/admin/statsإحصاءات المنصة

راجع مرجع API للقائمة الكاملة.

Papex is open source under the Apache-2.0 license.