- Add SendSmsMessage class for encapsulating SMS message data. - Create KavehNegarProvider and RanginehProvider classes implementing SmsProviderInterface for sending SMS. - Implement SmsLogRepository and SmsTemplateRepository for managing SMS logs and templates. - Develop SendSmsHandler for handling SMS sending messages. - Create SmsService to manage SMS dispatching and logging. - Add UserProfileController for managing user profiles with CRUD operations. - Implement UserProfile entity and repository for user profile data management. - Update symfony.lock and bootstrap.php for project dependencies and environment setup.
6.1 KiB
6.1 KiB
تسک ۰۵: ماژول دکتر
توضیح
پیادهسازی مدیریت پروفایل دکترها، لیست دکترها با فیلتر، آپلود تصویر پروفایل و مدیریت آدرسهای مطب.
Endpoint ها (واقعی از Drupal)
| متد | مسیر | توضیح | نیاز به Auth |
|---|---|---|---|
| POST | /api/v1/doctor |
ایجاد پروفایل دکتر | بله |
| PATCH | /api/v1/doctor/{uuid} |
ویرایش پروفایل دکتر | بله (Owner/Admin) |
| DELETE | /api/v1/doctor/{uuid} |
حذف دکتر | بله (Admin) |
| GET | /api/v1/doctor/{uuid} |
دریافت پروفایل کامل دکتر | خیر |
| GET | /api/v1/doctors |
لیست دکترها با فیلتر | خیر |
| POST | /file/upload/clinic_pro/doctor/field_image |
آپلود تصویر پروفایل دکتر | بله |
| GET | /api/v1/clinic/doctor-list/{clinic_uuid} |
لیست دکترهای یک کلینیک | خیر |
| POST | /api/v1/clinic-pro/doctor-address |
ایجاد آدرس مطب | بله |
| PATCH | /api/v1/clinic-pro/doctor-address/{id} |
ویرایش آدرس | بله |
| DELETE | /api/v1/clinic-pro/doctor-address/{id} |
حذف آدرس | بله |
| GET | /api/v1/clinic-pro/doctor-address/{id} |
دریافت یک آدرس | بله |
| GET | /api/v1/clinic-pro/doctor-addresses/{doctorId} |
لیست آدرسهای دکتر | خیر |
پیشنیازها
- تسک ۰۱، ۰۲، ۰۸ (Categories برای تخصص و سرویسها)
زمان تخمینی
۸ تا ۱۰ ساعت
نمونه واقعی Response — GET /api/v1/doctor/{uuid}
{
"id": "29",
"uuid": "61be915b-595a-42e5-bca5-f80d22f4f14a",
"name": "single doctor",
"gender": "woman",
"experience": 21,
"activity_time": "1107808200",
"medical_system_code": "121212121212",
"detail": "test",
"degree": "specialist",
"specialties": [
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"img": [
{
"url": "https://domain.com/sites/default/files/doctors/2025-11/image.png",
"fid": "98",
"filename": "image.png",
"filemime": "image/png",
"filesize": 173665
}
],
"expertise": [
{ "uuid": "...", "id": "1601", "name": "معاینه و تشخیص پزشک متخصص" },
{ "uuid": "...", "id": "1602", "name": "ویزیت تخصصی" }
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "اولین نوبت آزاد: سهشنبه 19 خرداد ساعت 15:00",
"hours_of_work": "از شنبه تا چهارشنبه از ساعت 08:00 تا 18:00",
"address": [
{
"id": "39",
"uuid": "7b759d2a-af8a-4730-8eb0-e77dcd3a724e",
"name": "مطب اصلی",
"map": { "latitude": "53.121212", "longitude": "57.121212" },
"address": "آدرس کامل مطب",
"telephone": "09120671756"
}
],
"average_rate": { "total_rates": null },
"state": [{ "uuid": "...", "id": "23", "name": "کهگیلویه و بویراحمد" }],
"city": [{ "uuid": "...", "id": "123", "name": "یاسوج", "parent": "23" }]
}
توجه فیلدها:
img(نهimageیاimages!) — آرایه با url/fid/filename/filemime/filesizespecialties→ تخصص اصلی + والدexpertise→ همان doctor_servicessatisfactionوpointبه صورت string برگردانده میشوندfree_turn→ متن محاسبهشده از برنامه هفتگی (مثلاً "نوبت آزادی موجود نیست")hours_of_work→ متن محاسبهشده از برنامه هفتگیaverage_rate.total_rates→ میتواند null باشدexperience→ محاسبهشده ازactivity_time(Unix timestamp شروع فعالیت)
فیلترهای GET /api/v1/doctors
| پارامتر | نوع | الزامی | مثال |
|---|---|---|---|
state |
string | بله | 31 |
city |
string | بله | 62 |
specialty |
string | خیر | 503 |
gender |
string | خیر | man یا woman |
degree |
string | خیر | general, specialist, expert, subspecialistplus |
name |
string | خیر | علی |
active |
array | خیر | 0 یا 1 |
page |
string | خیر | 1 |
limit |
string | خیر | 10 |
sort |
string | خیر | ASC یا DESC |
نمونه Response لیست دکترها
{
"data": [
{
"id": "29",
"uuid": "...",
"name": "single doctor",
"gender": "woman",
"degree": "specialist",
"img": [{ "url": "...", "fid": "98", "filename": "image.png", "filemime": "image/png", "filesize": 173665 }],
"specialties": [{ "uuid": "...", "id": "603", "name": "داخلی عمومی", "parent": "602" }],
"satisfaction": "60",
"point": "3.5",
"free_turn": "اولین نوبت آزاد: سهشنبه 19 خرداد ساعت 15:00",
"hours_of_work": "از شنبه تا چهارشنبه از ساعت 08:00 تا 18:00",
"active": true
}
],
"page": {
"totalRecords": 7,
"totalPages": 1,
"currentPage": 1
}
}
PATCH /api/v1/doctor/{uuid} — فیلدهای قابل ویرایش
{
"title": "نام دکتر",
"doctor_services": ["اکوکاردیوگرافی", "ویزیت تخصصی"]
}
آپلود تصویر دکتر — POST /file/upload/clinic_pro/doctor/field_image
Headers:
Content-Type: application/octet-stream
Content-Disposition: file; filename="doctor.png"
X-CSRF-Token: {token}
Authorization: Bearer {token}
Body: binary file content
Response → { fid, uuid, ... } که در PATCH doctor استفاده میشود
نمونه واقعی Response — GET /api/v1/clinic-pro/doctor-address/{id}
{
"id": "39",
"uuid": "7b759d2a-af8a-4730-8eb0-e77dcd3a724e",
"name": "مطب اصلی",
"map": {
"latitude": "53.121212",
"longitude": "57.121212"
},
"address": "آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد، برج ماندگار",
"telephone": "09120671756"
}