feat: add PublicResourceBookingController and PublicResourceBookingService for public booking functionality

- Implemented PublicResourceBookingController to handle public resource booking requests.
- Added methods for retrieving bookable resources, available slots, and month availability.
- Created PublicResourceBookingService to manage public resource offerings and service visibility.
- Developed tests for public resource booking to ensure correct functionality and error handling.
This commit is contained in:
hamed
2026-08-09 10:45:51 +03:30
parent cd793489ef
commit cfeb447645
10 changed files with 1645 additions and 13 deletions
+21
View File
@@ -291,6 +291,27 @@ Book an appointment slot.
>
> نوبت بدون منبع دقیقاً مثل قبل با کلید و قفل پزشک محافظت می‌شود.
>
> **مدت نوبت روی منبع (2026-08).** وقتی `resource_uuid` داده شده و منبع **همهٔ**
> سرویس‌های `service_item_uuids` را با ردیفِ ارائهٔ فعال و توگلِ «نمایش در نوبت‌دهی
> آنلاین» روشن ارائه می‌دهد، `slot_end` از زنجیرهٔ حلِ خودِ منبع محاسبه می‌شود
> (`ResourceServiceResolver`) — همان عددی که
> [`appointment-resource-slots`](resource.md) با آن زمان‌ها را ساخته. پیش از این مدت
> همیشه از `ServiceBookingCalculator` پزشک‌محور می‌آمد، پس نوبتِ ثبت‌شده با اسلاتی که به
> بیمار نشان داده شده بود یکی نمی‌شد.
>
> شرطی است و نه همیشگی — سه رفتار که با هم فرق دارند:
>
> - **ردیف ارائه هست و فعال + سرویس روشن** ⇒ مدت از منبع. مثلاً سرویسِ ۳۰ دقیقه‌ایِ
> پیش‌فرض با `duration_minutes = 45` روی این دستگاه، نوبتِ ۴۵ دقیقه‌ای می‌سازد.
> - **هیچ ردیفی نیست** ⇒ مثل قبل، مدت از پیش‌فرضِ خودِ سرویس. محیطی که هنوز رابطه‌های
> منبع↔سرویس را پر نکرده نباید یک‌شبه نوبت‌دهی‌اش قطع شود.
> - **ردیف هست ولی غیرفعال** ⇒ `422` با «این منبع این سرویس را ارائه نمی‌دهد». غیرفعال
> حرفِ صریحِ مالک است، نه سکوت.
>
> گیتِ `bookable` هم دور زده نمی‌شود: سرویسی که توگلش خاموش است حتی با ردیفِ ارائهٔ فعال
> `422` می‌گیرد («این سرویس برای نوبت‌دهی فعال نیست») — همان رفتار مسیر پزشک‌محور.
> مسیر پنل (`POST /api/v1/my/appointment`) عمداً سخت‌گیریِ `bookable` را ندارد.
>
> **پاسخ:** علاوه بر فیلدهای قبلی، `resource` (`uuid`, `name`, `type`) و `service_option`
> (`uuid`, `name`) برمی‌گردند. نوبت‌های پیش از مدل منبع‌محور هر دو را `null` دارند، پس
> کلاینت باید با `null` کنار بیاید.