feat(validation): enforce naming rules for doctors and clinics to prevent placeholders
This commit is contained in:
@@ -148,10 +148,25 @@ Get clinic detail.
|
||||
|
||||
> `city`/`state`/`map` are resolved from the clinic's **address** (`DoctorAddress` linked by `clinic_id`), not from columns on the clinic. Each is an array with a single object (or empty `[]` if the clinic has no address). `doctors` is a **count**; the actual doctor list comes from `GET /api/v1/clinic/doctor-list/{clinicUuid}` (`doctor_list` here is always `null`).
|
||||
|
||||
### معنای `is_active`
|
||||
|
||||
`is_active: false` یعنی **«موقتاً غیرفعال»**، نه «حذفشده». تصمیم صریح، چون رکورد و نوبتهای تاریخیاش باقی میمانند و کلینیک ممکن است دوباره فعال شود.
|
||||
|
||||
پیامدها:
|
||||
|
||||
- کلینیک غیرفعال همچنان از API برمیگردد و لینک مستقیمش **۲۰۰** میدهد (نه ۴۰۴/۴۱۰) تا لینکهای موجود نشکنند.
|
||||
- سایت عمومی همان صفحه را `noindex` میکند و از sitemap بیرون میگذارد (`nobat724_front/lib/entityQuality.js` → `isThinClinic`).
|
||||
- اگر روزی معنای «حذفشده» لازم شد، باید فیلد جداگانهای اضافه شود — نه بازتعریف این یکی.
|
||||
|
||||
### نام کلینیک
|
||||
|
||||
`name` نمیتواند شمارهتلفن یا مقدار آزمایشی (`test`، `تست`، `-`) باشد؛ این مقادیر با `422` رد میشوند (`App\Shared\Util\DisplayName`). `null` مجاز است و یعنی «هنوز نامگذاری نشده».
|
||||
|
||||
### Errors
|
||||
| Code | HTTP | Description |
|
||||
|------|------|-------------|
|
||||
| `ERR_NOT_FOUND_001` | 404 | Clinic not found |
|
||||
| `ERR_VALIDATION_001` | 422 | نام کلینیک شمارهتلفن یا مقدار آزمایشی است |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ Create a doctor profile for the authenticated user.
|
||||
| `ERR_AUTH_001` | 401 | Missing or invalid token |
|
||||
| `ERR_CONFLICT_001` | 409 | Doctor profile already exists for this user |
|
||||
| `ERR_VALIDATION_002` | 422 | Missing required field |
|
||||
| `ERR_VALIDATION_001` | 422 | نام پزشک شمارهتلفن یا مقدار آزمایشی است |
|
||||
|
||||
---
|
||||
|
||||
@@ -248,6 +249,21 @@ List doctors with pagination and filters.
|
||||
|
||||
> ℹ️ `point` و `satisfaction` فقط برای `owner_status="claimed"` مقدار دارند؛ برای `unclaimed`/`pending_transfer` هر دو `null` هستند.
|
||||
|
||||
### اعتبارسنجی نام پزشک
|
||||
|
||||
`name` نمیتواند شمارهتلفن (`^0?9\d{9}$`) یا مقدار آزمایشی (`test`، `تست`، `-`، `null`) باشد. این مقادیر در **هر** مسیر نوشتن با `422` رد میشوند — API عمومی، پنل ادمین، import و دعوت کلینیک — چون گارد روی خودِ Entity نشسته است (`App\Shared\Util\DisplayName`).
|
||||
|
||||
دلیل: نام پزشک در `<title>` و نتایج جستوجوی سایت عمومی رندر میشود؛ رکوردی با نام «09390039833» یک صفحهٔ بیارزش ایندکسشدنی میسازد.
|
||||
|
||||
> دعوت پزشک توسط کلینیک، اگر نام ارسال نشود، دیگر شمارهٔ موبایل را بهعنوان نام نمینشاند — برچسب خنثای «پزشک دعوتشده» میگیرد تا خود پزشک پروفایلش را claim کند. (ریشهٔ آلودگی تولیدی همین بود.)
|
||||
|
||||
فرمان ممیزی رکوردهای موجود:
|
||||
|
||||
```bash
|
||||
php bin/console app:audit-polluted-records # فقط گزارش
|
||||
php bin/console app:audit-polluted-records --force # خارجکردن از انتشار (بدون حذف)
|
||||
```
|
||||
|
||||
### `city` / `state` در پاسخ لیست
|
||||
|
||||
آرایه با حداکثر یک عضو — همشکل با `city`/`state` در پاسخ جزئیات پزشک و پاسخ لیست کلینیکها.
|
||||
|
||||
Reference in New Issue
Block a user