From 54c491c734b43664c25ffadcfa64c370a34fb622 Mon Sep 17 00:00:00 2001 From: hamed <15238-genius.ha@users.noreply.drupalcode.org> Date: Thu, 11 Jun 2026 10:56:48 +0330 Subject: [PATCH] feat: enhance /oauth/userinfo endpoint to include primary_role and context in response --- .claude/prompt/multi-role-dashboard.md | 62 +++++++++++++++++--------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/.claude/prompt/multi-role-dashboard.md b/.claude/prompt/multi-role-dashboard.md index 19a36561..a9395755 100644 --- a/.claude/prompt/multi-role-dashboard.md +++ b/.claude/prompt/multi-role-dashboard.md @@ -19,7 +19,7 @@ | Endpoint | داکیومنت | توضیح | |----------|----------|-------| -| `GET /oauth/userinfo` | [auth.md](../docs/api/auth.md) | اطلاعات پایه کاربر — بدون `primary_role` و `context` | +| `GET /oauth/userinfo` | [auth.md](../docs/api/auth.md) | اطلاعات کاربر — باید `primary_role` و `context` به آن اضافه شود | | `GET /api/v1/admin/dashboard/stats` | [admin.md](../docs/api/admin.md) | KPI های داشبورد ادمین | | `GET /api/v1/admin/dashboard/charts` | [admin.md](../docs/api/admin.md) | نمودار ۳۰ روزه ادمین | | `GET /api/v1/admin/dashboard/recent` | [admin.md](../docs/api/admin.md) | آخرین فعالیت‌ها برای ادمین | @@ -29,11 +29,16 @@ | `GET /api/v1/clinics/{uuid}` | [clinic.md](../docs/api/clinic.md) | جزئیات کلینیک | | `GET /api/v1/admin/clinics` | [admin.md](../docs/api/admin.md) | لیست کلینیک‌ها — فقط ROLE_ADMIN | +### تغییر روی API موجود + +| Endpoint | فایل | توضیح | +|----------|------|-------| +| `GET /oauth/userinfo` | `src/Auth/Controller/AuthController.php` | اضافه کردن `primary_role` و `context` به پاسخ موجود | + ### API های جدید که باید ساخته شوند | Endpoint | فایل کنترلر | توضیح | |----------|-------------|-------| -| `GET /api/v1/me` | `src/Auth/Controller/MeController.php` | شناسایی نقش + context کاربر | | `GET /api/v1/dashboard/clinic` | `src/Dashboard/Controller/DashboardController.php` | داشبورد صاحب کلینیک | | `GET /api/v1/dashboard/doctor` | همان | داشبورد دکتر | | `GET /api/v1/dashboard/secretary` | همان | داشبورد منشی | @@ -72,29 +77,42 @@ --- -## مرحله ۱ — endpoint شناسایی کاربر (بک‌اند) — API جدید +## مرحله ۱ — گسترش `/oauth/userinfo` (بک‌اند) -### فایل جدید: `src/Auth/Controller/MeController.php` +### فایل: `src/Auth/Controller/AuthController.php` -``` -GET /api/v1/me [IS_AUTHENTICATED_FULLY] -``` +endpoint موجود `/oauth/userinfo` را گسترش بده — همان route، همان permission، فقط دو فیلد جدید به پاسخ اضافه می‌شود. -> این endpoint با `/oauth/userinfo` فرق دارد — علاوه بر اطلاعات پایه، `primary_role` و `context` (مثل uuid دکتر/کلینیک) را هم برمی‌گرداند. - -پاسخ: +پاسخ فعلی: ```json { "success": true, "data": { + "id": 4766, "uuid": "...", - "mobile": "09...", - "name": "دکتر علی ...", + "mobile_number": "09...", + "realName": "دکتر وحید درویشی", + "status": 1, + "roles": ["ROLE_USER", "ROLE_DOCTOR"] + } +} +``` + +پاسخ بعد از تغییر (دو فیلد جدید اضافه): +```json +{ + "success": true, + "data": { + "id": 4766, + "uuid": "...", + "mobile_number": "09...", + "realName": "دکتر وحید درویشی", + "status": 1, "roles": ["ROLE_USER", "ROLE_DOCTOR"], "primary_role": "doctor", "context": { "doctor_uuid": "...", - "doctor_name": "دکتر علی احمدی" + "doctor_name": "دکتر وحید درویشی" } } } @@ -110,7 +128,7 @@ GET /api/v1/me [IS_AUTHENTICATED_FULLY] **پر کردن `context`**: - `ROLE_DOCTOR`: از `DoctorRepository::findByUser($user)` → `{doctor_uuid, doctor_name}` - `ROLE_CLINIC`: از `ClinicRepository::findByUser($user)` → `{clinic_uuid, clinic_name, clinic_logo}` -- `ROLE_SECRETARY`: از `DoctorSecretaryRepository::findActiveBySecretary($user)` (متد جدید) → `{doctor_uuid, doctor_name, secretary_uuid, permissions}` +- `ROLE_SECRETARY`: از `DoctorSecretaryRepository::findActiveBySecretary($user)` (متد جدید) → `{secretary_uuid, doctor_uuid, doctor_name, permissions}` - اگر موجودیت پیدا نشد: `context: null` **متد جدید در `DoctorSecretaryRepository`**: @@ -121,7 +139,7 @@ public function findActiveBySecretary(User $user): ?DoctorSecretary } ``` -**داکیومنت**: بعد از پیاده‌سازی، endpoint را به `docs/api/auth.md` اضافه کن. +**داکیومنت**: بعد از پیاده‌سازی، پاسخ `/oauth/userinfo` را در `docs/api/auth.md` به‌روز کن. --- @@ -142,9 +160,9 @@ interface AuthState { } ``` -- متد `login(token, refreshToken)`: بعد از ذخیره token، یک `GET /api/v1/me` بزند و نتیجه را ذخیره کند +- متد `login(token, refreshToken)`: بعد از ذخیره token، یک `GET /oauth/userinfo` بزند و نتیجه را ذخیره کند - متد `logout()`: همه فیلدها را پاک کند -- متد جدید `fetchMe()`: `GET /api/v1/me` و update store — در `App.tsx` هنگام mount فراخوانی شود (اگر token موجود بود اما `primaryRole` خالی بود، تا بعد از reload صفحه role بازیابی شود) +- متد جدید `fetchMe()`: `GET /oauth/userinfo` و update store — در `App.tsx` هنگام mount فراخوانی شود (اگر token موجود بود اما `primaryRole` خالی بود، تا بعد از reload صفحه role بازیابی شود) --- @@ -479,7 +497,7 @@ const endpoint = primaryRole === 'admin' ### ترتیب اجرا (پیشنهادی) 1. `DoctorSecretaryRepository::findActiveBySecretary()` — متد جدید -2. `MeController` — بک‌اند، تست با curl +2. `AuthController::userInfo()` — گسترش برای `primary_role` + `context`، تست با curl 3. `authStore.ts` — اضافه کردن fetchMe + فیلدهای جدید 4. `App.tsx` — fetchMe در mount 5. `DashboardController` — هر سه endpoint @@ -496,14 +514,14 @@ const endpoint = primaryRole === 'admin' ## خلاصه فایل‌های جدید/تغییریافته +### بک‌اند (تغییر) +- `src/Auth/Controller/AuthController.php` — گسترش `userInfo()`: اضافه کردن `primary_role` و `context` +- `src/Secretary/Repository/DoctorSecretaryRepository.php` — اضافه: `findActiveBySecretary()` + ### بک‌اند (جدید) -- `src/Auth/Controller/MeController.php` - `src/Dashboard/Controller/DashboardController.php` - `src/Appointment/Controller/MyAppointmentsController.php` -### بک‌اند (تغییر) -- `src/Secretary/Repository/DoctorSecretaryRepository.php` — اضافه: `findActiveBySecretary()` - ### فرانت‌اند (تغییر) - `assets/admin/stores/authStore.ts` — اضافه: primaryRole، context، fetchMe() - `assets/admin/App.tsx` — اضافه: RoleRoute، fetchMe در mount، route های جدید