الفريق والأدوار والصلاحيات
كيف تعمل أعضاء مساحة العمل والدعوات والمقاعد، وأدوار مساحة العمل الأربعة والصلاحيات الأربع عشرة في مصفوفة أدوار كل مساحة، وما يراه كل حساب أولي، وكيف تنتقل الملكية.
لحزمة الحزمة الكاملة
كيف يعمل الوصول
- الحساب هو كل من يسجّل الدخول. وينتمي إلى مساحة عمل عبر عضوية بدور واحد: المالك (واحد بالضبط في كل مساحة عمل) أو مسؤول أو عضو أو الفوترة. ويمكن للحساب نفسه أن يحمل دورًا مختلفًا في كل مساحة عمل ينتمي إليها.
- تحتفظ كل مساحة عمل بمصفوفة أدوارها: أي دور يملك أي صلاحية من أربع عشرة. يملكها المالك كلها ولا يمكن تعديله، واثنتان منها،
workspace.deleteوroles.manage، تبقيان مع المالك مهما قالت المصفوفة. وتبدأ مساحة العمل الجديدة من الإعدادات الافتراضية أدناه. - تفحص واجهة API كل طلب على مساحة عمل في الخادم: الحساب الذي ليس عضوًا يحصل على 404، كأن مساحة العمل غير موجودة، والصلاحية الناقصة تحصل على 403. ومساحة العمل الموقوفة تُبقي كل قراءة وترفض كل كتابة.
- تخفي لوحة التحكم صفوف الشريط الجانبي والأزرار التي لا يشملها الدور، والصفحة المفتوحة بعنوانها تعرض الوصول مطلوب.
- تغيير دور عضو أو المصفوفة يسري على طلب ذلك العضو التالي إلى واجهة API. ويتبعه شريطه الجانبي وأزراره عند المرة التالية التي تقرأ فيها لوحة التحكم مساحة العمل، وعند إعادة التحميل على أبعد تقدير.
- طاقم المنصة (مسؤول المنصة والدعم) مجموعة أدوار منفصلة عبر كل مساحات العمل: انظر إدارة المنصة.
الدوران والحسابان الأوليان
Forma Studio، مساحة العمل الأولية، تستخدم المصفوفة الافتراضية. لكل دور حساب أولي واحد يسجّل الدخول إلى لوحة التحكم؛ ويسرد دليل التثبيت بيانات دخولها.
| الدور | الحساب | الصلاحيات | الشريط الجانبي |
|---|---|---|---|
| المالك | owner@northstack.example (Alex Morgan) | كلها الأربع عشرة | النظرة العامة والمشاريع والفريق والأدوار والفوترة والإعدادات والمساعد الذكي |
| لوحة الإدارة | admin@northstack.example (Sam Carter) | workspace.read, workspace.update, projects.read, projects.write, members.invite, members.remove, keys.manage, audit.read, ai.read, ai.apply | النظرة العامة والمشاريع والفريق والأدوار (للقراءة فقط) والإعدادات مع مفاتيح API والمساعد الذكي؛ بلا الفوترة |
| عضو | member@northstack.example (Noor Hassan) | workspace.read, projects.read, projects.write, ai.read, ai.apply | النظرة العامة والمشاريع والفريق والأدوار (للقراءة فقط) والإعدادات (للقراءة فقط في تفاصيل مساحة العمل) والمساعد الذكي |
| الفوترة | billing@northstack.example (Jordan Ellis) | workspace.read, billing.read, billing.manage | النظرة العامة والفريق والأدوار (للقراءة فقط) والفوترة والإعدادات؛ بلا المشاريع وبلا المساعد الذكي |
workspace.readهي ما يفتح صفوف الفريق والأدوار والإعدادات، فيرى كل دور، ومنه الفوترة، قائمة الأعضاء والمصفوفة للقراءة فقط والإعدادات. أما مشاريع النظرة العامة ومخططها الأسبوعي والمشاريع التي تحتاج إلى متابعة فتتطلبprojects.read. وآخر النشاط والجرس يعرضان كل حدث للدور الذي يملكprojects.readأوaudit.read؛ والدور الذي يملكbilling.readولا يملك أيًّا منهما (الفوترة كما في البيانات الأولية) يرى أحداث الفوترة فقط، وأي دور آخر لا يرى شيئًا. وسجل النشاط الكامل وتصديره يتطلبانaudit.read.- لا يعود بريد الفوترة الخاص بمساحة العمل إلا إلى دور يملك
billing.readأوbilling.manage. - في Forma Studio ثمانية أعضاء (مالك ومسؤول وخمسة أعضاء وجهة اتصال للفوترة) على 10 مقاعد في خطة Pro، مع دعوتين معلقتين ومشروع مؤرشف واحد. والمالك مسؤول أيضًا في مساحة عمل ثانية، Monogram، لها مالكها وفريقها ودعوتها ومفتاح API خاص بها.
- يكتب
yarn seedمصفوفة مساحة العمل فقط عندما لا تكون لها مصفوفة، فتبقى التغييرات التي أجريتها في صفحة الأدوار عند تشغيله مرة أخرى. غيّر كلمة مرور كل حساب أولي، أو احذف الحسابات التجريبية، قبل أن تصبح لوحة التحكم متاحة من الإنترنت.
كل صلاحيات مساحة العمل
تجمع صفحة الأدوار الصلاحيات تحت التسميات أدناه. القائمة معرّفة مرة واحدة، في back-end/src/modules/workspaces/constants/workspace-permissions.ts، مع الإعدادات الافتراضية التي تبدأ منها كل مساحة عمل جديدة.
| المجموعة | الصلاحية | في صفحة الأدوار | الأدوار الافتراضية |
|---|---|---|---|
| مساحة العمل | workspace.read | عرض مساحة العمل: مساحة العمل وفريقها | المالك، مسؤول، عضو، الفوترة |
| مساحة العمل | workspace.update | تعديل مساحة العمل: تفاصيلها ومفاتيح الإشعارات | المالك، مسؤول |
| مساحة العمل | workspace.delete | حذف مساحة العمل (للمالك فقط) | المالك |
| المشاريع | projects.read | قراءة المشاريع: المشاريع والمهام والملفات | المالك، مسؤول، عضو |
| المشاريع | projects.write | تعديل المشاريع: إنشاء المشاريع والمهام وتعديلها وأرشفتها واستعادتها، ورفع الملفات | المالك، مسؤول، عضو |
| الأعضاء | members.invite | دعوة الأعضاء: إرسال الدعوات وإعادة إرسالها وإلغاؤها | المالك، مسؤول |
| الأعضاء | members.remove | إزالة الأعضاء | المالك، مسؤول |
| الأعضاء | roles.manage | إدارة الأدوار: تغيير دور عضو والمصفوفة (للمالك فقط) | المالك |
| الفوترة | billing.read | عرض الفواتير: الخطة والفواتير | المالك، الفوترة |
| الفوترة | billing.manage | إدارة الاشتراك: الخطة وبيانات الدفع وبريد الفوترة | المالك، الفوترة |
| المطوّر | keys.manage | إدارة مفاتيح API | المالك، مسؤول |
| المطوّر | audit.read | قراءة سجل النشاط: قراءته وتصديره | المالك، مسؤول |
| المساعد الذكي | ai.read | استخدام المساعد | المالك، مسؤول، عضو |
| المساعد الذكي | ai.apply | تطبيق اقتراحات المساعد | المالك، مسؤول، عضو |
ما يصل إليه المساعد
تفتح ai.read المساعد الذكي ولا تمنح شيئًا آخر. لا يعرض المساعد إلا الأدوات التي يسمح بها دور العضو، وتحتاج كل أداة إلى الصلاحية نفسها التي تحتاجها صفحتها: بدون billing.read لا يستطيع قراءة الخطة أو الفواتير، وبدون audit.read لا يستطيع قراءة النشاط. ولا يكتب شيئًا بنفسه: تطبيق المهام التي يقترحها يحتاج إلى ai.apply وprojects.write معًا، ويُفحصان مرة أخرى عند الضغط على إضافة المهمة.
صفحة الفريق
في /en/dashboard/team تبويبان، الأعضاء والدعوات، ولكل منهما بحث ومرشّح الدور. يُرتَّب الأعضاء بدءًا بالمالك، ثم بحسب الدور، ثم بحسب تاريخ الانضمام.
| الإجراء | المكان | يحتاج إلى |
|---|---|---|
| دعوة عضو | رأس الصفحة | members.invite |
| تغيير الدور (مسؤول أو عضو أو الفوترة) | قائمة إجراءات العضو | roles.manage، أي المالك |
| جعله المالك | قائمة إجراءات العضو | المالك، مع بيانات دخوله |
| إزالة من مساحة العمل | قائمة إجراءات العضو | members.remove |
| إعادة إرسال الدعوة وإلغاء الدعوة | قائمة إجراءات الدعوة | members.invite |
- لا إجراءات في صف المالك: تنتقل الملكية عبر جعله المالك فقط.
- تُخرج الإزالة الشخص من مساحة العمل هذه فورًا، وتبقى مشاريعه ومهامه. لا يزيل أحد نفسه من هذه القائمة، ويستطيع المسؤول إزالة الأعضاء وجهات الفوترة لكن لا يزيل مسؤولًا آخر (تجيب واجهة API بـ 403).
- يحتفظ العضو المُزال بحسابه وبمساحات عمله الأخرى.
الدعوات والمقاعد
- تطلب دعوة عضو بريدًا إلكترونيًا ودورًا، وتعرض ما سيستطيع هذا الدور فعله. يصل الشخص رابط بالبريد إلى
/en/invitations/<token>يبقى صالحًا سبعة أيام؛ وبدونSMTP_HOSTتُكتب الرسالة، مع الرابط، في سجل واجهة API. - تعرض صفحة الدعوة مساحة العمل والدور والبريد المدعو (مخفيًا جزئيًا) ومن أرسلها. يتطلب القبول أن يكون صاحب البريد المدعو مسجّلًا دخوله: ينشئ الشخص الجديد أولًا حسابًا بهذا البريد. تُرفض الدعوة الموجهة إلى بريد آخر أو المنتهية أو الملغاة برسالة خاصة بكل حالة.
- لكل خطة عدد من المقاعد: 3 في Starter و10 في Pro و30 في Scale. لا تشغل الدعوة المعلّقة مقعدًا، أما قبولها فيشغله. إذا لم يبق مقعد حر، تُرفض الدعوة الجديدة («لا يوجد مقعد متاح. غيّر الخطة لدعوة المزيد.»)، ويُرفض قبول دعوة أيضًا، ويُفحص ذلك في المعاملة نفسها حتى لا يأخذ شخصان آخر مقعد في وقت واحد.
- تنشئ إعادة إرسال الدعوة رابطًا جديدًا ومدة صلاحية جديدة من سبعة أيام، مرة واحدة في الدقيقة على الأكثر وخمس مرات لكل دعوة. أما إلغاء الدعوة فيوقف عمل الرابط.
- تُرفض دعوة من هو عضو بالفعل أو لديه دعوة معلّقة. وعندما تنتهي فترة السماح (
BILLING_GRACE_DAYS) لمساحة عمل متأخرة السداد، تُرفض الدعوات الجديدة حتى يُسدَّد المبلغ.
صفحة الأدوار
يعرض /en/dashboard/roles مصفوفة مساحة العمل: صفًا لكل صلاحية، في المجموعات الست أعلاه، وعمودًا لكل دور، وكل خلية إما مسموح أو غير مسموح. عمود المالك مقفل، وصفا حذف مساحة العمل وإدارة الأدوار يحملان للمالك فقط.
- المالك وحده يغيّرها. أما كل من يملك
workspace.readفيراها للقراءة فقط: «لا يغيّر ما يستطيع كل دور فعله إلا مالك مساحة العمل.» - يعرض حفظ التغييرات أولًا ما يكسبه كل دور وما يفقده، ثم يحفظ المصفوفة كلها ويكتب حدثًا واحدًا هو
roles.updatedفي سجل النشاط. ويعود إعادة الضبط إلى المصفوفة المحفوظة. - الأدوار الأربعة ثابتة: لا تستطيع مساحة العمل إضافة دور خامس. لمنح شخص أقل من دور ما، اسحب الصلاحية من ذلك الدور، فيتغير ذلك لكل من يحمله.
الملكية
- تطلب جعله المالك بيانات دخول المالك، ثم تجعل العضو المختار المالك وتجعل المالك السابق مسؤولًا، في خطوة واحدة. وتُكتب في سجل النشاط باسم
ownership.transferred. - المالك وحده يحذف مساحة العمل، من الإعدادات، بإدخال اسمها وبيانات دخوله.
- على المنصة، لا يمكن حذف حساب يملك مساحة عمل قبل أن يصبح عضو آخر هو المالك.
المسارات خلف هذه الصفحات
| المسار | الصلاحية |
|---|---|
GET /api/workspaces/:workspaceId/members | workspace.read |
PATCH /api/workspaces/:workspaceId/members/:memberId | roles.manage |
DELETE /api/workspaces/:workspaceId/members/:memberId | members.remove |
POST /api/workspaces/:workspaceId/members/transfer-ownership | المالك |
GET /api/workspaces/:workspaceId/invitations | workspace.read |
POST /api/workspaces/:workspaceId/invitations, POST .../invitations/:id/resend, DELETE .../invitations/:id | members.invite |
GET /api/invitations/:token وPOST /api/invitations/:token/accept | لا شيء للقراءة؛ وتسجيل الدخول بالبريد المدعو للقبول |
GET /api/workspaces/:workspaceId/roles | workspace.read |
PUT /api/workspaces/:workspaceId/roles | المالك (roles.manage) |
:workspaceId هو المعرّف العام لمساحة العمل، مثل org_forma. تعود الأخطاء على شكل رموز، منها: seat_limit_reached وalready_member وalready_invited وresend_too_soon وresend_limit_reached وowner_protected وworkspace_owner_only وinvalid_password.
كيف تُبنى فحوص الصلاحيات
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
أين يفحص كل من واجهة API ولوحة التحكم صلاحية مساحة العمل، وكيف تضيف صلاحية جديدة.