الإدارة والصلاحيات
بالإضافة إلى الإرسال والبحث الأساسيين، يوفّر Papex منطقة إدارية موجهة للمشغّلين ونظام صلاحيات دقيقًا. يتناول هذا الدليل أربع قدرات:
- الأدوار والصلاحيات (RBAC) — التحكم في نشر الورقة وعرضها وتنزيلها والتعليق عليها حسب الدور أو لكل مستخدم.
- إدارة صلاحيات المستخدم — تعيين أدوار إضافية وضبط تجاوزات السماح/الرفض لكل مستخدم لأي صلاحية.
- المراجعة المشتركة (تحكيم الأقران) — يرسل المدير طلبات المراجعة المشتركة؛ فيقبل المراجعون ويقدّمون آراءً ويستلمون إيصالات، مشكّلين حلقة مغلقة.
- الرسائل المصنّفة والبث — مركز إشعارات موحّد يشمل إشعارات النظام ونتائج المراجعة وإيصالات التذاكر وطلبات المراجعة المشتركة والرسائل الخاصة للإدارة والردود المجتمعية، إضافة إلى بث موجّه.
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 مجموعات:
| المجموعة | مفتاح الصلاحية | الاسم | الوصف |
|---|---|---|---|
| paper | paper:publish | نشر الورقة | إرسال ورقة أو إصدار جديد |
paper:view | عرض الورقة | تصفّح الأوراق المنشورة | |
paper:download | تنزيل الورقة | تنزيل PDF / حزمة المصدر | |
paper:moderate | إشراف الورقة | الموافقة / الرفض / السحب | |
| comment | comment:create | نشر تعليق | تعليق ورد تحت الأوراق |
comment:view | عرض التعليقات | تصفّح قسم التعليقات | |
| ticket | ticket:create | إنشاء تذكرة | فتح تعليق / تذكرة |
ticket:manage | إدارة التذاكر | الرد على التذاكر / معالجتها | |
| co_review | co_review:assign | تعيين المراجعة المشتركة | إرسال طلب مراجعة مشتركة |
co_review:respond | تولّي المراجعة المشتركة | قبول / رفض طلب | |
co_review:manage | إدارة المراجعة المشتركة | عرض كل تقدّم المراجعة المشتركة | |
| message | message:broadcast | بث | إرسال رسائل للمستخدمين |
| admin | user:manage | إدارة المستخدمين | عرض / تعديل المستخدمين |
role:manage | إدارة الأدوار | ضبط الأدوار والصلاحيات | |
permission:manage | إدارة التجاوزات | السماح / الرفض لكل مستخدم |
1.3 صلاحيات الأدوار الافتراضية
يكتب التعبئة الأولية (db:seed) خريطة صلاحيات افتراضية لكل دور نظام:
| الدور | العدد | الصلاحيات |
|---|---|---|
admin | 15 | كل الصلاحيات |
moderator | 12 | عرض/تنزيل/إشراف الورقة، إنشاء/عرض التعليق، إنشاء/إدارة التذكرة، تعيين/تولّي/إدارة المراجعة المشتركة، البث، إدارة المستخدمين |
author | 6 | نشر/عرض/تنزيل الورقة، إنشاء/عرض التعليق، إنشاء التذكرة |
reader | 3 | عرض/تنزيل الورقة، عرض التعليق |
1.4 ترتيب الحل
عند تشغيل عملية محمية، تُحل الصلاحيات الفعّالة كما يلي:
صلاحيات الدور الأساسي
∪ صلاحيات الأدوار المعيّنة (اتحاد الأدوار)
∪ تجاوزات كل مستخدم الموسومة بالسماح
− تجاوزات كل مستخدم الموسومة بالرفض (التجاوزات تنتصر)فحتى إن لم يمنح كل من الدور الأساسي والمعيّن paper:publish، فإن تجاوز سماح صريحًا ما زال يسمح به؛ وبالمقابل، يمنع تجاوز رفض صريحٌّه حتى حين تمنحه الأدوار.
تراجع: إن لم تُزرع جداول
roles/permissionsبعد (مثل قاعدة جديدة بلاdb:seed)، يعود المحرّك إلى خريطة الافتراضيات الثابتة أعلاه لتفادي قفل الموقع كله. يظل تشغيلdb:seedبعد النشر موصى به.
1.5 العمليات المحمية (البوابات)
عمليات رئيسية محمية؛ غياب الصلاحية يعيد 403:
POST /api/papers— يتطلبpaper:publishPOST /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 فئات). عند النشر أو التهيئة المحلية شغّل:
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 للقائمة الكاملة.