feat: enhance /oauth/userinfo endpoint to include primary_role and context in response

This commit is contained in:
hamed
2026-06-11 10:56:48 +03:30
parent c996aca96c
commit 54c491c734
+40 -22
View File
@@ -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 های جدید