انتقل إلى المقال
Aniq-UI

Northstackالفريق والأدوار والصلاحيات

الفريق والأدوار والصلاحيات

كيف تعمل أعضاء مساحة العمل والدعوات والمقاعد، وأدوار مساحة العمل الأربعة والصلاحيات الأربع عشرة في مصفوفة أدوار كل مساحة، وما يراه كل حساب أولي، وكيف تنتقل الملكية.

لحزمة الحزمة الكاملة

كيف يعمل الوصول

  • الحساب هو كل من يسجّل الدخول. وينتمي إلى مساحة عمل عبر عضوية بدور واحد: المالك (واحد بالضبط في كل مساحة عمل) أو مسؤول أو عضو أو الفوترة. ويمكن للحساب نفسه أن يحمل دورًا مختلفًا في كل مساحة عمل ينتمي إليها.
  • تحتفظ كل مساحة عمل بمصفوفة أدوارها: أي دور يملك أي صلاحية من أربع عشرة. يملكها المالك كلها ولا يمكن تعديله، واثنتان منها، 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/membersworkspace.read
PATCH /api/workspaces/:workspaceId/members/:memberIdroles.manage
DELETE /api/workspaces/:workspaceId/members/:memberIdmembers.remove
POST /api/workspaces/:workspaceId/members/transfer-ownershipالمالك
GET /api/workspaces/:workspaceId/invitationsworkspace.read
POST /api/workspaces/:workspaceId/invitations, POST .../invitations/:id/resend, DELETE .../invitations/:idmembers.invite
GET /api/invitations/:token وPOST /api/invitations/:token/acceptلا شيء للقراءة؛ وتسجيل الدخول بالبريد المدعو للقبول
GET /api/workspaces/:workspaceId/rolesworkspace.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 ولوحة التحكم صلاحية مساحة العمل، وكيف تضيف صلاحية جديدة.

توقفت عند خطوة؟

ابحث عن الحل قبل أن تبدأ من جديد.

حل المشكلات

تفضيلات ملفات تعريف الارتباط

نستخدم ملفات تعريف الارتباط لتعزيز تجربة التصفح الخاصة بك وتحليل حركة المرور على الموقع وتخصيص المحتوى. بالنقر على "قبول الكل"، فإنك توافق على استخدامنا لملفات تعريف الارتباط للتحليلات والإعلانات المخصصة.