Files
clinicpro/docs/ClinicPro_Manual_v2.md
hamed de1a78a235 feat: Implement SMS sending functionality with KavehNegar and Rangineh providers
- 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.
2026-06-09 22:00:34 +03:30

5893 lines
223 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: کلینیک پرو — مستند جامع فنی و API
version: 2.0.0
status: پیش‌نویس
---
<div dir="rtl">
# کلینیک پرو — مستند جامع فنی و API
> **نسخه:** 2.0.0 &nbsp;|&nbsp; **وضعیت:** پیش‌نویس — در حال بررسی &nbsp;|&nbsp; **سال:** ۱۴۰۴
>
> **Base URL:** `https://back-dev.clinic-pro.ir`
>
> **احراز هویت:** `Authorization: Bearer {access_token}` &nbsp;|&nbsp; **Content-Type:** `application/json`
>
> **علامت 🆕** = این endpoint دارای Response Body واقعی از سرور است.
---
## فهرست کلی
**بخش اول — مستند محصول (PRD)**
1. [معرفی محصول](#۱-معرفی-محصول)
2. [مدل داده و موجودیت‌ها](#۲-مدل-داده-و-موجودیت‌ها)
3. [مشخصات API (Task-based)](#۳-مشخصات-api)
4. [سیستم حساب و صف پیامک](#۴-سیستم-حساب-و-صف-پیامک)
5. [فهرست مشکلات](#۵-فهرست-مشکلات-شناسایی‌شده-و-اصلاحات-لازم)
6. [پیوست](#۶-پیوست)
**بخش دوم — مستند کامل API (۹۹ Endpoint)**
- [1. احراز هویت (Authentication)](#1-احراز-هویت-(authentication))
- [2. کاربر (User)](#2-کاربر-(user))
- [3. پروفایل بیمار (User Profile)](#3-پروفایل-بیمار-(user-profile))
- [4. دکتر (Doctor)](#4-دکتر-(doctor))
- [5. آدرس دکتر (Doctor Address)](#5-آدرس-دکتر-(doctor-address))
- [6. کلینیک (Clinic)](#6-کلینیک-(clinic))
- [7. نماینده (Agent / Representation)](#7-نماینده-(agent-/-representation))
- [8. دسته‌بندی‌ها (Categories)](#8-دسته‌بندی‌ها-(categories))
- [9. بیمه دکتر (Doctor Insurance)](#9-بیمه-دکتر-(doctor-insurance))
- [10. تنظیمات نوبت — برنامه هفتگی](#10-تنظیمات-نوبت-—-برنامه-هفتگی)
- [11. تنظیمات نوبت — Date Override](#11-تنظیمات-نوبت-—-date-override)
- [12. تنظیمات نوبت — تعطیلات](#12-تنظیمات-نوبت-—-تعطیلات)
- [13. نوبت‌دهی (Appointment)](#13-نوبت‌دهی-(appointment))
- [14. منشی (Secretary)](#14-منشی-(secretary))
- [15. پرداخت (Payment)](#15-پرداخت-(payment))
- [16. وبلاگ (Blog)](#16-وبلاگ-(blog))
---
# بخش اول — مستند محصول (PRD)
# ۱. معرفی محصول
کلینیک پرو یک سیستم جامع مدیریت کلینیک است که برای خدمت‌رسانی به دکترهای مستقل، کلینیک‌های چند پزشکی، نمایندگان شهری، منشی‌ها و بیماران طراحی شده است. این سیستم ثبت‌نام کاربران، احراز هویت، نوبت‌دهی آنلاین، مدیریت اشتراک، ارسال پیامک و جریان‌های مالی شامل پیگیری کمیسیون را پوشش می‌دهد.
## ۱.۱ نقش‌های سیستم
| **نقش** | **توضیحات** |
| ------------------ | ----------------------------------------------------------------- |
| Administrator | ادمین ارشد — مدیریت تنظیمات پلتفرم، تعطیلات، پلن‌ها و نرخ کمیسیون |
| admin | ادمین داخلی با دسترسی بالا |
| clinic | صاحب کلینیک — مدیریت پروفایل کلینیک، دکترها و نوبت‌ها |
| doctor | پزشک مستقل یا وابسته به کلینیک |
| doctor_s_secretary | منشی اختصاصی دکتر (دسترسی‌ها از طریق JSON مدیریت می‌شود) |
| patient | کاربر نهایی که نوبت رزرو می‌کند |
| representation | نماینده شهری که روی دامنه خود فعالیت می‌کند |
## ۱.۲ فلوهای عملیاتی اصلی
### ثبت‌نام دکتر — مستقل
- دکتر با شماره موبایل در سیستم ثبت‌نام می‌کند
- سیستم حساب کاربری با نقش doctor ایجاد می‌کند
- دکتر پروفایل را تکمیل و پلن را سابسکرایب می‌کند
### ثبت‌نام دکتر — از طریق کلینیک
- صاحب کلینیک دکتر را با شماره موبایل اضافه می‌کند
- پیامک با لینک تأیید/رد برای دکتر ارسال می‌شود
- در صورت رد: هیچ اقدامی انجام نمی‌شود
- در صورت تأیید: پیامک با لینک دانلود نرم‌افزار ارسال می‌شود
### ثبت‌نام دکتر — از طریق نماینده
- نماینده شماره موبایل دکتر و اطلاعات مربوطه را وارد می‌کند
- پیامک خوش‌آمدگویی با لینک دانلود نرم‌افزار برای دکتر ارسال می‌شود
- در صورت سابسکرایب پلن توسط دکتر: کمیسیون به کیف پول نماینده واریز می‌شود
## ۱.۳ پلن‌های اشتراک
| **ویژگی** | **پلن بیسیک (رایگان)** | **پلن پیشرفته** |
| --------------------- | ---------------------- | ------------------- |
| تعداد منشی فعال | ۱ منشی | ۳ منشی |
| نوبت‌دهی آنلاین | ✓ (با کمیسیون سایت) | ✓ (با کمیسیون سایت) |
| نوبت‌دهی آفلاین | ✗ | ✓ |
| پشتیبان‌گیری (Backup) | ✗ | ✓ |
| نوبت توسط منشی | بدون کمیسیون سایت | بدون کمیسیون سایت |
*نکته: تعریف پلن‌ها (ویژگی‌ها، قیمت) باید از پنل ادمین قابل تنظیم باشد. مبلغ کمیسیون به ازای هر نوبت آنلاین نیز باید قابل تنظیم باشد (مثلاً ۱۰،۰۰۰ تومان به ازای هر نوبت).*
## ۱.۴ سیستم پیامک
هر دکتر یا کلینیک باید یک حساب پیامک مستقل داشته باشد.
- دکتر یا کلینیک حساب پیامک خود را با تعداد مشخصی پیامک شارژ می‌کند (مثلاً ۱۰۰۰ پیامک)
- نرم‌افزار لوکال (Tauri) یک جاب اجرا می‌کند که یک روز قبل از نوبت برای بیماران پیامک یادآوری ارسال می‌کند
- این پیامک‌ها در صف ارسال قرار می‌گیرند
- به ازای هر پیامک ارسال‌شده، موجودی از حساب دکتر یا کلینیک کسر می‌شود
# ۲. مدل داده و موجودیت‌ها
## ۲.۱ کاربر (User)
موجودیت مرکزی سیستم. تمام نقش‌ها از این ساختار استفاده می‌کنند.
**⚠ مشکل شناسایی‌شده: جدول کاربران به درستی ایجاد نشده است. باید بر اساس فیلدهای زیر بازسازی شود.**
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------- | ----------------- | ------------------------------------------------------------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی — افزایشی خودکار | بله |
| uuid | UUID | شناسه یکتای جهانی | بله |
| uid | Integer (FK→User) | شناسه کاربر — ارجاع به خود جدول | بله |
| mobile_number | String (unique) | شماره موبایل — به عنوان نام کاربری استفاده می‌شود | بله |
| password | String (hashed) | رمز عبور — هش‌شده با Bcrypt | بله |
| realname | String | نام و نام خانوادگی کامل | بله |
| picture | String (URL) | آدرس تصویر پروفایل | اختیاری |
| roles | Array<String> | نقش‌های اختصاص‌یافته: administrator, admin, clinic, doctor, doctor_s_secretary, patient, representation | بله |
| status | Boolean | وضعیت حساب: فعال / غیرفعال | بله |
| created | Timestamp | زمان ایجاد رکورد | بله |
| changed | Timestamp | آخرین زمان ویرایش | بله |
**⚠ مشکل شناسایی‌شده: جدول نقش‌ها (Roles) به درستی ایجاد نشده است. نقش‌ها باید به صورت Enum تعریف و به کاربر متصل شوند.**
## ۲.۲ انواع دسته‌بندی (Category Types)
**⚠ مشکل شناسایی‌شده (Task-08): شهرها و استان‌ها به درستی ست نشده‌اند. تمام دسته‌بندی‌ها باید کاملاً تعریف شوند.**
### ۲.۲.۱ تگ (Tag)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | ------------ | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| label | String | نام تگ | بله |
| status | Boolean | فعال/غیرفعال | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۲.۲ استان (State)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | ------------ | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| label | String | نام استان | بله |
| status | Boolean | فعال/غیرفعال | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۲.۳ شهر (City)
**⚠ اصلاح شده: فیلد parent (ارجاع به استان) و سایر فیلدها باید کاملاً پیکربندی شوند.**
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ----------------- | --------------------- | ------------------------------ | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| label | String | نام شهر | بله |
| parent | Integer (FK→state.id) | ارجاع به استان مربوطه — الزامی | بله |
| status | Boolean | فعال/غیرفعال | بله |
| domain | String | دامنه نماینده این شهر | اختیاری |
| representation | Integer (FK→rep.id) | نماینده مرتبط با شهر | اختیاری |
| contactphone | String | شماره تماس | اختیاری |
| email | String | ایمیل تماس | اختیاری |
| description | Text | توضیحات شهر | اختیاری |
| title | String | عنوان صفحه شهر | اختیاری |
| keywords | String | کلمات کلیدی SEO | اختیاری |
| footerDescription | Text | متن فوتر سایت نماینده | اختیاری |
| footerDisclaimer | Text | سلب مسئولیت فوتر | اختیاری |
| socialMedia | JSON | لینک‌های شبکه‌های اجتماعی | اختیاری |
| weight | Integer | وزن مرتب‌سازی | اختیاری |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۲.۴ بیمه پایه (Basic Insurance)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | ------------ | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| label | String | نام بیمه | بله |
| logo | String (URL) | لوگوی بیمه | اختیاری |
| status | Boolean | فعال/غیرفعال | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۲.۵ بیمه مکمل (Supplementary Insurance)
ساختار یکسان با بیمه پایه.
### ۲.۲.۶ تخصص دکتر (Doctor Specialty)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ------------------------- | ----------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| label | String | نام تخصص | بله |
| parent | Integer (FK→specialty.id) | تخصص والد (برای ساختار درختی) | اختیاری |
| status | Boolean | فعال/غیرفعال | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۲.۷ خدمات دکتر (Doctor Services)
**⚠ اصلاح شده (Task-05): در تمام پاسخ‌های API باید هم id و هم label (نام) ارسال شود.**
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | --------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی — الزامی در تمام پاسخ‌های API | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| label | String | نام خدمت — الزامی در تمام پاسخ‌های API | بله |
| status | Boolean | فعال/غیرفعال | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۳ دکتر (Doctor)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------------------- | ---------------------- | --------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | حساب کاربری متصل | بله |
| label / name | String | نام نمایشی دکتر | بله |
| gender | Enum | جنسیت: male / female | بله |
| degree | Enum | expert │ general │ specialist │ subspecialistplus | بله |
| doctor_id | String | شماره نظام پزشکی | بله |
| doctor_mobile_number | String | شماره موبایل دکتر | بله |
| clinic_specialty | Integer (FK→specialty) | تخصص اصلی دکتر | بله |
| doctor_services | Array<FK→services.id> | خدمات ارائه‌شده (id + label باید در پاسخ‌ها برگردد) | بله |
| state | Integer (FK→state.id) | استان محل فعالیت | بله |
| city | Integer (FK→city.id) | شهر محل فعالیت | بله |
| representation | Integer (FK→rep.id) | نماینده متصل (در صورت وجود) | اختیاری |
| active_doctor_appointment | Boolean | آیا نوبت‌دهی آنلاین فعال است؟ | بله |
| doctor_rate | Decimal | میانگین امتیاز | بله |
| doctor_rate_percentage | Float | درصد امتیاز | بله |
| info | Text / JSON | بیوگرافی و اطلاعات تکمیلی | اختیاری |
| activity_time | JSON | ساعات کاری | اختیاری |
| images | Array<String> | آدرس تصاویر پروفایل | اختیاری |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۴ کلینیک (Clinic)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ---------------- | ---------------------- | ------------------------------------ | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر صاحب کلینیک | بله |
| label / name | String | نام کلینیک | بله |
| address | Text | آدرس کامل | بله |
| latitude | Decimal | عرض جغرافیایی | بله |
| longitude | Decimal | طول جغرافیایی | بله |
| telephone | String | شماره تماس | بله |
| state | Integer (FK→state.id) | استان | بله |
| city | Integer (FK→city.id) | شهر | بله |
| clinic_specialty | Array<FK> | تخصص‌های کلینیک | بله |
| doctor_services | Array<FK→services.id> | خدمات (id + label الزامی در پاسخ‌ها) | بله |
| insurance | Array<FK→insurance.id> | بیمه‌های پذیرفته‌شده | بله |
| doctors | Array<FK→doctor.id> | دکترهای عضو کلینیک | بله |
| working_days | JSON | روزهای کاری هفته | بله |
| 24_7 | Boolean | آیا شبانه‌روزی فعال است؟ | بله |
| logo | String (URL) | لوگوی کلینیک | بله |
| images | Array<String> | تصاویر گالری | اختیاری |
| representation | Integer (FK→rep.id) | نماینده متصل | اختیاری |
| info | Text | درباره کلینیک | اختیاری |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۵ آدرس‌های دکتر (Doctor Addresses)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ------------------- | ---------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| name | String | برچسب آدرس (مثلاً: مطب اصلی، شعبه) | بله |
| doctor | Integer (FK→doctor) | دکتر مرتبط | بله |
| address | Text | آدرس کامل | بله |
| latitude | Decimal | عرض جغرافیایی | بله |
| longitude | Decimal | طول جغرافیایی | بله |
| telephone | String | شماره تماس محل | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۶ منشی دکتر (Doctor Secretary)
محدودیت منشی فعال باید هنگام ایجاد یا فعال‌سازی در سمت سرور بررسی شود.
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ------------------- | ----------------------------------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| secretary | Integer (FK→user) | حساب کاربری منشی | بله |
| doctor | Integer (FK→doctor) | دکتر مرتبط | بله |
| active | Boolean | فعال/غیرفعال — پلن بیسیک: حداکثر ۱ منشی فعال؛ پلن پیشرفته: حداکثر ۳ منشی فعال | بله |
| permission | JSON | نقشه دسترسی‌های دقیق منشی | بله |
| telephone | String | شماره تماس منشی | اختیاری |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۷ نماینده (Representation)
**⚠ اصلاح شده (Task-07): فیلدهای استان، شهر و شماره کارت بانکی باید به درستی تعریف شوند.**
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------------ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | حساب کاربری نماینده | بله |
| label | String | نام نماینده | بله |
| active | Boolean | فعال/غیرفعال | بله |
| state | Integer (FK→state.id) | استان — الزامی (قبلاً وجود نداشت) | بله |
| city | Integer (FK→city.id) | شهر — الزامی (قبلاً وجود نداشت) | بله |
| address | Text | آدرس دفتر نماینده | بله |
| domain | String | زیردامنه پورتال نماینده | بله |
| bank_account | JSON Array | آرایه‌ای از اطلاعات کارت‌های بانکی. هر آیتم: { card_number, bank_name, is_default }. یکی باید is_default=true داشته باشد — الزامی (قبلاً وجود نداشت) | بله |
| commission_percent | Decimal | درصد کمیسیون از هر نوبت آنلاین | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
نمونه ساختار JSON کارت‌های بانکی:
| [ { "card_number": "6037-9999-1234-5678", "bank_name": "ملت", "is_default": true }, { "card_number": "5859-3312-4455-6677", "bank_name": "صادرات", "is_default": false } ] |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
## ۲.۸ تنظیمات نوبت (Appointment Settings)
**⚠ اصلاح شده (Task-09): الگوریتم محاسبه اسلات‌ها باید اولویت Override را رعایت کند.**
### ۲.۸.۱ برنامه هفتگی (Weekly Schedule)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ------------------- | ----------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سازنده | بله |
| doctor_id | Integer (FK→doctor) | دکتر مرتبط | بله |
| active | Boolean | فعال/غیرفعال | بله |
| date | Timestamp | تاریخ مرجع برنامه | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۸.۲ تعطیلات (Holidays)
تعطیلات فقط توسط ادمین ثبت می‌شود.
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | ---------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | ادمین ثبت‌کننده تعطیلی | بله |
| label | String | نام / توضیح تعطیلی | بله |
| date | Timestamp | تاریخ تعطیل | بله |
| active | Boolean | فعال/غیرفعال | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۸.۳ لغو تعطیل (Date Override)
دکتر می‌تواند یک روز تعطیل را override کند و در آن روز کار کند. Override اولویت بالاتری از تعطیلات دارد.
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ------------------- | ------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر دکتر | بله |
| doctor_id | Integer (FK→doctor) | دکتری که Override ثبت کرده | بله |
| date | Timestamp | تاریخ مورد نظر برای Override | بله |
| setting | JSON | برنامه سفارشی برای آن روز (اسلات‌ها، ظرفیت و ...) | بله |
| active | Boolean | آیا این Override فعال است؟ | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۸.۴ الگوریتم محاسبه اسلات‌های خالی
اولویت‌بندی هنگام محاسبه اسلات‌های موجود برای یک تاریخ مشخص:
| **اولویت** | **منبع** | **رفتار سیستم** | **نتیجه** |
| -------------- | --------------- | -------------------------------------------------------------------------------------------------------- | ---------- |
| ۱ (بالاترین) | Date Override | اگر Override فعال برای این تاریخ وجود داشت → از برنامه Override استفاده شود. تعطیلی نادیده گرفته می‌شود. | باز |
| ۲ | Holidays | اگر تاریخ تعطیل باشد AND Override وجود نداشته باشد → روز تعطیل، بدون اسلات. | بسته |
| ۳ (پایین‌ترین) | Weekly Schedule | اگر نه Override و نه تعطیلی → برنامه هفتگی اعمال می‌شود. | طبق برنامه |
## ۲.۹ نوبت (Appointment)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| -------------- | ------------------- | --------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر بیمار | بله |
| doctor_id | Integer (FK→doctor) | دکتر مربوطه | بله |
| address | Text | آدرس محل نوبت | بله |
| start_time | Timestamp | زمان شروع نوبت | بله |
| end_time | Timestamp | زمان پایان نوبت | بله |
| slot | JSON | متادیتای اسلات (شماره اسلات، مدت و ...) | بله |
| status | Enum | وضعیت نوبت — جدول زیر | بله |
| visited_at | Timestamp | زمان واقعی ویزیت | اختیاری |
| representation | Integer (FK→rep) | در صورت رزرو از طریق دامنه نماینده | اختیاری |
| info | JSON | توضیحات تکمیلی | اختیاری |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
وضعیت‌های نوبت (Appointment Status):
| **waiting_for_payment** | **auto_cancel_unpaid** | **reserved** |
| ------------------------ | ----------------------- | -------------- |
| **cancelled_by_patient** | **cancelled_by_doctor** | **checked_in** |
| **waiting** | **in_progress** | **visited** |
| **no_show** | **postponed** | **completed** |
## ۲.۱۰ پرداخت (Payment Types)
### ۲.۱۰.۱ پرداخت نوبت
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ---------------- | ----------------- | ---------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | پرداخت‌کننده | بله |
| reference_id | Integer (FK→appt) | نوبت مرتبط | بله |
| amount | Decimal | مبلغ پرداختی (تومان) | بله |
| payment_method | String | روش / درگاه پرداخت | بله |
| payment_time | Timestamp | زمان پرداخت | بله |
| ref_id | String | شماره مرجع درگاه | بله |
| card_info | JSON | اطلاعات ماسک‌شده کارت | بله |
| representation | Integer (FK→rep) | نماینده (در صورت پرداخت از طریق دامنه نماینده) | اختیاری |
| frontend_address | String (URL) | آدرس بازگشت پس از پرداخت | بله |
| status | Enum | pending │ received │ refund │ canceled | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۱۰.۲ پرداخت اشتراک
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ---------------- | ----------------------- | -------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر سابسکرایب‌کننده | بله |
| reference_id | Integer (FK→clinic│doc) | کلینیک یا دکتر مربوطه | بله |
| amount | Decimal | مبلغ اشتراک | بله |
| payment_method | String | روش پرداخت | بله |
| payment_time | Timestamp | زمان پرداخت | بله |
| start_date | Timestamp | تاریخ شروع اشتراک | بله |
| expiration_date | Timestamp | تاریخ انقضای اشتراک | بله |
| ref_id | String | شماره مرجع درگاه | بله |
| card_info | JSON | اطلاعات ماسک‌شده کارت | بله |
| representation | Integer (FK→rep) | نماینده (در صورت وجود) | اختیاری |
| frontend_address | String (URL) | آدرس بازگشت | بله |
| status | Enum | pending │ received │ refund │ canceled | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۱۱ پروفایل بیمار (Profile)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ----------------------- | ----------------- | -------------------------------------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | کاربر مرتبط | بله |
| national_code | String (10 رقم) | کد ملی | بله |
| national_code_approved | Boolean | تأیید کد ملی | بله |
| date_of_birth | Timestamp | تاریخ تولد | بله |
| gender | Enum | male │ female │ other | بله |
| blood_type | Enum | A+ │ A- │ B+ │ B- │ O+ │ O- │ AB+ │ AB- | بله |
| education | Enum | diploma │ postgraduate_diploma │ bachelor_s_degree │ master_s_degree │ doctorate | بله |
| fathers_name | String | نام پدر | اختیاری |
| family | String | وضعیت تأهل | اختیاری |
| job | String | شغل | اختیاری |
| address | Text | آدرس محل سکونت | اختیاری |
| home_phone | String | تلفن منزل | اختیاری |
| work_phone | String | تلفن محل کار | اختیاری |
| basic_insurance | Integer (FK→ins) | بیمه پایه | اختیاری |
| supplementary_insurance | Integer (FK→ins) | بیمه مکمل | اختیاری |
| insurance_id | String | شماره عضویت بیمه | اختیاری |
| other | JSON | متادیتای قابل توسعه | اختیاری |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۱۲ وبلاگ (Blog)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | --------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uuid | UUID | شناسه یکتا | بله |
| uid | Integer (FK→User) | نویسنده | بله |
| label | String | عنوان پست | بله |
| status | Boolean | منتشرشده / پیش‌نویس | بله |
| top | Boolean | پست برجسته / پین‌شده | بله |
| images | Array (حداکثر ۵) | حداکثر ۵ تصویر | بله |
| tag | Array (حداکثر ۵) | حداکثر ۵ تگ دسته‌بندی | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۲.۱۳ نظرات، لایک و امتیازدهی
### ۲.۱۳.۱ نظر (Comment)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | -------------------- | ------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uid | Integer (FK→User) | کاربر نظردهنده | بله |
| doctor_id | Integer (FK→doctor) | دکتر مورد نظر | بله |
| comment | Text | متن نظر | بله |
| parent | Integer (FK→comment) | نظر والد (برای پاسخ‌های تودرتو) | اختیاری |
| Approved | Boolean | وضعیت تأیید از سوی مدیر | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۱۳.۲ لایک (Like)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | -------------------- | ----------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uid | Integer (FK→User) | کاربر | بله |
| comment_id | Integer (FK→comment) | نظر هدف | بله |
| like | Boolean | true = لایک، false = دیس‌لایک | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
### ۲.۱۳.۳ امتیاز (Rate)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ---------------------- | ------------------- | ------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uid | Integer (FK→User) | کاربر امتیازدهنده | بله |
| doctor_id | Integer (FK→doctor) | دکتر امتیازگیرنده | بله |
| starts | Decimal | امتیاز ستاره‌ای کلی (مثلاً ۴.۵) | بله |
| percent | Float | درصد امتیاز کلی | بله |
| doctor_behavior | Integer (۱-۵) | امتیاز برخورد دکتر | بله |
| accuracy_of_diagnosis | Integer (۱-۵) | امتیاز دقت تشخیص | بله |
| waiting_time_at_clinic | Integer (۱-۵) | امتیاز زمان انتظار | بله |
| doctor_expertise | Integer (۱-۵) | امتیاز تخصص دکتر | بله |
| clinic_cleanliness | Integer (۱-۵) | امتیاز نظافت کلینیک | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
# ۳. مشخصات API
تمام APIها باید بر اساس clini_pro.json مستند شوند و ورودی، خروجی و کدهای خطا به صورت کامل مشخص باشند.
## Task-02: احراز هویت (Authentication)
**⚠ اصلاح شده: فقط کاربران با نقش doctor، clinic یا doctor_s_secretary می‌توانند با نام کاربری/رمز عبور لاگین کنند. مسیر /oauth/userinfo باید دقیقاً شبیه به بک‌اند دروپال طراحی شود.**
### POST /oauth/token — ورود به سیستم
| **Endpoint** | POST /oauth/token |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | POST |
| **ورودی** | Content-Type: application/x-www-form-urlencoded grant_type: password username: <mobile_number> password: <password> client_id: <client_id> client_secret: <client_secret> |
| خروجی | HTTP 200 { access_token: string, token_type: "Bearer", expires_in: number, refresh_token: string, scope: string } |
| **خطاها** | 400 invalid_request — پارامتر اجباری ارسال نشده 401 invalid_client — اعتبارنامه نادرست 401 invalid_grant — نام کاربری یا رمز اشتباه 403 unauthorized_client — نقش کاربر مجاز نیست (فقط: doctor, clinic, doctor_s_secretary) 500 server_error |
### GET /oauth/userinfo — اطلاعات کاربر (سازگار با دروپال)
| **Endpoint** | GET /oauth/userinfo |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Header: Authorization: Bearer <access_token> |
| خروجی | HTTP 200 { sub: string (uid), name: string (realname), preferred_username: string (mobile_number), email: string │ null, picture: string │ null, roles: string[], status: boolean, uid: number, uuid: string } نکته: ساختار پاسخ باید دقیقاً با /oauth/userinfo دروپال یکسان باشد. |
| **خطاها** | 401 Unauthorized — توکن موجود نیست یا نامعتبر است 403 Forbidden — توکن معتبر اما حساب غیرفعال است 500 server_error |
### POST /oauth/token — تجدید توکن (Refresh)
| **Endpoint** | POST /oauth/token (refresh) |
| ------------ | -------------------------------------------------------------------------------------------------------------- |
| Method | POST |
| **ورودی** | grant_type: refresh_token refresh_token: <refresh_token> client_id: <client_id> client_secret: <client_secret> |
| خروجی | HTTP 200 { access_token: string, token_type: "Bearer", expires_in: number, refresh_token: string } |
| **خطاها** | 400 invalid_request 401 invalid_grant — refresh token منقضی یا نامعتبر 500 server_error |
## Task-05: API دکتر
**⚠ اصلاح شده: آرایه‌های services و insurances باید در تمام پاسخ‌ها شامل id و label (نام) باشند.**
### GET /api/v1/doctors/{id}
| **Endpoint** | GET /api/v1/doctors/{id} |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Method | GET |
| **ورودی** | Path: id (integer) — شناسه دکتر Header: Authorization: Bearer <token> (اختیاری برای داده عمومی) |
| خروجی | HTTP 200 { id, uuid, name, gender, degree, clinic_specialty: { id, label }, doctor_services: [{ id, label }, ...], ← الزامی state: { id, label }, city: { id, label }, representation: { id, label } │ null, active_doctor_appointment: boolean, doctor_rate, doctor_rate_percentage, images: [], info, activity_time } |
| **خطاها** | 404 Not Found — دکتر یافت نشد 403 Forbidden — دسترسی کافی نیست 500 server_error |
### GET /api/v1/doctors/{id}/insurances
| **Endpoint** | GET /api/v1/doctors/{id}/insurances |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Path: id (integer) — شناسه دکتر |
| خروجی | HTTP 200 { basic_insurance: [{ id, label, logo }, ...], supplementary_insurance: [{ id, label, logo }, ...] } نکته: هر آیتم باید id و label داشته باشد. |
| **خطاها** | 404 Not Found 500 server_error |
## Task-07: API نماینده (Agent)
**⚠ اصلاح شده: استان، شهر و شماره کارت بانکی باید در پاسخ‌ها وجود داشته باشند.**
### GET /api/v1/representations/{id}
| **Endpoint** | GET /api/v1/representations/{id} |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Path: id (integer) Header: Authorization: Bearer <token> |
| خروجی | HTTP 200 { id, uuid, label, active, state: { id, label }, ← الزامی city: { id, label }, ← الزامی domain, address, bank_account: [ { card_number, bank_name, is_default: true }, { card_number, bank_name, is_default: false } ], ← الزامی (آرایه با یک دیفالت) commission_percent } |
| **خطاها** | 404 Not Found 403 Forbidden 500 server_error |
### POST /api/v1/representations/{id}/bank-accounts
| **Endpoint** | POST /api/v1/representations/{id}/bank-accounts |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | POST |
| **ورودی** | Header: Authorization: Bearer <token> Body (JSON): { card_number: string (16 رقم), bank_name: string, is_default: boolean } نکته: اگر is_default=true باشد، دیفالت سایر کارت‌ها لغو می‌شود. |
| خروجی | HTTP 201 Created { success: true, bank_account: { card_number, bank_name, is_default } } |
| **خطاها** | 400 Bad Request — فرمت شماره کارت نامعتبر 409 Conflict — کارت قبلاً ثبت شده 403 Forbidden 500 server_error |
## Task-08: API دسته‌بندی‌ها
**⚠ اصلاح شده: استان‌ها و شهرها درست تنظیم نشده‌اند. تمام endpoint های دسته‌بندی باید داده کامل برگردانند.**
### GET /api/v1/categories/states — استان‌ها
| **Endpoint** | GET /api/v1/categories/states |
| ------------ | -------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Query: ?status=1 (اختیاری) Header: Authorization: Bearer <token> |
| خروجی | HTTP 200 { data: [ { id, uuid, label, status }, ... ], total: number } |
| **خطاها** | 401 Unauthorized 500 server_error |
### GET /api/v1/categories/cities — شهرها
| **Endpoint** | GET /api/v1/categories/cities |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Query: ?state_id=<id>&status=1 (اختیاری) Header: Authorization: Bearer <token> |
| خروجی | HTTP 200 { data: [ { id, uuid, label, status, parent: { id, label }, ← ارجاع به استان domain, representation }, ... ], total: number } |
| **خطاها** | 400 Bad Request — state_id نامعتبر 401 Unauthorized 500 server_error |
### سایر Endpoint های دسته‌بندی — الزامی
| **Endpoint** | **فیلدهای بازگشتی** |
| ----------------------------------------------- | ------------------------------- |
| GET /api/v1/categories/tags | id, uuid, label, status |
| GET /api/v1/categories/basic-insurances | id, uuid, label, logo, status |
| GET /api/v1/categories/supplementary-insurances | id, uuid, label, logo, status |
| GET /api/v1/categories/specialties | id, uuid, label, parent, status |
| GET /api/v1/categories/doctor-services | id, uuid, label, status |
## Task-09: API تنظیمات نوبت
### GET /api/v1/appointment-settings/slots — دریافت اسلات‌های خالی
| **Endpoint** | GET /api/v1/appointment-settings/slots |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Query: doctor_id: integer (الزامی) date: string YYYY-MM-DD (الزامی) Header: Authorization: Bearer <token> |
| خروجی | HTTP 200 { date: string, doctor_id: integer, is_holiday: boolean, is_overridden: boolean, schedule_source: 'override' │ 'holiday_closed' │ 'weekly_schedule', available_slots: [ { slot_index, start_time, end_time, is_available }, ... ] } الگوریتم: Override > تعطیلی > برنامه هفتگی |
| **خطاها** | 400 Bad Request — پارامتر اجباری ارسال نشده 404 Not Found — دکتر یافت نشد 500 server_error |
### POST /api/v1/appointment-settings/overrides — ثبت Override توسط دکتر
| **Endpoint** | POST /api/v1/appointment-settings/overrides |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | POST |
| **ورودی** | Header: Authorization: Bearer <doctor_token> Body (JSON): { doctor_id: integer, date: string YYYY-MM-DD, setting: { slots: [{ start_time, end_time, capacity }] }, active: boolean } |
| خروجی | HTTP 201 Created { id, uuid, doctor_id, date, setting, active, created } |
| **خطاها** | 400 Bad Request — تاریخ یا تنظیم نامعتبر 403 Forbidden — دکتر مجاز به تغییر Override دیگری نیست 409 Conflict — Override برای این تاریخ قبلاً وجود دارد 500 server_error |
### POST /api/v1/appointment-settings/holidays — ثبت تعطیلی (فقط ادمین)
| **Endpoint** | POST /api/v1/appointment-settings/holidays |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Method | POST |
| **ورودی** | Header: Authorization: Bearer <admin_token> Body (JSON): { label: string, date: string YYYY-MM-DD, active: boolean } |
| خروجی | HTTP 201 Created { id, uuid, label, date, active, created } |
| **خطاها** | 400 Bad Request — تاریخ نامعتبر 403 Forbidden — درخواست‌دهنده ادمین نیست 409 Conflict — تعطیلی برای این تاریخ قبلاً ثبت شده 500 server_error |
# ۴. سیستم حساب و صف پیامک
## ۴.۱ حساب پیامک (SMS Account)
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ------------ | ----------------- | ---------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| uid | Integer (FK→User) | کاربر مالک (دکتر یا کلینیک) | بله |
| owner_type | Enum | doctor │ clinic | بله |
| owner_id | Integer | FK به doctor.id یا clinic.id | بله |
| balance | Integer | تعداد پیامک باقی‌مانده | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۴.۲ صف پیامک (SMS Queue)
نرم‌افزار لوکال (Tauri) جاب‌های ارسال پیامک ایجاد می‌کند. بک‌اند آن‌ها را در صف قرار می‌دهد و با هر ارسال، از موجودی کسر می‌کند.
| **نام فیلد** | **نوع داده** | **توضیحات** | **الزامی** |
| ---------------- | --------------------- | ----------------------------------------------------- | ---------- |
| id | Integer (PK) | کلید اصلی | بله |
| owner_id | Integer (FK→sms_acct) | حساب پیامک مالک | بله |
| recipient_mobile | String | شماره موبایل گیرنده | بله |
| message | Text | متن پیامک | بله |
| scheduled_at | Timestamp | زمان برنامه‌ریزی‌شده ارسال (مثلاً یک روز قبل از نوبت) | بله |
| sent_at | Timestamp | زمان واقعی ارسال | اختیاری |
| status | Enum | queued │ sent │ failed │ cancelled | بله |
| created | Timestamp | زمان ایجاد | بله |
| changed | Timestamp | آخرین ویرایش | بله |
## ۴.۳ API پیامک
### POST /api/v1/sms/queue — افزودن به صف
| **Endpoint** | POST /api/v1/sms/queue |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
| Method | POST |
| **ورودی** | Header: Authorization: Bearer <token> Body (JSON): { recipient_mobile: string, message: string, scheduled_at: ISO8601 timestamp } |
| خروجی | HTTP 201 Created { id, status: 'queued', scheduled_at, remaining_balance: integer } |
| **خطاها** | 400 Bad Request — شماره موبایل یا پیام نامعتبر 402 Payment Required — موجودی پیامک کافی نیست 403 Forbidden 500 server_error |
### GET /api/v1/sms/balance — موجودی حساب پیامک
| **Endpoint** | GET /api/v1/sms/balance |
| ------------ | --------------------------------------------------------------------------------------- |
| Method | GET |
| **ورودی** | Header: Authorization: Bearer <token> |
| خروجی | HTTP 200 { owner_id: integer, owner_type: 'doctor' │ 'clinic', balance: integer } |
| **خطاها** | 401 Unauthorized 404 Not Found — حساب پیامک وجود ندارد 500 server_error |
# ۵. فهرست مشکلات شناسایی‌شده و اصلاحات لازم
| **تسک** | **مشکل** | **اصلاح مورد نیاز** | **وضعیت** |
| ------- | -------------------------------------- | --------------------------------------------------------------- | --------- |
| عمومی | جدول کاربران درست ایجاد نشده | بازسازی با تمام فیلدهای بخش ۲.۱ | 🔴 باز |
| عمومی | جدول نقش‌ها درست ایجاد نشده | تعریف Enum نقش‌ها و اتصال به کاربر | 🔴 باز |
| عمومی | ورودی/خروجی/خطاهای API تعریف نشده | تمام APIها باید I/O و کد خطا بر اساس clini_pro.json داشته باشند | 🔴 باز |
| Task-02 | لاگین فقط برای نقش‌های مجاز | فقط doctor, clinic, doctor_s_secretary مجاز به لاگین هستند | 🔴 باز |
| Task-02 | oauth/userinfo با دروپال یکسان نیست | ساختار پاسخ باید دقیقاً با بک‌اند دروپال یکسان باشد | 🔴 باز |
| Task-05 | services/insurances فاقد id+name هستند | هر آیتم باید { id, label } داشته باشد | 🔴 باز |
| Task-07 | استان و شهر نماینده ندارد | فیلد state و city به موجودیت representation اضافه شود | 🔴 باز |
| Task-07 | اطلاعات کارت بانکی وجود ندارد | bank_account به صورت آرایه JSON با is_default اضافه شود | 🔴 باز |
| Task-08 | استان/شهر درست ست نشده | FK والد در city و endpoint استان باید داده کامل برگرداند | 🔴 باز |
| Task-08 | سایر دسته‌بندی‌ها ناقص هستند | همه دسته‌بندی‌ها باید فیلد کامل برگردانند | 🔴 باز |
| Task-09 | ثبت تعطیلی فقط توسط ادمین نیست | endpoint تعطیلات باید نقش admin بررسی کند | 🔴 باز |
| Task-09 | Override دکتر پیاده‌سازی نشده | موجودیت Date Override با دسترسی دکتر اضافه شود | 🔴 باز |
| Task-09 | اولویت الگوریتم اسلات اشتباه است | اولویت: Override > تعطیلی > برنامه هفتگی | 🔴 باز |
# ۶. پیوست
## ۶.۱ دیاگرام وضعیت نوبت
- ایجاد با پرداخت آنلاین ← waiting_for_payment ← reserved (پس از پرداخت)
- عدم پرداخت ← auto_cancel_unpaid
- لغو توسط بیمار ← cancelled_by_patient
- لغو توسط دکتر ← cancelled_by_doctor
- ورود بیمار ← checked_in ← waiting ← in_progress ← visited یا no_show
- تکمیل ← completed
- تعویق ← postponed
## ۶.۲ جریان کمیسیون
- بیمار از طریق دامنه نماینده نوبت رزرو می‌کند
- مبلغ کمیسیون (قابل تنظیم در ادمین) به کیف پول نماینده واریز می‌شود
- نکته مهم: کمیسیون از حق نوبت‌گیری است، نه از مبلغ کل نوبت
- در صورت سابسکرایب پلن توسط دکتر: کمیسیون به کیف پول نماینده مربوطه واریز می‌شود
## ۶.۳ بررسی محدودیت منشی
- هنگام فعال‌سازی منشی: تعداد منشی‌های فعال آن دکتر بررسی شود
- پلن بیسیک: اگر ۱ منشی فعال وجود دارد، ثبت جدید رد شود
- پلن پیشرفته: اگر ۳ منشی فعال وجود دارد، ثبت جدید رد شود
- این بررسی باید کاملاً در سمت سرور انجام شود
## ۶.۴ محدوده سیستم (Scope)
کلینیک پرو صرفاً موارد زیر را هندل می‌کند:
- ثبت‌نام و احراز هویت کاربران
- نوبت‌دهی آنلاین
- مدیریت نماینده و کمیسیون
- مدیریت اشتراک
مدیریت جزئیات کلینیک، پرونده بیماران و سایر عملکردهای پیشرفته توسط نرم‌افزار لوکال Tauri هندل می‌شود و در اسکوپ این PRD نیست.
---
# بخش دوم — مستند کامل API
---
## فهرست مطالب
1. [احراز هویت (Authentication)](#1)
2. [کاربر (User)](#2)
3. [پروفایل بیمار (User Profile)](#3)
4. [دکتر (Doctor)](#4)
5. [آدرس دکتر (Doctor Address)](#5)
6. [کلینیک (Clinic)](#6)
7. [نماینده (Agent / Representation)](#7)
8. [دسته‌بندی‌ها (Categories)](#8)
9. [بیمه دکتر (Doctor Insurance)](#9)
10. [تنظیمات نوبت — برنامه هفتگی](#10)
11. [تنظیمات نوبت — Date Override](#11)
12. [تنظیمات نوبت — تعطیلات](#12)
13. [نوبت‌دهی (Appointment)](#13)
14. [منشی (Secretary)](#14)
15. [پرداخت (Payment)](#15)
16. [وبلاگ (Blog)](#16)
---
## خطاهای عمومی
| کد HTTP | عنوان | توضیح |
| ------- | --------------------- | ---------------------------------- |
| `400` | Bad Request | پارامتر اجباری نیست یا فرمت نادرست |
| `401` | Unauthorized | توکن Bearer نامعتبر یا منقضی شده |
| `403` | Forbidden | دسترسی مجاز نیست |
| `404` | Not Found | منبع یافت نشد |
| `422` | Unprocessable Entity | اعتبارسنجی داده شکست خورد |
| `500` | Internal Server Error | خطای داخلی سرور |
---
<a name="1"></a>
## 1. احراز هویت (Authentication)
### 1. 🔵 `POST` refresh token
```
POST /oauth/token
```
**🔓 احراز هویت:** الزامی نیست
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------------- | ------ | ------ | --------------- |
| `grant_type` | string | ✅ | `refresh_token` |
| `client_id` | string | ✅ | |
| `client_secret` | string | ✅ | |
| `refresh_token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 2. 🟢 `GET` X-CSRF-Token
```
GET /session/token
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت توکن CSRF از سرور استفاده می‌شود. این توکن برای ارسال درخواست‌های امن POST، PUT، DELETE و PATCH در سیستم نیاز است.
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 3. 🟢 `GET` user info 🆕
```
GET /oauth/userinfo
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API اطلاعات کاربر احراز هویت‌شده را با استفاده از توکن JWT برمی‌گرداند. برای استفاده از این endpoint باید کاربر از قبل احراز هویت شده و یک access token معتبر در اختیار داشته باشد.
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| ---------------- | --------- | ------------------------------------ |
| `email` | null | null |
| `email_verified` | boolean | true |
| `username` | string | 09120671710 |
| `id` | string | 22 |
| `uuid` | string | d200f5c5-d717-4526-b263-d3bb7d0228d6 |
| `created` | string | 1762262151 |
| `changed` | string | 1762262267 |
| `status` | string | 1 |
| `roles` | object | {0, 2} |
| `realName` | string | single doctor |
| `picture` | array (0) | [] |
| `clinic_pro` | object | {base_role, db_uuid, db_key...} |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"email": null,
"email_verified": true,
"username": "09120671710",
"id": "22",
"uuid": "d200f5c5-d717-4526-b263-d3bb7d0228d6",
"created": "1762262151",
"changed": "1762262267",
"status": "1",
"roles": {
"0": "authenticated",
"2": "doctor"
},
"realName": "single doctor",
"picture": [],
"clinic_pro": {
"base_role": "doctor",
"db_uuid": "61be915b-595a-42e5-bca5-f80d22f4f14a",
"db_key": "22bea8c1dc64d9b0c744810722519efe7290276ecd82d9bc650482aa4539bf0d",
"my_doctors_uuid": {
"uuid": "61be915b-595a-42e5-bca5-f80d22f4f14a",
"id": "29",
"name": "single doctor"
}
}
}
```
</details>
---
<a name="2"></a>
## 2. کاربر (User)
### 4. 🔵 `POST` verify code
```
POST /api/v1/user/verify-code
```
**🔓 احراز هویت:** الزامی نیست
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------------- | ------ | ------ | ------------ |
| `mobile` | string | ✅ | |
| `captcha_token` | string | ✅ | |
#### مثال Request
```json
{
"mobile": "09120671713",
"captcha_token": ""
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 5. 🔵 `POST` send code
```
POST /api/v1/user/send-code
```
**🔓 احراز هویت:** الزامی نیست
> ارسال کد تأیید موبایل Endpoint POST https://back-dev. توضیح این درخواست برای ارسال کد تأیید (OTP) به شماره موبایل کاربر استفاده می‌شود.
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------------- | ------ | ------ | ------------ |
| `mobile` | string | ✅ | |
| `captcha_token` | string | ✅ | |
#### مثال Request
```json
{
"mobile": "09120671713",
"captcha_token": ""
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 6. 🔵 `POST` register
```
POST /api/v1/user/register
```
**🔓 احراز هویت:** الزامی نیست
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 7. 🔴 `DELETE` delete user
```
DELETE /api/v1/user/5
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 8. 🟡 `PATCH` patch
```
PATCH /api/v1/user/2
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| -------------- | ------ | ------ | ------------ |
| `field_name` | string | ✅ | |
| `field_family` | string | ✅ | |
| `mail` | string | ✅ | |
#### مثال Request
```json
{
"field_name": "سحر ",
"field_family": "صادقی",
"mail": "hamedhosseini0143@gmail.com"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 9. 🟢 `GET` list secretary
```
GET /api/v1/secretaries/be1fc63e-0207-4fe4-a58b-5ac30953b742
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| -------- | ------ | ------ | ---------------- |
| `active` | string | ✅ | — مثال: `active` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="3"></a>
## 3. پروفایل بیمار (User Profile)
### 10. 🔵 `POST` post
```
POST /api/v1/user-profile
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------------------- | ---------------- | ------ | ------------ |
| `name` | string | ✅ | |
| `description` | array\<object\> | ✅ | |
| `birthday` | string | ✅ | |
| `basic_insurance` | array\<integer\> | ✅ | |
| `blood_type` | string | ✅ | |
| `education` | string | ✅ | |
| `fathers_name` | string | ✅ | |
| `gender` | string | ✅ | |
| `home_phone` | string | ✅ | |
| `job` | string | ✅ | |
| `marital_status` | string | ✅ | |
| `supplementary_insurance` | string | ✅ | |
| `work_phone` | string | ✅ | |
| `address` | string | ✅ | |
| `other` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"name": "test",
"description": [
{
"value": "this is text",
"format": "basic_html"
}
],
"birthday": "1234566",
"basic_insurance": [
251
],
"blood_type": "ab_negative",
"education": "postgraduate_diploma",
"fathers_name": "gholam",
"gender": "male",
"home_phone": "07433332178",
"job": "azad",
"marital_status": "married",
"supplementary_insurance": "308",
"work_phone": "07433332178",
"address": "askajhsaklsj",
"other": [
{
"disease": [
{
"id": 1,
"name": "فشار خون",
"status": "false"
},
{
"id": 2,
"name": "دیابت",
"status": "false"
},
{
"id": 3,
"name": "آسم",
"status": "false"
},
{
"id": 4,
"name": "بیماری قلبی عروقی",
"status": "false"
},
{
"id": 5,
"name": "سرطان",
"status": "false"
},
{
"id": 6,
"name": "آلزایمر",
"status": "false"
},
{
"id": 7,
"name": "پارکینسون",
"status": "false"
},
{
"id": 8,
"name": "بیماری کلیوی",
"status": "false"
},
{
"id": 9,
"name": "بیماری کبدی",
"status": "false"
},
{
"id": 10,
"name": "سکته مغزی",
"status": "false"
},
{
"id": 11,
"name": "افسردگی",
"status": "false"
},
{
"id": 12,
"name": "اضطراب مزمن",
"status": "false"
},
{
"id": 13,
"name": "میگرن",
"status": "false"
},
{
"id": 14,
"name": "کم‌کاری تیروئید",
"status": "false"
},
{
"id": 15,
"name": "پرکاری تیروئید",
"status": "false"
},
{
"id": 16,
"name": "سل",
"status": "false"
},
{
"id": 17,
"name": "هپاتیت B",
"status": "false"
},
{
"id": 18,
"name": "هپاتیت C",
"status": "false"
},
{
"id": 19,
"name": "HIV / ایدز",
"status": "false"
},
{
"id": 20,
"name": "COVID-19",
"status": "false"
},
{
"id": 21,
"name": "لوپوس",
"status": "false"
},
{
"id": 22,
"name": "ام‌اس (MS)",
"status": "false"
},
{
"id": 23,
"name": "آرتریت روماتوئید",
"status": "false"
},
{
"id": 24,
"name": "پسوریازیس",
"status": "false"
},
{
"id": 25,
"name": "صرع",
"status": "false"
},
{
"id": 26,
"name": "بیماری سلیاک",
"status": "false"
},
{
"id": 27,
"name": "عدم تحمل لاکتوز",
"status": "false"
},
{
"id": 28,
"name": "چربی خون بالا",
"status": "false"
},
{
"id": 29,
"name": "کم‌خونی",
"status": "false"
},
{
"id": 30,
"name": "هموفیلی",
"status": "false"
}
],
"allergies": [
{
"substance": "پنی‌سیلین",
"reaction": "کهیر",
"severity": "شدید"
},
{
"substance": "گرده گیاهان",
"reaction": "عطسه و آبریزش بینی",
"severity": "خفیف"
}
],
"medications": [
{
"name": "لورازپام",
"dose": "1mg",
"frequency": "شب‌ها قبل خواب"
},
{
"name": "آتنولول",
"dose": "50mg",
"frequency": "صبح‌ها"
}
],
"surgeries": [
{
"type": "آپاندکتومی",
"year": 2015,
"hospital": "بیمارستان امام خمینی"
},
{
"type": "عمل قلب باز",
"year": 2022,
"hospital": "بیمارستان شهید رجایی"
}
],
"family_history": [
{
"relation": "پدر",
"disease": "فشار خون"
},
{
"relation": "مادر",
"disease": "دیابت نوع 2"
},
{
"relation": "خواهر",
"disease": "آسم"
}
],
"relatives": [
{
"name": "علی",
"relation": "پسر عمو",
"contact": {
"phone": "+989121234567",
"email": "father@example.com",
"address": "تهران، خیابان انقلاب، پلاک 12"
}
},
{
"name": "سارا",
"relation": "خواهر",
"contact": {
"phone": "+989121234567",
"email": "father@example.com",
"address": "تهران، خیابان انقلاب، پلاک 12"
}
}
]
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 11. 🟢 `GET` get
```
GET /api/v1/user-profile/4cb9d9d5-c5ec-4aae-a464-af56e4502aa8
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت اطلاعات پروفایل کاربر با استفاده از UUID کاربر استفاده می‌شود. دسترسی به این endpoint نیاز به احراز هویت با توکن JWT و CSRF Token دارد.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 12. 🟡 `PATCH` path only disease
```
PATCH /api/v1/user-profile/fa845b62-194d-4f82-9007-958645026ce5
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------------------- | ---------------- | ------ | ------------ |
| `name` | string | ✅ | |
| `description` | array\<object\> | ✅ | |
| `birthday` | string | ✅ | |
| `basic_insurance` | array\<integer\> | ✅ | |
| `blood_type` | string | ✅ | |
| `education` | string | ✅ | |
| `fathers_name` | string | ✅ | |
| `gender` | string | ✅ | |
| `home_phone` | string | ✅ | |
| `job` | string | ✅ | |
| `marital_status` | string | ✅ | |
| `supplementary_insurance` | string | ✅ | |
| `work_phone` | string | ✅ | |
| `address` | string | ✅ | |
| `other` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"name": "test",
"description": [
{
"value": "this is text",
"format": "basic_html"
}
],
"birthday": "1234566",
"basic_insurance": [
251
],
"blood_type": "ab_negative",
"education": "postgraduate_diploma",
"fathers_name": "gholam",
"gender": "male",
"home_phone": "07433332178",
"job": "azad",
"marital_status": "married",
"supplementary_insurance": "308",
"work_phone": "07433332178",
"address": "askajhsaklsj",
"other": [
{
"disease": [
{
"id": 1,
"name": "فشار خون",
"status": "false"
},
{
"id": 2,
"name": "دیابت",
"status": "false"
},
{
"id": 3,
"name": "آسم",
"status": "false"
},
{
"id": 4,
"name": "بیماری قلبی عروقی",
"status": "false"
},
{
"id": 5,
"name": "سرطان",
"status": "false"
},
{
"id": 6,
"name": "آلزایمر",
"status": "false"
},
{
"id": 7,
"name": "پارکینسون",
"status": "false"
},
{
"id": 8,
"name": "بیماری کلیوی",
"status": "false"
},
{
"id": 9,
"name": "بیماری کبدی",
"status": "false"
},
{
"id": 10,
"name": "سکته مغزی",
"status": "false"
},
{
"id": 11,
"name": "افسردگی",
"status": "false"
},
{
"id": 12,
"name": "اضطراب مزمن",
"status": "false"
},
{
"id": 13,
"name": "میگرن",
"status": "false"
},
{
"id": 14,
"name": "کم‌کاری تیروئید",
"status": "false"
},
{
"id": 15,
"name": "پرکاری تیروئید",
"status": "false"
},
{
"id": 16,
"name": "سل",
"status": "false"
},
{
"id": 17,
"name": "هپاتیت B",
"status": "false"
},
{
"id": 18,
"name": "هپاتیت C",
"status": "false"
},
{
"id": 19,
"name": "HIV / ایدز",
"status": "false"
},
{
"id": 20,
"name": "COVID-19",
"status": "false"
},
{
"id": 21,
"name": "لوپوس",
"status": "false"
},
{
"id": 22,
"name": "ام‌اس (MS)",
"status": "false"
},
{
"id": 23,
"name": "آرتریت روماتوئید",
"status": "false"
},
{
"id": 24,
"name": "پسوریازیس",
"status": "false"
},
{
"id": 25,
"name": "صرع",
"status": "false"
},
{
"id": 26,
"name": "بیماری سلیاک",
"status": "false"
},
{
"id": 27,
"name": "عدم تحمل لاکتوز",
"status": "false"
},
{
"id": 28,
"name": "چربی خون بالا",
"status": "false"
},
{
"id": 29,
"name": "کم‌خونی",
"status": "false"
},
{
"id": 30,
"name": "هموفیلی",
"status": "false"
}
],
"allergies": [
{
"substance": "پنی‌سیلین",
"reaction": "کهیر",
"severity": "شدید"
},
{
"substance": "گرده گیاهان",
"reaction": "عطسه و آبریزش بینی",
"severity": "خفیف"
}
],
"medications": [
{
"name": "لورازپام",
"dose": "1mg",
"frequency": "شب‌ها قبل خواب"
},
{
"name": "آتنولول",
"dose": "50mg",
"frequency": "صبح‌ها"
}
],
"surgeries": [
{
"type": "آپاندکتومی",
"year": 2015,
"hospital": "بیمارستان امام خمینی"
},
{
"type": "عمل قلب باز",
"year": 2022,
"hospital": "بیمارستان شهید رجایی"
}
],
"family_history": [
{
"relation": "پدر",
"disease": "فشار خون"
},
{
"relation": "مادر",
"disease": "دیابت نوع 2"
},
{
"relation": "خواهر",
"disease": "آسم"
}
],
"relatives": [
{
"name": "علی",
"relation": "پسر عمو",
"contact": {
"phone": "+989121234567",
"email": "father@example.com",
"address": "تهران، خیابان انقلاب، پلاک 12"
}
},
{
"name": "سارا",
"relation": "خواهر",
"contact": {
"phone": "+989121234567",
"email": "father@example.com",
"address": "تهران، خیابان انقلاب، پلاک 12"
}
}
]
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 13. 🔴 `DELETE` delete
```
DELETE /api/v1/user-profile/e4fd81b4-31bc-4f9a-b300-da23026f9d79
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="4"></a>
## 4. دکتر (Doctor)
### 14. 🔵 `POST` post
```
POST /api/v1/doctor
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل اطلاعات پزشکان در سیستم کلینیک پرو طراحی شده است. شما می‌توانید از طریق این سرویس پزشکان جدید ثبت کنید، اطلاعات آن‌ها را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 15. 🟡 `PATCH` patch
```
PATCH /api/v1/doctor/9eb88108-1411-4e78-93ee-9b2149233f4e
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل اطلاعات پزشکان در سیستم کلینیک پرو طراحی شده است. شما می‌توانید از طریق این سرویس پزشکان جدید ثبت کنید، اطلاعات آن‌ها را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------------- | --------------- | ------ | ------------ |
| `title` | string | ✅ | |
| `doctor_services` | array\<string\> | ✅ | |
#### مثال Request
```json
{
"title": "hamed",
"doctor_services": [
"اکوکاردیوگرافی"
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 16. 🔴 `DELETE` delete
```
DELETE /api/v1/doctor/9eb88108-1411-4e78-93ee-9b2149233f4e
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل اطلاعات پزشکان در سیستم کلینیک پرو طراحی شده است. شما می‌توانید از طریق این سرویس پزشکان جدید ثبت کنید، اطلاعات آن‌ها را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 17. 🟢 `GET` get 🆕
```
GET /api/v1/doctor/61be915b-595a-42e5-bca5-f80d22f4f14a
```
**🔓 احراز هویت:** الزامی نیست
> این API برای مدیریت کامل اطلاعات پزشکان در سیستم کلینیک پرو طراحی شده است. شما می‌توانید از طریق این سرویس پزشکان جدید ثبت کنید، اطلاعات آن‌ها را مشاهده، ویرایش یا حذف کنید.
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| --------------------- | --------- | -------------------------------------------- |
| `id` | string | 29 |
| `uuid` | string | 61be915b-595a-42e5-bca5-f80d22f4f14a |
| `name` | string | single doctor |
| `gender` | string | woman |
| `experience` | integer | 21 |
| `activity_time` | string | 1107808200 |
| `medical_system_code` | string | 121212121212 |
| `detail` | string | test |
| `degree` | string | specialist |
| `specialties` | array (1) | [{uuid, id, name}] |
| `img` | array (1) | [{url, fid, filename}] |
| `expertise` | array (3) | [{uuid, id, name}] |
| `satisfaction` | string | 60 |
| `point` | string | 3.5 |
| `free_turn` | string | اولین نوبت آزاد: سه‌شنبه 19 خرداد ساعت 15:00 |
| `hours_of_work` | string | از شنبه تا چهارشنبه از ساعت 08:00 تا 18:00 |
| `address` | array (2) | [{id, uuid, name}] |
| `average_rate` | object | {total_rates} |
| `state` | array (1) | [{uuid, id, name}] |
| `city` | array (1) | [{uuid, id, name}] |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"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://clinic-pro-back.ddev.site/sites/default/files/doctors/2025-11/2025-11-19-090938-screenclip.png",
"fid": "98",
"filename": "2025-11-19-090938-screenclip.png",
"filemime": "image/png",
"filesize": 173665
}
],
"expertise": [
{
"uuid": "6faff90a-92f6-4fe2-9f67-b11e2b82a0c6",
"id": "1601",
"name": "معاینه و تشخیص پزشک متخصص"
},
{
"uuid": "2c4d4446-4e4a-42de-829b-c51d3103ad04",
"id": "1602",
"name": "ویزیت تخصصی"
},
{
"uuid": "e5ac35df-af8f-4cef-8119-e92645512313",
"id": "1603",
"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": "2آدرس مطب",
"map": {
"latitude": "53.121212",
"longitude": "57.121212"
},
"address": "آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد (پشت پارک معلم)، برج ماندگار، طبقه هشتم",
"telephone": "09120671756"
},
{
"id": "40",
"uuid": "458fcbc7-32be-4d30-80dd-f7c4c6f1dace",
"name": "2آدرس مطب",
"map": {
"latitude": "53.121212",
"longitude": "57.121212"
},
"address": "آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد (پشت پارک معلم)، برج ماندگار، طبقه هشتم",
"telephone": "09120671756"
}
],
"average_rate": {
"total_rates": null
},
"state": [
{
"uuid": "fffae390-b2e4-403f-8b1d-f2cb294c8059",
"id": "23",
"name": "کهگیلویه و بویراحمد"
}
],
"city": [
{
"uuid": "17993c45-8b46-41b8-8e1d-f1d7243a7b75",
"id": "123",
"name": "یاسوج",
"parent": "23"
}
]
}
```
</details>
---
### 18. 🟢 `GET` doctor list 🆕
```
GET /api/v1/doctors
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت لیست پزشکان با قابلیت‌های پیشرفته جستجو، فیلتر و صفحه‌بندی طراحی شده است. شما می‌توانید از طریق این سرویس لیست کاملی از پزشکان را با امکان فیلتر کردن بر اساس نام، استان، شهر، تخصص، جنسیت، مدرک تحصیلی و وضعیت فعالیت دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ----------- | ------ | ------ | ------------------------------ |
| `name` | string | — | — مثال: `علی` |
| `state` | string | ✅ | — مثال: `31` |
| `city` | string | ✅ | — مثال: `62` |
| `specialty` | string | — | — مثال: `503` |
| `gender` | string | — | — مثال: `man` |
| `degree` | string | — | — مثال: `general` |
| `active` | array | — | — مثال: `0` |
| `page` | string | — | — مثال: `1` |
| `limit` | string | — | — مثال: `10` |
| `sort` | string | — | sort= ASC, DESC — مثال: `DESC` |
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| ------ | --------- | --------------------------------------- |
| `data` | array (7) | [{id, uuid, name}] |
| `page` | object | {totalRecords, totalPages, currentPage} |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"data": [
{
"id": "18",
"uuid": "801094ca-b20d-4bfe-828c-37ff62c8a45c",
"name": "doctor clinic",
"gender": "woman",
"degree": "specialist",
"img": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/tamin_ejtemaei.jpg",
"fid": "23",
"filename": "tamin_ejtemaei.jpg",
"filemime": "image/jpeg",
"filesize": 418044
}
],
"specialties": [
{
"uuid": "cd22005c-759a-4a4b-b54a-5471948d7ca4",
"id": "602",
"name": "داخلی",
"parent": null
},
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "نوبت آزادی موجود نیست",
"hours_of_work": "اطلاعات برنامه هفتگی موجود نیست",
"active": true
},
{
"id": "20",
"uuid": "9109ad21-62fa-42ec-aeee-1e45a88e54b9",
"name": "doctor 3",
"gender": "woman",
"degree": "specialist",
"img": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/tamin_ejtemaei.jpg",
"fid": "23",
"filename": "tamin_ejtemaei.jpg",
"filemime": "image/jpeg",
"filesize": 418044
}
],
"specialties": [
{
"uuid": "cd22005c-759a-4a4b-b54a-5471948d7ca4",
"id": "602",
"name": "داخلی",
"parent": null
},
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "نوبت آزادی موجود نیست",
"hours_of_work": "اطلاعات برنامه هفتگی موجود نیست",
"active": true
},
{
"id": "21",
"uuid": "2123fc79-5ef2-4d8d-96b9-1aee353e58e4",
"name": "doctor 2",
"gender": "woman",
"degree": "specialist",
"img": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/tamin_ejtemaei.jpg",
"fid": "23",
"filename": "tamin_ejtemaei.jpg",
"filemime": "image/jpeg",
"filesize": 418044
}
],
"specialties": [
{
"uuid": "cd22005c-759a-4a4b-b54a-5471948d7ca4",
"id": "602",
"name": "داخلی",
"parent": null
},
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "نوبت آزادی موجود نیست",
"hours_of_work": "اطلاعات برنامه هفتگی موجود نیست",
"active": true
},
{
"id": "22",
"uuid": "c1eaea3b-6b36-4547-9fa3-bea050117fd2",
"name": "doctor 1",
"gender": "woman",
"degree": "specialist",
"img": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/tamin_ejtemaei.jpg",
"fid": "23",
"filename": "tamin_ejtemaei.jpg",
"filemime": "image/jpeg",
"filesize": 418044
}
],
"specialties": [
{
"uuid": "cd22005c-759a-4a4b-b54a-5471948d7ca4",
"id": "602",
"name": "داخلی",
"parent": null
},
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "نوبت آزادی موجود نیست",
"hours_of_work": "اطلاعات برنامه هفتگی موجود نیست",
"active": true
},
{
"id": "29",
"uuid": "61be915b-595a-42e5-bca5-f80d22f4f14a",
"name": "single doctor",
"gender": "woman",
"degree": "specialist",
"img": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/doctors/2025-11/2025-11-19-090938-screenclip.png",
"fid": "98",
"filename": "2025-11-19-090938-screenclip.png",
"filemime": "image/png",
"filesize": 173665
}
],
"specialties": [
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "اولین نوبت آزاد: سه‌شنبه 19 خرداد ساعت 15:00",
"hours_of_work": "از شنبه تا چهارشنبه از ساعت 08:00 تا 18:00",
"active": true
},
{
"id": "35",
"uuid": "ce7afecc-57fd-4496-a3fd-e451b9e2d271",
"name": "سحر",
"gender": "woman",
"degree": "general",
"img": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/doctors/2025-11/003.png",
"fid": "24",
"filename": "003.png",
"filemime": "image/png",
"filesize": 34314
}
],
"specialties": [
{
"uuid": "d60a269d-f7d7-4589-8eab-451e6f740d40",
"id": "603",
"name": "داخلی عمومی",
"parent": "602"
}
],
"satisfaction": "60",
"point": "3.5",
"free_turn": "نوبت آزادی موجود نیست",
"hours_of_work": "اطلاعات برنامه هفتگی موجود نیست",
"active": true
},
{
"id": "34",
"uuid": "1f8b1601-b8f5-4538-ad4a-cfc25843f533",
"name": null,
"gender": null,
"degree": null,
"img": [],
"specialties": [],
"satisfaction": null,
"point": null,
"free_turn": "نوبت آزادی موجود نیست",
"hours_of_work": "اطلاعات برنامه هفتگی موجود نیست",
"active": true
}
],
"page": {
"totalRecords": 7,
"totalPages": 1,
"currentPage": 1
}
}
```
</details>
---
### 19. 🔵 `POST` image upload
```
POST /file/upload/clinic_pro/doctor/field_image
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| --------------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
| `Content-Disposition` | string | ✅ | |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 20. 🟢 `GET` Clinic Doctor List
```
GET /api/v1/clinic/doctor-list/e4550163-5a88-4f67-b07e-cd6063738598
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت لیست پزشکان یک کلینیک خاص طراحی شده است. با استفاده از این سرویس می‌توانید لیست پزشکان یک کلینیک را با امکانات فیلتر، جستجو، مرتب‌سازی و صفحه‌بندی دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ----------- | ------ | ------ | ------------------------------ |
| `name` | string | — | — مثال: `علی` |
| `state` | string | ✅ | — مثال: `31` |
| `city` | string | ✅ | — مثال: `62` |
| `specialty` | string | — | — مثال: `503` |
| `gender` | string | — | — مثال: `man` |
| `degree` | string | — | — مثال: `general` |
| `active` | array | — | — مثال: `0` |
| `page` | string | — | — مثال: `1` |
| `limit` | string | — | — مثال: `10` |
| `sort` | string | — | sort= ASC, DESC — مثال: `DESC` |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 21. 🟢 `GET` all doctor services
```
GET /api/v1/categorys/doctor_services
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `30` |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 22. 🟢 `GET` get doctor rate
```
GET /api/v1/clinicpro-comment/doctor-rate/86483134-d5b9-4110-a49c-f0c640ac0e00
```
**🔓 احراز هویت:** الزامی نیست
> ارسالی در url مقدار uuid دکتر می باشد
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 23. 🔴 `DELETE` delete
```
DELETE /api/v1/rate/doctor/2824a1d0-edff-4b1f-84aa-ac617dcfadb2
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="5"></a>
## 5. آدرس دکتر (Doctor Address)
### 24. 🔵 `POST` post
```
POST /api/v1/clinic-pro/doctor-address
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل آدرس‌های مطب‌های پزشکان طراحی شده است. شما می‌توانید از طریق این سرویس آدرس‌های جدید برای پزشکان ایجاد کنید، آدرس‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 25. 🟡 `PATCH` patch
```
PATCH /api/v1/clinic-pro/doctor-address/48
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل آدرس‌های مطب‌های پزشکان طراحی شده است. شما می‌توانید از طریق این سرویس آدرس‌های جدید برای پزشکان ایجاد کنید، آدرس‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------------- | --------------- | ------ | ------------ |
| `title` | string | ✅ | |
| `doctor_services` | array\<string\> | ✅ | |
#### مثال Request
```json
{
"title": "hamed",
"doctor_services": [
"اکوکاردیوگرافی"
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 26. 🔴 `DELETE` delete
```
DELETE /api/v1/clinic-pro/doctor-address/37
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل آدرس‌های مطب‌های پزشکان طراحی شده است. شما می‌توانید از طریق این سرویس آدرس‌های جدید برای پزشکان ایجاد کنید، آدرس‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 27. 🟢 `GET` get 🆕
```
GET /api/v1/clinic-pro/doctor-address/39
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل آدرس‌های مطب‌های پزشکان طراحی شده است. شما می‌توانید از طریق این سرویس آدرس‌های جدید برای پزشکان ایجاد کنید، آدرس‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| ----------- | ------ | ------------------------------------------------------------ |
| `id` | string | 39 |
| `uuid` | string | 7b759d2a-af8a-4730-8eb0-e77dcd3a724e |
| `name` | string | 2آدرس مطب |
| `map` | object | {latitude, longitude} |
| `address` | string | آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد (پشت پارک معلم)، ب |
| `telephone` | string | 09120671756 |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"id": "39",
"uuid": "7b759d2a-af8a-4730-8eb0-e77dcd3a724e",
"name": "2آدرس مطب",
"map": {
"latitude": "53.121212",
"longitude": "57.121212"
},
"address": "آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد (پشت پارک معلم)، برج ماندگار، طبقه هشتم",
"telephone": "09120671756"
}
```
</details>
---
### 28. 🟢 `GET` list 🆕
```
GET /api/v1/clinic-pro/doctor-addresses/29
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت لیست آدرس‌های مطب‌های یک پزشک خاص طراحی شده است. با استفاده از این سرویس می‌توانید تمام مکان‌هایی که پزشک مورد نظر در آنها فعالیت می‌کند را همراه با جزئیات کامل آدرس، ساعات کاری، اطلاعات تماس و موقعیت جغرافیایی دریافت کنید.
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| ------ | --------- | --------------------------------------- |
| `data` | array (2) | [{id, uuid, name}] |
| `page` | object | {totalRecords, totalPages, currentPage} |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"data": [
{
"id": "39",
"uuid": "7b759d2a-af8a-4730-8eb0-e77dcd3a724e",
"name": "2آدرس مطب",
"map": {
"latitude": "53.121212",
"longitude": "57.121212"
},
"address": "آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد (پشت پارک معلم)، برج ماندگار، طبقه هشتم",
"telephone": "09120671756"
},
{
"id": "40",
"uuid": "458fcbc7-32be-4d30-80dd-f7c4c6f1dace",
"name": "2آدرس مطب",
"map": {
"latitude": "53.121212",
"longitude": "57.121212"
},
"address": "آذربايجان غربي، مياندوآب، خيابان ۱۵ خرداد (پشت پارک معلم)، برج ماندگار، طبقه هشتم",
"telephone": "09120671756"
}
],
"page": {
"totalRecords": 2,
"totalPages": 1,
"currentPage": 1
}
}
```
</details>
---
<a name="6"></a>
## 6. کلینیک (Clinic)
### 29. 🟢 `GET` clinic list 🆕
```
GET /api/v1/clinics
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت لیست کامل کلینیک‌های موجود در سیستم طراحی شده است. شما می‌توانید از طریق این سرویس لیست تمام کلینیک‌ها را با امکانات پیشرفته فیلترینگ، جستجو و صفحه‌بندی دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ----------- | ------ | ------ | -------------- |
| `state` | string | — | — مثال: `13` |
| `city` | string | — | — مثال: `32` |
| `specialty` | string | — | — مثال: `511` |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `10` |
| `sort` | string | — | — مثال: `DESC` |
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| ------ | --------- | --------------------------------------- |
| `data` | array (4) | [{id, uuid, title}] |
| `page` | object | {totalRecords, totalPages, currentPage} |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"data": [
{
"id": "23",
"uuid": "e4550163-5a88-4f67-b07e-cd6063738598",
"title": "clinic 1",
"state": [
{
"uuid": "c0fe6c46-6120-4c53-8d6a-def5b6de3173",
"id": "29",
"name": "هرمزگان"
}
],
"city": [
{
"uuid": "81b18aae-7701-47d7-a07b-b3316c2d5081",
"id": "130",
"name": "بندرعباس",
"parent": "29"
}
],
"clinic_logo": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/clinics/logo/2025-11/003_7.png",
"fid": "96",
"filename": "003_7.png",
"filemime": "image/png",
"filesize": 39281
}
],
"doctors": 3,
"address": " بندرعباس: رسالت شمالی- میدان صادقیه- ساختمان پاسارگاد- طبقه 4 و 5",
"field_working_days": "شنبه تا سه شنبه ساعد ۱۲:۲۰"
},
{
"id": "24",
"uuid": "2a58c3c3-9755-4231-8ab8-27030405e55d",
"title": "clinic 2",
"state": [
{
"uuid": "4f95230b-8cd0-4934-89cc-bd5719412c61",
"id": "8",
"name": "تهران"
}
],
"city": [],
"clinic_logo": [],
"doctors": 1,
"address": " بندرعباس: رسالت شمالی- میدان صادقیه- ساختمان پاسارگاد- طبقه 4 و 5",
"field_working_days": "شنبه تا سه شنبه ساعد ۱۲:۲۰"
},
{
"id": "32",
"uuid": "4919e517-2719-40bf-b35a-e36a5d8a93f1",
"title": null,
"state": [],
"city": [],
"clinic_logo": [],
"doctors": 0,
"address": null,
"field_working_days": null
},
{
"id": "33",
"uuid": "6f6b2e6c-09db-4577-8fed-9ba92e82786c",
"title": null,
"state": [],
"city": [],
"clinic_logo": [],
"doctors": 0,
"address": null,
"field_working_days": null
}
],
"page": {
"totalRecords": 4,
"totalPages": 1,
"currentPage": 1
}
}
```
</details>
---
### 30. 🟢 `GET` get 🆕
```
GET /api/v1/clinic/e4550163-5a88-4f67-b07e-cd6063738598
```
**🔓 احراز هویت:** الزامی نیست
> این API برای مدیریت کامل کلینیک‌ها در سیستم طراحی شده است. شما می‌توانید از طریق این API کلینیک‌های جدید ایجاد کنید، اطلاعات کلینیک‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### پاسخ‌ها
**`200` ✅**
| فیلد | نوع | مثال / توضیح |
| -------------------- | --------- | ------------------------------------------------------------ |
| `id` | string | 23 |
| `uuid` | string | e4550163-5a88-4f67-b07e-cd6063738598 |
| `title` | string | clinic 1 |
| `images_clinic` | array (5) | [{url, fid, filename}] |
| `clinic_logo` | array (1) | [{url, fid, filename}] |
| `phone_number` | string | ۰۶۱-۳۳۹۱۶۵۸۹ |
| `caption` | string | مجموعه کلینیک‌های فخرائی دارای 20 سال سابقه‌‌ی فعالیت در زمی |
| `list_bime` | array (4) | [{uuid, id, name}] |
| `specialties` | array (3) | [{uuid, id, name}] |
| `services` | array (5) | [{uuid, id, name}] |
| `clinic_specialty` | array (3) | [{uuid, id, name}] |
| `doctors` | integer | 3 |
| `doctor_list` | null | null |
| `city` | array (1) | [{uuid, id, name}] |
| `state` | array (1) | [{uuid, id, name}] |
| `location` | string | بندرعباس: رسالت شمالی- میدان صادقیه- ساختمان پاسارگاد- طبقه |
| `map` | object | {latitude, longitude} |
| `24_7` | boolean | true |
| `field_working_days` | string | شنبه تا سه شنبه ساعد ۱۲:۲۰ |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
{
"id": "23",
"uuid": "e4550163-5a88-4f67-b07e-cd6063738598",
"title": "clinic 1",
"images_clinic": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/2025-11/003_52.png",
"fid": "91",
"filename": "003_52.png",
"filemime": "image/png",
"filesize": 34314
},
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/2025-11/003_53.png",
"fid": "92",
"filename": "003_53.png",
"filemime": "image/png",
"filesize": 34314
},
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/2025-11/003_54.png",
"fid": "93",
"filename": "003_54.png",
"filemime": "image/png",
"filesize": 34314
},
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/2025-11/003_55.png",
"fid": "94",
"filename": "003_55.png",
"filemime": "image/png",
"filesize": 34314
},
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/2025-11/003_56.png",
"fid": "95",
"filename": "003_56.png",
"filemime": "image/png",
"filesize": 34314
}
],
"clinic_logo": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/clinics/logo/2025-11/003_7.png",
"fid": "96",
"filename": "003_7.png",
"filemime": "image/png",
"filesize": 39281
}
],
"phone_number": "۰۶۱-۳۳۹۱۶۵۸۹",
"caption": "مجموعه کلینیک‌های فخرائی دارای 20 سال سابقه‌‌ی فعالیت در زمینه کاشت مو و زیبایی در داخل ایران و دیگر کشور‌های جهان است. مجموعه ما در طی این مدت با کسب بیش از صدهزار تجربه موفق در این زمینه توانسته است...",
"list_bime": [
{
"uuid": "aee3930e-9532-47a0-829c-a18c813ce566",
"id": "1559",
"name": "بیمه آتیه سازان حافظ",
"logo": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/hafez-insurance.png",
"fid": "5",
"filename": "hafez-insurance.png",
"filemime": "image/png",
"filesize": 16100
}
]
},
{
"uuid": "5cc67174-b6ab-4dfd-8d10-c9899bfb2dc3",
"id": "1555",
"name": "بیمه SOS",
"logo": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/sos.jpeg",
"fid": "21",
"filename": "sos.jpeg",
"filemime": "image/jpeg",
"filesize": 14933
}
]
},
{
"uuid": "f0bfa574-129f-4152-9634-f4f4f9ad098a",
"id": "1558",
"name": "بیمه حکمت",
"logo": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/hekmat.png",
"fid": "6",
"filename": "hekmat.png",
"filemime": "image/png",
"filesize": 3999
}
]
},
{
"uuid": "47aeb87b-317e-4a3a-a0be-bf22d355c376",
"id": "1552",
"name": "بیمه ایران",
"logo": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/insurance/images/iran.png",
"fid": "7",
"filename": "iran.png",
"filemime": "image/png",
"filesize": 118443
}
]
}
],
"specialties": [
{
"uuid": "11712ce2-8992-4313-902f-45874082bba1",
"id": "610",
"name": "روماتولوژی (بیماری‌های مفاصل)",
"parent": "602"
},
{
"uuid": "64209ecd-bdb4-4bca-969b-93103484a40a",
"id": "611",
"name": "نورولوژی (عصبی)",
"parent": "602"
},
{
"uuid": "40f84ae6-ea0d-4cac-98a7-941732198961",
"id": "613",
"name": "جراحی عمومی",
"parent": "612"
}
],
"services": [
{
"uuid": "2c4d4446-4e4a-42de-829b-c51d3103ad04",
"id": "1602",
"name": "ویزیت تخصصی"
},
{
"uuid": "e5ac35df-af8f-4cef-8119-e92645512313",
"id": "1603",
"name": "ویزیت فوق تخصص"
},
{
"uuid": "35884454-5f90-41f7-9010-7df369cd405a",
"id": "1604",
"name": "ویزیت آنلاین / مشاوره مجازی"
},
{
"uuid": "09677f90-8a56-4063-9c3d-801a6ca1feed",
"id": "1606",
"name": "مشاوره تلفنی پزشکی"
},
{
"uuid": "b0ae84b7-2eb5-4b10-bb54-b8770497df95",
"id": "1700",
"name": "تست‌های ژنومی گسترده (NGS پایه)"
}
],
"clinic_specialty": [
{
"uuid": "11712ce2-8992-4313-902f-45874082bba1",
"id": "610",
"name": "روماتولوژی (بیماری‌های مفاصل)",
"parent": "602"
},
{
"uuid": "64209ecd-bdb4-4bca-969b-93103484a40a",
"id": "611",
"name": "نورولوژی (عصبی)",
"parent": "602"
},
{
"uuid": "40f84ae6-ea0d-4cac-98a7-941732198961",
"id": "613",
"name": "جراحی عمومی",
"parent": "612"
}
],
"doctors": 3,
"doctor_list": null,
"city": [
{
"uuid": "81b18aae-7701-47d7-a07b-b3316c2d5081",
"id": "130",
"name": "بندرعباس",
"parent": "29"
}
],
"state": [
{
"uuid": "c0fe6c46-6120-4c53-8d6a-def5b6de3173",
"id": "29",
"name": "هرمزگان"
}
],
"location": " بندرعباس: رسالت شمالی- میدان صادقیه- ساختمان پاسارگاد- طبقه 4 و 5",
"map": {
"latitude": "27.200632975404",
"longitude": "56.356043815613"
},
"24_7": true,
"field_working_days": "شنبه تا سه شنبه ساعد ۱۲:۲۰"
}
```
</details>
---
### 31. 🟡 `PATCH` patch
```
PATCH /api/v1/clinic/e4550163-5a88-4f67-b07e-cd6063738598
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل کلینیک‌ها در سیستم طراحی شده است. شما می‌توانید از طریق این API کلینیک‌های جدید ایجاد کنید، اطلاعات کلینیک‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------------- | ---------------- | ------ | ------------ |
| `name` | string | ✅ | |
| `address` | string | ✅ | |
| `telephone` | string | ✅ | |
| `latitude` | string | ✅ | |
| `longitude` | string | ✅ | |
| `insurance` | array\<string\> | ✅ | |
| `info` | string | ✅ | |
| `doctor_services` | array\<string\> | ✅ | |
| `working_days` | string | ✅ | |
| `24_7` | integer | ✅ | |
| `image_clinic` | array\<integer\> | ✅ | |
| `clinic_logo` | array\<integer\> | ✅ | |
#### مثال Request
```json
{
"name": "Doctorghach",
"address": "تهران خیابان آزادی",
"telephone": "۰۶۱-۳۳۹۱۶۵۸۹",
"latitude": "",
"longitude": "",
"insurance": [],
"info": "sas",
"doctor_services": [],
"working_days": "شنبه تا سه شنبه ساعد ۱۲:۲۰",
"24_7": 1,
"image_clinic": [
19
],
"clinic_logo": [
20
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 32. 🔵 `POST` post
```
POST /api/v1/clinic
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت کامل کلینیک‌ها در سیستم طراحی شده است. شما می‌توانید از طریق این API کلینیک‌های جدید ایجاد کنید، اطلاعات کلینیک‌های موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------------- | ---------------- | ------ | ------------ |
| `name` | string | ✅ | |
| `state` | array\<integer\> | ✅ | |
| `city` | array\<integer\> | ✅ | |
| `address` | string | ✅ | |
| `telephone` | string | ✅ | |
| `latitude` | string | ✅ | |
| `longitude` | string | ✅ | |
| `insurance` | array\<integer\> | ✅ | |
| `info` | string | ✅ | |
| `doctor_services` | array\<integer\> | ✅ | |
| `working_days` | string | ✅ | |
| `24_7` | integer | ✅ | |
| `image_clinic` | array\<integer\> | ✅ | |
| `clinic_logo` | array\<integer\> | ✅ | |
#### مثال Request
```json
{
"name": "Doctorghach",
"state": [
1
],
"city": [
32
],
"address": "تهران خیابان آزادی",
"telephone": "۰۶۱-۳۳۹۱۶۵۸۹",
"latitude": "50.21",
"longitude": "57.212",
"insurance": [
300,
301
],
"info": "sas",
"doctor_services": [
575,
576
],
"working_days": "شنبه تا سه شنبه ساعد ۱۲:۲۰",
"24_7": 1,
"image_clinic": [
19
],
"clinic_logo": [
20
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 33. 🔵 `POST` image_clinic
```
POST /file/upload/clinic_pro/clinic/field_image_clinic
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| --------------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
| `Content-Disposition` | string | ✅ | |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 34. 🔵 `POST` image logo
```
POST /file/upload/clinic_pro/clinic/field_clinic_logo
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| --------------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
| `Content-Disposition` | string | ✅ | |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 35. 🟡 `PATCH` patch
```
PATCH /api/v1/clinicpro/rate/9708cac9-b0d5-4342-a39e-625991deae0e
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------------- | ------- | ------ | ------------ |
| `correct_diagnosis` | integer | ✅ | |
| `doctor_skill` | integer | ✅ | |
| `behavior_doctor` | integer | ✅ | |
| `office_cleaning` | integer | ✅ | |
| `time_in_office` | integer | ✅ | |
| `doctor` | integer | ✅ | |
| `rate` | integer | ✅ | |
#### مثال Request
```json
{
"correct_diagnosis": 0,
"doctor_skill": 0,
"behavior_doctor": 0,
"office_cleaning": 0,
"time_in_office": 0,
"doctor": 0,
"rate": 0
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 36. 🟢 `GET` get my rate
```
GET /api/v1/clinicpro/rate/86483134-d5b9-4110-a49c-f0c640ac0e00
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> ارسالی در url مقدار uuid دکتر می باشد و این رست برای ریت کاربر می باشد
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 37. 🔵 `POST` post
```
POST /api/v1/clinicpro/rate
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------------- | ------- | ------ | ------------ |
| `correct_diagnosis` | integer | ✅ | |
| `doctor_skill` | integer | ✅ | |
| `behavior_doctor` | integer | ✅ | |
| `office_cleaning` | integer | ✅ | |
| `time_in_office` | integer | ✅ | |
| `doctor` | integer | ✅ | |
| `rate` | integer | ✅ | |
#### مثال Request
```json
{
"correct_diagnosis": 100,
"doctor_skill": 100,
"behavior_doctor": 100,
"office_cleaning": 100,
"time_in_office": 100,
"doctor": 1,
"rate": 2
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 38. 🟢 `GET` Unapproved comments
```
GET /api/v1/clinicpro/unverified-comments/47
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ----- |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 39. 🟡 `PATCH` Comment confirmation
```
PATCH /api/v1/clinicpro/unverified-comments/37
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### مثال Request
```json
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 40. 🔵 `POST` post
```
POST /api/v1/clinicpro/comment
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### مثال Request
```json
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 41. 🟡 `PATCH` patch
```
PATCH /api/v1/clinicpro/comment/fb469645-ea66-4cd6-91ae-6f112b0a4df7
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------------- | ------- | ------ | ------------ |
| `correct_diagnosis` | integer | ✅ | |
| `doctor_skill` | integer | ✅ | |
| `behavior_doctor` | integer | ✅ | |
| `office_cleaning` | integer | ✅ | |
| `time_in_office` | integer | ✅ | |
| `doctor` | integer | ✅ | |
| `rate` | integer | ✅ | |
#### مثال Request
```json
{
"correct_diagnosis": 50,
"doctor_skill": 60,
"behavior_doctor": 70,
"office_cleaning": 80,
"time_in_office": 90,
"doctor": 1,
"rate": 2
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 42. 🔴 `DELETE` delete
```
DELETE /api/v1/clinicpro/comment/fb469645-ea66-4cd6-91ae-6f112b0a4df7
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 43. 🟢 `GET` get
```
GET /api/v1/clinicpro/comment/a70368e6-2efe-4671-a0f7-b72fb268fd10
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 44. 🟢 `GET` list comment
```
GET /api/v1/clinicpro/comments/47
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ----- |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 45. 🔵 `POST` post
```
POST /api/v1/clinicpro/like
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### مثال Request
```json
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 46. 🟡 `PATCH` patch
```
PATCH /api/v1/clinicpro/like/402bcad1-013f-442c-8038-35c3516e5068
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### مثال Request
```json
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="7"></a>
## 7. نماینده (Agent / Representation)
### 47. 🔵 `POST` POST
```
POST /api/v1/agent
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 48. 🟡 `PATCH` PATCH
```
PATCH /api/v1/agent/945a7e43-eedb-4246-8c9a-08029e05e1b1
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 49. 🟢 `GET` GET
```
GET /api/v1/agent/945a7e43-eedb-4246-8c9a-08029e05e1b1
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 50. 🟢 `GET` get
```
GET /api/v1/representation/ab2c58dd-a025-4e2e-afbb-e4376a13b3bb
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 51. 🟢 `GET` my-appointments
```
GET /api/v1/representation/my-appointments/40
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 52. 🟢 `GET` my-doctor
```
GET /api/v1/representation/my-doctor/40
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ----- |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 53. 🟢 `GET` representation_filter
```
GET /api/v1/representation/filter/41
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ----------- | ------ | ------ | ----- |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
| `timestamp` | string | — | |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 54. 🟢 `GET` yearly-income
```
GET /api/v1/representation/yearly-income/41
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ----------- | ------ | ------ | ----- |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
| `timestamp` | string | — | |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="8"></a>
## 8. دسته‌بندی‌ها (Categories)
### 55. 🟢 `GET` all tag
```
GET /api/v1/categorys/tag
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `10` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 56. 🟢 `GET` supplementary_insurance
```
GET /api/v1/categorys/supplementary_insurance
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `10` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 57. 🟢 `GET` categories list
```
GET /api/v1/categorys/insurance_type
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| -------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `10` |
| `parent` | string | — | — مثال: `12` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 58. 🟢 `GET` all state
```
GET /api/v1/categorys/state
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `32` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 59. 🟢 `GET` all city
```
GET /api/v1/categorys/city
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| -------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `30` |
| `parent` | string | — | — مثال: `18` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 60. 🟢 `GET` all specially doctor
```
GET /api/v1/categorys/specially_doctor
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت و مدیریت دسته‌بندی‌های مختلف سیستم طراحی شده است. شما می‌توانید از طریق این API لیست دسته‌بندی‌های مختلفی مانند شهرها، استان‌ها، تخصص‌های پزشکی، انواع بیمه و سایر دسته‌بندی‌ها را با قابلیت صفحه‌بندی و فیلتر دریافت کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | ------------ |
| `page` | string | ✅ | — مثال: `1` |
| `limit` | string | ✅ | — مثال: `30` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 61. 🔵 `POST` post
```
POST /api/v1/category
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------ | ------ | ------ | ------------ |
| `type` | string | ✅ | |
| `name` | string | ✅ | |
#### مثال Request
```json
{
"type": "doctor_services",
"name": "تست"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 62. 🟡 `PATCH` patch
```
PATCH /api/v1/category/571
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------ | ------ | ------ | ------------ |
| `name` | string | ✅ | |
#### مثال Request
```json
{
"name": "hamed"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 63. 🔴 `DELETE` DELETE
```
DELETE /api/v1/category/7675
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------ | ------ | ------ | ------------ |
| `name` | string | ✅ | |
#### مثال Request
```json
{
"name": "hamed"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="9"></a>
## 9. بیمه دکتر (Doctor Insurance)
### 64. 🔵 `POST` post
```
POST /api/v1/insurance/
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ---------------------- | ------ | ------ | ------------ |
| `field_doctor` | string | ✅ | |
| `field_insurance_type` | string | ✅ | |
| `field_price` | string | ✅ | |
#### مثال Request
```json
{
"field_doctor": "31",
"field_insurance_type": "7658",
"field_price": "1234"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 65. 🔴 `DELETE` DELETE
```
DELETE /api/v1/insurance/2
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------ | ------ | ------ | ------------ |
| `name` | string | ✅ | |
#### مثال Request
```json
{
"name": "hamed"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 66. 🟢 `GET` get
```
GET /api/v1/insurance/7
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 67. 🟡 `PATCH` patch
```
PATCH /api/v1/insurance/1
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ---------------------- | ------ | ------ | ------------ |
| `field_doctor` | string | ✅ | |
| `field_insurance_type` | string | ✅ | |
| `field_price` | string | ✅ | |
#### مثال Request
```json
{
"field_doctor": "31",
"field_insurance_type": "7658",
"field_price": "23000"
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="10"></a>
## 10. تنظیمات نوبت — برنامه هفتگی
### 68. 🔵 `POST` post
```
POST /api/v1/appointment-settings/weekly-schedule
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت برنامه کاری هفتگی پزشکان طراحی شده است. با استفاده از این سرویس می‌توانید برنامه کاری هفتگی یک پزشک را ایجاد، مشاهده، ویرایش و حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------- | --------------- | ------ | ------------ |
| `doctor_id` | string | ✅ | |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"doctor_id": "47",
"setting": [
{
"0": {
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 48
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
},
"1": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 49
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"2": {
"morning": {
"active": 1,
"number_of_turns": 8,
"turn_time": 15,
"location": {
"id": 48
},
"start_time": "09:00",
"end_time": "12:00"
},
"evening": {
"active": 1,
"number_of_turns": 6,
"turn_time": 20,
"location": {
"id": 48
},
"start_time": "16:00",
"end_time": "18:00"
}
},
"3": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 12,
"turn_time": 10,
"location": {
"id": 49
},
"start_time": "15:00",
"end_time": "19:00"
}
},
"4": {
"morning": {
"active": 1,
"number_of_turns": 7,
"turn_time": 15,
"location": {
"id": 48
},
"start_time": "08:30",
"end_time": "11:15"
},
"evening": {
"active": 0
}
},
"5": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"6": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 5,
"turn_time": 15,
"location": {
"id": 49
},
"start_time": "17:00",
"end_time": "18:15"
}
}
}
]
}
```
#### پاسخ‌ها
**`403` ❌**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 69. 🟡 `PATCH` patch
```
PATCH /api/v1/appointment-settings/weekly-schedule/0f694f98-63f0-4b96-b7ff-ca99bb9eceb9
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت برنامه کاری هفتگی پزشکان طراحی شده است. با استفاده از این سرویس می‌توانید برنامه کاری هفتگی یک پزشک را ایجاد، مشاهده، ویرایش و حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------- | --------------- | ------ | ------------ |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"setting": [
{
"0": {
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 48
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
},
"1": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 49
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"2": {
"morning": {
"active": 1,
"number_of_turns": 8,
"turn_time": 15,
"location": {
"id": 48
},
"start_time": "09:00",
"end_time": "12:00"
},
"evening": {
"active": 1,
"number_of_turns": 6,
"turn_time": 20,
"location": {
"id": 48
},
"start_time": "16:00",
"end_time": "18:00"
}
},
"3": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 12,
"turn_time": 10,
"location": {
"id": 49
},
"start_time": "15:00",
"end_time": "19:00"
}
},
"4": {
"morning": {
"active": 1,
"number_of_turns": 7,
"turn_time": 15,
"location": {
"id": 48
},
"start_time": "08:30",
"end_time": "11:15"
},
"evening": {
"active": 0
}
},
"5": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"6": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 5,
"turn_time": 15,
"location": {
"id": 49
},
"start_time": "17:00",
"end_time": "18:15"
}
}
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 70. 🟢 `GET` get
```
GET /api/v1/appointment-settings/weekly-schedule/61be915b-595a-42e5-bca5-f80d22f4f14a
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت برنامه کاری هفتگی پزشکان طراحی شده است. با استفاده از این سرویس می‌توانید برنامه کاری هفتگی یک پزشک را ایجاد، مشاهده، ویرایش و حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="11"></a>
## 11. تنظیمات نوبت — Date Override
### 71. 🟢 `GET` list
```
GET /api/v1/appointment-settings/date-override/list/be1fc63e-0207-4fe4-a58b-5ac30953b742
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 72. 🔵 `POST` post
```
POST /api/v1/appointment-settings/date-override
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------- | --------------- | ------ | ------------ |
| `doctor_id` | integer | ✅ | |
| `date` | string | ✅ | |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"doctor_id": 47,
"date": "1749301477",
"setting": [
{
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 48
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 73. 🟡 `PATCH` patch
```
PATCH /api/v1/appointment-settings/date-override/5d066da0-aeab-477c-9bf0-32b0f5648445
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------- | --------------- | ------ | ------------ |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"setting": [
{
"0": {
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
},
"1": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"2": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"3": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"4": {
"morning": {
"active": 0
},
"evening": {
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"5": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"6": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
}
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 74. 🔴 `DELETE` delete
```
DELETE /api/v1/appointment-settings/date-override/9c3cf561-a236-4f1e-9577-612be5c2fc5f
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 75. 🟢 `GET` get
```
GET /api/v1/appointment-settings/date-override/be1fc63e-0207-4fe4-a58b-5ac30953b742
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="12"></a>
## 12. تنظیمات نوبت — تعطیلات
### 76. 🔴 `DELETE` delete
```
DELETE /api/v1/booking-setting/76a70dde-e3e8-4413-a961-94e7d263bef7
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 77. 🔵 `POST` post
```
POST /api/v1/appointment-settings/holidays
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ----------- | --------------- | ------ | ------------ |
| `doctor_id` | integer | ✅ | |
| `date` | string | ✅ | |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"doctor_id": 47,
"date": "1749301477",
"setting": [
{
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 48
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 78. 🟡 `PATCH` patch
```
PATCH /api/v1/appointment-settings/holidays/55deaeb6-d72e-4bde-9e2e-0b298c98b93b
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------- | --------------- | ------ | ------------ |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"setting": [
{
"0": {
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
},
"1": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"2": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"3": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"4": {
"morning": {
"active": 0
},
"evening": {
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"5": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"6": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
}
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 79. 🔴 `DELETE` delete
```
DELETE /api/v1/appointment-settings/holidays/55deaeb6-d72e-4bde-9e2e-0b298c98b93b
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 80. 🟢 `GET` get
```
GET /api/v1/appointment-settings/holidays/55deaeb6-d72e-4bde-9e2e-0b298c98b93b
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="13"></a>
## 13. نوبت‌دهی (Appointment)
### 81. 🟢 `GET` appointment slots
```
GET /api/v1/appointment-slots
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت اسلات‌های زمانی دردسترس برای نوبت‌دهی پزشکی طراحی شده است. شما می‌توانید از طریق این API اسلات‌های خالی یک پزشک خاص در تاریخ مشخصی را مشاهده کنید و سپس آن‌ها را برای ایجاد نوبت استفاده کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ----------- | ------- | ------ | ----- |
| `date` | integer | — | |
| `doctor_id` | integer | — | |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 82. 🔵 `POST` post
```
POST /api/v1/appointment
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت نوبت‌های پزشکی طراحی شده است. شما می‌توانید از طریق این API نوبت‌های جدید ایجاد کنید، نوبت‌های موجود را مشاهده کنید، آن‌ها را ویرایش کنید یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------ | ------ | ------ | ------------ |
| `type` | string | ✅ | |
| `name` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 83. 🟢 `GET` Days Not Available For Appointments
```
GET /api/v1/appointment/not-available/29
```
**🔓 احراز هویت:** الزامی نیست
> این API برای دریافت لیست کامل روزهای تعطیل رسمی ایران طراحی شده است. این اطلاعات شامل تعطیلات ملی، مذهبی و رسمی کشور می‌باشد که برای تمام پزشکان و کلینیک‌ها اعمال می‌شود.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 84. 🟢 `GET` My Appointments
```
GET /api/v1/appointment/my-appointments/22
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مشاهده و مدیریت نوبت‌های پزشکی شما طراحی شده است. با استفاده از این سرویس می‌توانید لیست تمام نوبت‌های خود را مشاهده کنید و آن‌ها را بر اساس وضعیت فیلتر کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| -------- | ------ | ------ | ------------------ |
| `status` | string | ✅ | — مثال: `reserved` |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="14"></a>
## 14. منشی (Secretary)
### 85. 🔵 `POST` post
```
POST /api/v1/secretary
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 86. 🟡 `PATCH` patch
```
PATCH /api/v1/secretary/b2269db9-9999-4b6b-a4b7-c2a424b0a7f3
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| --------- | --------------- | ------ | ------------ |
| `setting` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"setting": [
{
"0": {
"morning": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "10:00",
"end_time": "13:00"
},
"evening": {
"active": 0
}
},
"1": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"2": {
"morning": {
"active": 0
},
"evening": {
"active": 1,
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"3": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"4": {
"morning": {
"active": 0
},
"evening": {
"number_of_turns": 10,
"turn_time": 10,
"location": {
"id": 12,
"name": "مطب ۱"
},
"start_time": "15:00",
"end_time": "19:30"
}
},
"5": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
},
"6": {
"morning": {
"active": 0
},
"evening": {
"active": 0
}
}
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 87. 🟢 `GET` get
```
GET /api/v1/secretary/65ab3371-9904-4348-bb5d-a3c035417e28
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="15"></a>
## 15. پرداخت (Payment)
### 88. 🟢 `GET` get
```
GET /api/v1/payment/76a10c47-49af-4bb5-9113-5dbab608ed2f
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 89. 🟡 `PATCH` patch
```
PATCH /api/v1/payment
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 90. 🔵 `POST` post
```
POST /api/v1/payment
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 91. 🔴 `DELETE` delete
```
DELETE /api/v1/payment
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 92. 🟢 `GET` My Payments
```
GET /api/v1/payment/my-payments/32
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مشاهده و مدیریت پرداخت‌های شما طراحی شده است. با استفاده از این سرویس می‌توانید لیست تمام پرداخت‌های خود را مشاهده کنید، وضعیت پرداخت‌ها را پیگیری کنید و تاریخچه مالی خود را بررسی کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| -------- | ------ | ------ | ------------------ |
| `status` | string | ✅ | — مثال: `reserved` |
| `page` | string | ✅ | |
| `limit` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
<a name="16"></a>
## 16. وبلاگ (Blog)
### 93. 🟢 `GET` top blogs 🆕
```
GET /api/v1/blogs/top
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت لیست مقالات برتر و ویژه وبلاگ طراحی شده است. این مقالات دارای اولویت بالا و محتوای مهم هستند که معمولاً در بخش‌های ویژه سایت نمایش داده می‌شوند.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> آرایه‌ای از آبجکت — تعداد در مثال: 4 آیتم. ساختار هر آیتم:
| فیلد | نوع | مثال / توضیح |
| --------- | --------- | --------------------------------------- |
| `uuid` | string | 95f6acb0-3331-4141-801e-004e8460edac |
| `title` | string | روش های خانگی محافظت از پوست در تابستان |
| `status` | string | 1 |
| `body` | object | {value, format} |
| `created` | string | 1763536163 |
| `changed` | string | 1763537699 |
| `author` | string | single doctor |
| `images` | array (1) | [{url, fid, filename}] |
| `tag` | array (3) | [{uuid, id, name}] |
<details>
<summary>مثال کامل Response (کلیک کنید)</summary>
```json
[
{
"uuid": "95f6acb0-3331-4141-801e-004e8460edac",
"title": "روش های خانگی محافظت از پوست در تابستان",
"status": "1",
"body": {
"value": "تغییر یا جهش در DNA می تواند باعث شود سلول های طبیعی پستان به سلول های سرطانی تبدیل شوند. برخی از تغییرات DNA از طریق والدین منتقل می شود (وراثتی) و می توانند ریسک ابتلا به کانسر سینه را افزایش دهند. ...",
"format": "full_html"
},
"created": "1763536163",
"changed": "1763537699",
"author": "single doctor",
"images": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/blog/screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"fid": "97",
"filename": "screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"filemime": "image/png",
"filesize": 320787
}
],
"tag": [
{
"uuid": "24926497-fc2d-47d7-82ae-26cbbc4d6468",
"id": "2501",
"name": "مجله"
},
{
"uuid": "6c6a488b-1051-43a2-887b-0ec7a05e52d5",
"id": "2500",
"name": "سلامتی"
},
{
"uuid": "8f787827-12e7-486b-be78-15d78bcf84b5",
"id": "2502",
"name": "سلامت و روان"
}
]
},
{
"uuid": "5a9fe394-2ebf-4e32-ae74-6670aa5aa46a",
"title": "روش های خانگی محافظت از پوست در تابستان",
"status": "1",
"body": {
"value": "تغییر یا جهش در DNA می تواند باعث شود سلول های طبیعی پستان به سلول های سرطانی تبدیل شوند. برخی از تغییرات DNA از طریق والدین منتقل می شود (وراثتی) و می توانند ریسک ابتلا به کانسر سینه را افزایش دهند. ...",
"format": "full_html"
},
"created": "1763536163",
"changed": "1763537686",
"author": "single doctor",
"images": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/blog/screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"fid": "97",
"filename": "screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"filemime": "image/png",
"filesize": 320787
}
],
"tag": [
{
"uuid": "24926497-fc2d-47d7-82ae-26cbbc4d6468",
"id": "2501",
"name": "مجله"
}
]
},
{
"uuid": "9d4d4233-9741-4549-acc1-4fc8798c77bf",
"title": "روش های خانگی محافظت از پوست در تابستان",
"status": "1",
"body": {
"value": "تغییر یا جهش در DNA می تواند باعث شود سلول های طبیعی پستان به سلول های سرطانی تبدیل شوند. برخی از تغییرات DNA از طریق والدین منتقل می شود (وراثتی) و می توانند ریسک ابتلا به کانسر سینه را افزایش دهند. ...",
"format": "full_html"
},
"created": "1763536162",
"changed": "1763537710",
"author": "single doctor",
"images": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/blog/screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"fid": "97",
"filename": "screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"filemime": "image/png",
"filesize": 320787
}
],
"tag": [
{
"uuid": "6c6a488b-1051-43a2-887b-0ec7a05e52d5",
"id": "2500",
"name": "سلامتی"
},
{
"uuid": "8f787827-12e7-486b-be78-15d78bcf84b5",
"id": "2502",
"name": "سلامت و روان"
},
{
"uuid": "9db5fe73-ea1c-401d-b8e6-5c7459a06975",
"id": "2503",
"name": "تغذیه"
}
]
},
{
"uuid": "836ed807-9f6b-4ebb-aa43-e8d27b183b30",
"title": "روش های خانگی محافظت از پوست در تابستان",
"status": "1",
"body": {
"value": "تغییر یا جهش در DNA می تواند باعث شود سلول های طبیعی پستان به سلول های سرطانی تبدیل شوند. برخی از تغییرات DNA از طریق والدین منتقل می شود (وراثتی) و می توانند ریسک ابتلا به کانسر سینه را افزایش دهند. ...",
"format": "full_html"
},
"created": "1763536161",
"changed": "1763537721",
"author": "single doctor",
"images": [
{
"url": "https://clinic-pro-back.ddev.site/sites/default/files/blog/screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"fid": "97",
"filename": "screencapture-howraz-checkout-2025-11-19-10_16_27.png",
"filemime": "image/png",
"filesize": 320787
}
],
"tag": [
{
"uuid": "6c6a488b-1051-43a2-887b-0ec7a05e52d5",
"id": "2500",
"name": "سلامتی"
},
{
"uuid": "8f787827-12e7-486b-be78-15d78bcf84b5",
"id": "2502",
"name": "سلامت و روان"
},
{
"uuid": "9db5fe73-ea1c-401d-b8e6-5c7459a06975",
"id": "2503",
"name": "تغذیه"
}
]
}
]
```
</details>
---
### 94. 🔵 `POST` post
```
POST /api/v1/blog/
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای مدیریت مطالب وبلاگ در سیستم طراحی شده است. شما می‌توانید از طریق این API مقالات جدید ایجاد کنید، مقالات موجود را مشاهده، ویرایش یا حذف کنید.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
| `X-CSRF-Token` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------- | --------------- | ------ | ------------ |
| `label` | string | ✅ | |
| `description` | string | ✅ | |
| `field_image` | array\<object\> | ✅ | |
#### مثال Request
```json
{
"label": "asas",
"description": "Lorem ipsum dolor sit amet consectetur adipiscing elit, dapibus commodo ligula id facilisi nibh mus, scelerisque fringilla quam maecenas at morbi. Scelerisque hac ridiculus diam nascetur cubilia morbi...",
"field_image": [
{
"target_id": 1
},
{
"target_id": 2
}
]
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 95. 🟡 `PATCH` patch
```
PATCH /api/v1/blog/72522a1d-67c0-4625-b436-0892d186dc4b
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این endpoint برای ویرایش اطلاعات یک مقاله موجود استفاده می‌شود. شناسه یکتای مقاله تنها فیلدهایی که می‌خواهید تغییر دهید را ارسال کنید: - **200**: مقاله با موفقیت به‌روزرسانی شد - **400**: داده‌های ارسالی نامعتبر هستند - **404**: مقاله یافت نشد - **401**: احراز هویت مورد نیاز است - **403**: دسترسی به ویرایش این مقاله ندارید - **422**: خطا در اعتبارسنجی داده‌ها - **500**: خطای داخلی سرور --- - **200**: مقاله با موفقیت حذف شد - **404**: مقاله یافت نشد - **401**: احراز هویت مورد نیاز است - **403**: دسترسی به حذف این مقاله ندارید - **500**: خطای داخلی سرور --- - **label**: عنوان مقاله - **description**: محتوای کامل مقاله - **image**: آرایه‌ای از شناسه‌های تصاویر - **tag**: آرایه‌ای از شناسه‌های برچسب‌ها - **top**: وضعیت ویژه بودن مقاله (1 = ویژه، 0 = معمولی) - **uuid**: شناسه یکتا (تولید خودکار) - **title**: عنوان مقاله (از label تبدیل می‌شود) - **body**: آبجکت محتوا (از description تبدیل می‌شود) - **author**: نام نویسنده (تولید خودکار) - **status**: وضعیت انتشار (تولید خودکار) - **created**: زمان ایجاد (timestamp خودکار) - **changed**: زمان آخرین تغییر (timestamp خودکار) - **images**: آرایه تصاویر با URL های کامل - **tag**: آرایه برچسب‌ها (ممکن است خالی باشد) فیلد image یک آرایه از شناسه‌های عددی تصاویر است: - هر عدد نمایانگر یک تصویر آپلود شده در سیستم است - این شناسه‌ها در response به URL های کامل تبدیل می‌شوند فیلد tag یک آرایه از شناسه‌های عددی برچسب‌ها است: - هر عدد نمایانگر یک برچسب از پیش تعریف شده در سیستم است - این شناسه‌ها در response ممکن است به نام‌های برچسب تبدیل شوند - **1**: مقاله ویژه و مهم (نمایش در بالای لیست) - **0**: مقاله معمولی - فیلد **label** به **title** در response تبدیل می‌شود - فیلد **description** به **body.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### Request Body
| فیلد | نوع | الزامی | توضیح / مثال |
| ------------- | ------ | ------ | ------------ |
| `label` | string | ✅ | |
| `description` | string | ✅ | |
#### مثال Request
```json
{
"label": "test",
"description": "Lorem ipsum dolor sit amet consectetur adipiscing elit, dapibus commodo ligula id facilisi nibh mus, scelerisque fringilla quam maecenas at morbi. Scelerisque hac ridiculus diam nascetur cubilia morbi..."
}
```
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 96. 🔴 `DELETE` delete
```
DELETE /api/v1/blog/72522a1d-67c0-4625-b436-0892d186dc4b
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این endpoint برای حذف یک مقاله استفاده می‌شود. شناسه یکتای مقاله - **200**: مقاله با موفقیت حذف شد - **404**: مقاله یافت نشد - **401**: احراز هویت مورد نیاز است - **403**: دسترسی به حذف این مقاله ندارید - **500**: خطای داخلی سرور --- - **label**: عنوان مقاله - **description**: محتوای کامل مقاله - **image**: آرایه‌ای از شناسه‌های تصاویر - **tag**: آرایه‌ای از شناسه‌های برچسب‌ها - **top**: وضعیت ویژه بودن مقاله (1 = ویژه، 0 = معمولی) - **uuid**: شناسه یکتا (تولید خودکار) - **title**: عنوان مقاله (از label تبدیل می‌شود) - **body**: آبجکت محتوا (از description تبدیل می‌شود) - **author**: نام نویسنده (تولید خودکار) - **status**: وضعیت انتشار (تولید خودکار) - **created**: زمان ایجاد (timestamp خودکار) - **changed**: زمان آخرین تغییر (timestamp خودکار) - **images**: آرایه تصاویر با URL های کامل - **tag**: آرایه برچسب‌ها (ممکن است خالی باشد) فیلد image یک آرایه از شناسه‌های عددی تصاویر است: - هر عدد نمایانگر یک تصویر آپلود شده در سیستم است - این شناسه‌ها در response به URL های کامل تبدیل می‌شوند فیلد tag یک آرایه از شناسه‌های عددی برچسب‌ها است: - هر عدد نمایانگر یک برچسب از پیش تعریف شده در سیستم است - این شناسه‌ها در response ممکن است به نام‌های برچسب تبدیل شوند - **1**: مقاله ویژه و مهم (نمایش در بالای لیست) - **0**: مقاله معمولی - فیلد **label** به **title** در response تبدیل می‌شود - فیلد **description** به **body.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | ✅ | |
| `Content-Type` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 97. 🟢 `GET` get blog
```
GET /api/v1/blog/1805d516-46d3-474d-96ba-023bad40c516
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این endpoint برای مشاهده جزئیات یک مقاله خاص استفاده می‌شود. شناسه یکتای مقاله (مثال: 550e8400-e29b-41d4-a716-446655440000) - **200**: مقاله با موفقیت بازیابی شد - **404**: مقاله یافت نشد - **401**: احراز هویت مورد نیاز است - **500**: خطای داخلی سرور --- - **label**: عنوان مقاله - **description**: محتوای کامل مقاله - **image**: آرایه‌ای از شناسه‌های تصاویر - **tag**: آرایه‌ای از شناسه‌های برچسب‌ها - **top**: وضعیت ویژه بودن مقاله (1 = ویژه، 0 = معمولی) - **uuid**: شناسه یکتا (تولید خودکار) - **title**: عنوان مقاله (از label تبدیل می‌شود) - **body**: آبجکت محتوا (از description تبدیل می‌شود) - **author**: نام نویسنده (تولید خودکار) - **status**: وضعیت انتشار (تولید خودکار) - **created**: زمان ایجاد (timestamp خودکار) - **changed**: زمان آخرین تغییر (timestamp خودکار) - **images**: آرایه تصاویر با URL های کامل - **tag**: آرایه برچسب‌ها (ممکن است خالی باشد) فیلد image یک آرایه از شناسه‌های عددی تصاویر است: - هر عدد نمایانگر یک تصویر آپلود شده در سیستم است - این شناسه‌ها در response به URL های کامل تبدیل می‌شوند فیلد tag یک آرایه از شناسه‌های عددی برچسب‌ها است: - هر عدد نمایانگر یک برچسب از پیش تعریف شده در سیستم است - این شناسه‌ها در response ممکن است به نام‌های برچسب تبدیل شوند - **1**: مقاله ویژه و مهم (نمایش در بالای لیست) - **0**: مقاله معمولی - فیلد **label** به **title** در response تبدیل می‌شود - فیلد **description** به **body.
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 98. 🟢 `GET` list blogs
```
GET /api/v1/blogs
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
> این API برای دریافت لیست تمام مقالات وبلاگ در سیستم طراحی شده است. شما می‌توانید از طریق این API لیست مقالات را با قابلیت‌های جستجو، فیلترینگ، صفحه‌بندی و مرتب‌سازی مشاهده کنید.
#### پارامترهای Query
| پارامتر | نوع | الزامی | توضیح |
| ------- | ------ | ------ | -------------------- |
| `page` | string | ✅ | — مثال: `1` |
| `title` | string | ✅ | — مثال: `نشانه های ` |
| `limit` | string | ✅ | — مثال: `10` |
| `tag` | string | — | — مثال: `3637` |
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| -------------- | ------ | ------ | ----- |
| `X-CSRF-Token` | string | — | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
### 99. 🔵 `POST` image upload
```
POST /file/upload/blog/blog/field_image
```
**🔐 احراز هویت:** `Authorization: Bearer {access_token}` — الزامی
#### هدرهای اضافی
| هدر | نوع | الزامی | توضیح |
| --------------------- | ------ | ------ | ----- |
| `Content-Type` | string | ✅ | |
| `Content-Disposition` | string | ✅ | |
| `X-CSRF-Token` | string | ✅ | |
#### پاسخ‌ها
**`200` ✅**
> ⚠️ ساختار پاسخ مستند نشده — باید در Symfony تعریف و مستند شود.
---
</div>