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 | داکیومنت | توضیح | | 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/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/charts` | [admin.md](../docs/api/admin.md) | نمودار ۳۰ روزه ادمین |
| `GET /api/v1/admin/dashboard/recent` | [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/clinics/{uuid}` | [clinic.md](../docs/api/clinic.md) | جزئیات کلینیک |
| `GET /api/v1/admin/clinics` | [admin.md](../docs/api/admin.md) | لیست کلینیک‌ها — فقط ROLE_ADMIN | | `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 های جدید که باید ساخته شوند ### API های جدید که باید ساخته شوند
| Endpoint | فایل کنترلر | توضیح | | 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/clinic` | `src/Dashboard/Controller/DashboardController.php` | داشبورد صاحب کلینیک |
| `GET /api/v1/dashboard/doctor` | همان | داشبورد دکتر | | `GET /api/v1/dashboard/doctor` | همان | داشبورد دکتر |
| `GET /api/v1/dashboard/secretary` | همان | داشبورد منشی | | `GET /api/v1/dashboard/secretary` | همان | داشبورد منشی |
@@ -72,29 +77,42 @@
--- ---
## مرحله ۱endpoint شناسایی کاربر (بک‌اند) — API جدید ## مرحله ۱گسترش `/oauth/userinfo` (بک‌اند)
### فایل جدید: `src/Auth/Controller/MeController.php` ### فایل: `src/Auth/Controller/AuthController.php`
``` endpoint موجود `/oauth/userinfo` را گسترش بده — همان route، همان permission، فقط دو فیلد جدید به پاسخ اضافه می‌شود.
GET /api/v1/me [IS_AUTHENTICATED_FULLY]
```
> این endpoint با `/oauth/userinfo` فرق دارد — علاوه بر اطلاعات پایه، `primary_role` و `context` (مثل uuid دکتر/کلینیک) را هم برمی‌گرداند. پاسخ فعلی:
پاسخ:
```json ```json
{ {
"success": true, "success": true,
"data": { "data": {
"id": 4766,
"uuid": "...", "uuid": "...",
"mobile": "09...", "mobile_number": "09...",
"name": "دکتر علی ...", "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"], "roles": ["ROLE_USER", "ROLE_DOCTOR"],
"primary_role": "doctor", "primary_role": "doctor",
"context": { "context": {
"doctor_uuid": "...", "doctor_uuid": "...",
"doctor_name": "دکتر علی احمدی" "doctor_name": "دکتر وحید درویشی"
} }
} }
} }
@@ -110,7 +128,7 @@ GET /api/v1/me [IS_AUTHENTICATED_FULLY]
**پر کردن `context`**: **پر کردن `context`**:
- `ROLE_DOCTOR`: از `DoctorRepository::findByUser($user)` → `{doctor_uuid, doctor_name}` - `ROLE_DOCTOR`: از `DoctorRepository::findByUser($user)` → `{doctor_uuid, doctor_name}`
- `ROLE_CLINIC`: از `ClinicRepository::findByUser($user)` → `{clinic_uuid, clinic_name, clinic_logo}` - `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` - اگر موجودیت پیدا نشد: `context: null`
**متد جدید در `DoctorSecretaryRepository`**: **متد جدید در `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()`: همه فیلدها را پاک کند - متد `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()` — متد جدید 1. `DoctorSecretaryRepository::findActiveBySecretary()` — متد جدید
2. `MeController` — بک‌اند، تست با curl 2. `AuthController::userInfo()` — گسترش برای `primary_role` + `context`، تست با curl
3. `authStore.ts` — اضافه کردن fetchMe + فیلدهای جدید 3. `authStore.ts` — اضافه کردن fetchMe + فیلدهای جدید
4. `App.tsx` — fetchMe در mount 4. `App.tsx` — fetchMe در mount
5. `DashboardController` — هر سه endpoint 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/Dashboard/Controller/DashboardController.php`
- `src/Appointment/Controller/MyAppointmentsController.php` - `src/Appointment/Controller/MyAppointmentsController.php`
### بک‌اند (تغییر)
- `src/Secretary/Repository/DoctorSecretaryRepository.php` — اضافه: `findActiveBySecretary()`
### فرانت‌اند (تغییر) ### فرانت‌اند (تغییر)
- `assets/admin/stores/authStore.ts` — اضافه: primaryRole، context، fetchMe() - `assets/admin/stores/authStore.ts` — اضافه: primaryRole، context، fetchMe()
- `assets/admin/App.tsx` — اضافه: RoleRoute، fetchMe در mount، route های جدید - `assets/admin/App.tsx` — اضافه: RoleRoute، fetchMe در mount، route های جدید