feat: owner read-only view-as from team users table

Allow org owners to inspect any member's data scope via dual JWT; server blocks mutations and team page stays reachable for return.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-17 19:57:26 +03:30
co-authored by Cursor
parent 52c7306e78
commit f7b07f6b7a
13 changed files with 435 additions and 49 deletions
@@ -0,0 +1,34 @@
# مشاهده به‌جای کاربر (فقط‌خواندنی برای مالک)
تاریخ: ۲۰۲۶-۱۰-۱۷
وضعیت: پیاده‌سازی‌شده.
## هدف
مالک محیط بتواند از جدول کاربران صفحهٔ تیم، با هویت هر عضو همان محیط وارد شود و همان دید داده/منو/نقش او را ببیند، بدون امکان ایجاد، ویرایش یا حذف.
## قواعد
- فقط نقش `owner` می‌تواند وارد حالت مشاهده شود.
- هدف: هر عضو همان `organizationId` (فهرست کاربران تیم).
- توکن دو هویت دارد: `userId` = کاربر مشاهده‌شده، `impersonatorUserId` = مالک واقعی، `viewAsReadOnly: true`.
- دید داده و نقش ظاهری مثل کاربر مشاهده‌شده است.
- هر متد تغییردهنده (POST/PATCH/PUT/DELETE به‌جز استثناها) با پیام فارسی رد می‌شود:
«در حالت مشاهده به‌جای کاربر دیگر امکان تغییر وجود ندارد.»
- ظاهر UI مثل حالت عادی می‌ماند؛ فقط سرور خطا می‌دهد.
- برگشت: کلیک روی ردیف خود مالک در جدول کاربران تیم.
- در حالت مشاهده، دسترسی به صفحهٔ تیم برای مالک واقعی باز می‌ماند.
- خروج از سیستم مشاهده را تمام می‌کند؛ ورود بعدی فقط حساب مالک است.
## استثناهای مجاز در حالت مشاهده
- `POST`/`PATCH` مربوط به شروع/پایان مشاهده (impersonate / stop)
- `POST` خروج (`logout` اگر باشد)
- خواندن‌ها: GET
- در صورت نیاز: سوئیچ لنز بایگانی اطلاعات قبل (خواندنی برای دیدن همان دید کاربر)
## خارج از محدوده
- مشاهده برای غیرمالک
- نوار بنر بازگشت (عمداً حذف شد؛ برگشت از جدول تیم)
- مخفی کردن دکمه‌های ویرایش در UI