# رفع باگ پروفایل دکتر در context کلینیک — doctor_uuid با clinic_uuid اشتباه گرفته می‌شود ## زمینه دکتری که عضو چند کلینیک است، در صفحه «انتخاب محیط کاری» می‌تواند به context کلینیک سوئیچ کند. بعد از سوئیچ، `dbUuid` در authStore برابر **uuid کلینیک** می‌شود. وقتی دکتر به `/admin/profile` می‌رود، `DoctorProfilePage` از `dbUuid` به عنوان uuid دکتر استفاده می‌کند و همه API callها با uuid اشتباه صدا زده می‌شوند: - `GET /api/v1/doctor/c9c6a393-...` (uuid کلینیک) → 404 - `GET /api/v1/appointment-slots?doctor_uuid=c9c6a393-...` → 404 کاربر تست: `09123456783` — دکتر `8b066a5e-3742-4bf7-8087-0b1f8d98de08` (uuid دکتر) که عضو کلینیک `c9c6a393-9182-4388-8cdc-6423026eeb54` است. ## مشکل / هدف `dbUuid` دو معنی متفاوت دارد: - در context مطب شخصی: uuid دکتر ✓ - در context کلینیک: uuid کلینیک ✗ (اما `DoctorProfilePage` آن را uuid دکتر فرض می‌کند) راه‌حل: `doctor_uuid` را به عنوان فیلد جداگانه در `userinfo` و `switch-context` response اضافه کن و در store ذخیره کن. `DoctorProfilePage` باید از `doctorUuid` استفاده کند نه `dbUuid`. ## فایل‌های مرتبط | فایل | نقش | |------|-----| | `src/Auth/Controller/AuthController.php` | `userInfo()` خط 516، `switchContext()` خط 571 | | `assets/admin/stores/authStore.ts` | `fetchMe()` و `switchContext()` — خط 86 و 105 | | `assets/admin/pages/DoctorDetailPage.tsx` | `uuid = isOwnProfile ? (dbUuid ?? undefined) : paramUuid` — خط 2162 | | `assets/admin/pages/DoctorProfilePage.tsx` | wrapper که `isOwnProfile` را به DoctorDetailPage پاس می‌دهد | ## وضعیت فعلی ### Backend — `userInfo()` response (خط 536-548) ```php return $this->success([ 'uuid' => $user->getUuid(), 'primary_role' => $primaryRole, 'db_uuid' => $dbUuid, // ← وقتی context کلینیک است، این uuid کلینیک است 'context' => $context, 'available_contexts' => $availableContexts, // ← doctor_uuid وجود ندارد ]); ``` ### Backend — `buildAvailableContexts()` (خط 614-661) ```php if ($doctor = $this->doctorRepo->findByUser($user)) { $contexts[] = [ 'type' => 'doctor', 'db_uuid' => $doctor->getUuid(), // ← uuid دکتر در این context 'role' => 'doctor', ]; foreach ($this->clinicRepo->findByDoctor($doctor) as $clinic) { $contexts[] = [ 'type' => 'clinic', 'db_uuid' => $clinic->getUuid(), // ← uuid کلینیک در این context 'role' => 'clinic', // ← doctor_uuid ندارد ]; } } ``` ### Frontend — `authStore.ts` (خط 19، 94-95) ```ts interface AuthState { dbUuid: string | null; // ← فقط یک uuid — در context کلینیک، uuid کلینیک است // ← doctorUuid وجود ندارد } // fetchMe: set({ dbUuid: d.db_uuid ?? null, // ← uuid کلینیک یا دکتر بسته به context // ← doctorUuid set نمی‌شود }); ``` ### Frontend — `DoctorDetailPage.tsx` (خط 2162) ```tsx const uuid = isOwnProfile ? (dbUuid ?? undefined) : paramUuid; // ← وقتی context کلینیک است: uuid = uuid کلینیک → همه API ها با uuid اشتباه صدا زده می‌شوند ``` ## وظایف ### ۱. Backend — اضافه کردن `doctor_uuid` به response های auth در `src/Auth/Controller/AuthController.php`: **الف) `userInfo()` (خط 536):** فیلد `doctor_uuid` را اضافه کن: ```php $doctor = $this->doctorRepo->findByUser($user); return $this->success([ 'id' => $user->getId(), 'uuid' => $user->getUuid(), 'mobile_number' => $user->getMobileNumber(), 'realName' => $user->getRealName(), 'status' => $user->getStatus(), 'roles' => $user->getRoles(), 'primary_role' => $primaryRole, 'db_uuid' => $dbUuid, 'db_key' => $dbKey, 'doctor_uuid' => $doctor?->getUuid(), // ← اضافه شود 'context' => $context, 'available_contexts' => $availableContexts, ]); ``` **ب) `buildAvailableContexts()` (خط 626):** `doctor_uuid` را به context های کلینیک اضافه کن: ```php foreach ($this->clinicRepo->findByDoctor($doctor) as $clinic) { $contexts[] = [ 'type' => 'clinic', 'db_uuid' => $clinic->getUuid(), 'name' => $clinic->getName() ?? '', 'role' => 'clinic', 'doctor_uuid' => $doctor->getUuid(), // ← اضافه شود ]; } ``` **ج) `switchContext()` response (خط 595):** بدون تغییر — `context` کامل برمی‌گردد و شامل `doctor_uuid` خواهد بود. ### ۲. Frontend — اضافه کردن `doctorUuid` به authStore در `assets/admin/stores/authStore.ts`: **الف) `ContextItem` interface (خط 4):** ```ts export interface ContextItem { type: 'doctor' | 'clinic'; db_uuid: string; name: string; role: 'admin' | 'clinic' | 'doctor' | 'secretary' | 'user'; doctor_uuid?: string; // ← اضافه شود — فقط در context های کلینیک permissions?: Record; } ``` **ب) `AuthState` interface (خط 12):** ```ts interface AuthState { // ... dbUuid: string | null; doctorUuid: string | null; // ← اضافه شود — همیشه uuid دکتر، بدون توجه به context // ... } ``` **ج) مقدار اولیه (خط 62):** ```ts dbUuid: null, doctorUuid: null, // ← اضافه شود ``` **د) `logout` (خط 72):** ```ts doctorUuid: null, // ← اضافه شود ``` **ه) `fetchMe` (خط 91):** ```ts set({ dbUuid: d.db_uuid ?? null, doctorUuid: d.doctor_uuid ?? null, // ← اضافه شود // ... }); ``` **و) `switchContext` (خط 111):** ```ts set({ dbUuid: res.data.db_uuid, doctorUuid: res.data.context?.doctor_uuid ?? get().doctorUuid, // ← context کلینیک doctor_uuid دارد، بقیه همان قبلی dbKey: res.data.db_key, context: res.data.context, primaryRole: res.data.context?.role ?? null, }); ``` **ز) `partialize` (خط 121):** ```ts partialize: (s) => ({ // ... doctorUuid: s.doctorUuid, // ← اضافه شود // ... }) ``` ### ۳. Frontend — استفاده از `doctorUuid` در `DoctorDetailPage` در `assets/admin/pages/DoctorDetailPage.tsx` خط 2160-2162: ```tsx const primaryRole = useAuthStore(s => s.primaryRole); const dbUuid = useAuthStore(s => s.dbUuid); const doctorUuid = useAuthStore(s => s.doctorUuid); // ← اضافه شود // تغییر خط 2162: const uuid = isOwnProfile ? (doctorUuid ?? dbUuid ?? undefined) // ← doctorUuid اولویت دارد : paramUuid; ``` این تضمین می‌کند که حتی در context کلینیک، uuid دکتر برای همه API callها استفاده شود. ## نکات مهم - **migration لازم نیست** — هیچ entity تغییر نمی‌کند - `doctorUuid` فقط برای کاربرانی که role دکتر دارند پر می‌شود — برای admin و clinic-owner خالص `null` است - `get().doctorUuid` در `switchContext` — اگر context جدید `doctor_uuid` نداشت (مثلاً مطب شخصی که `db_uuid` خودش uuid دکتر است)، مقدار قبلی حفظ شود - وقتی context مطب شخصی دکتر است (`type: 'doctor'`)، `db_uuid` خودش uuid دکتر است — `doctor_uuid` جداگانه نیاز نیست اما خوب است همان مقدار ست شود - بعد از تغییر backend: `cache:clear` - بعد از تغییر frontend: `yarn dev` و TypeScript check - مستندات: `docs/api/auth.md` را با فیلد `doctor_uuid` در response های `userinfo` و `switch-context` به‌روزرسانی کن - کاربر تست: `09123456783` — doctor_uuid: `8b066a5e-3742-4bf7-8087-0b1f8d98de08`