test(booking): freeze the public-site appointment contract; close task 00b

Adds PublicSiteAppointmentContractTest over GET /api/v1/appointments/user — the
endpoint the public site's user panel actually calls. Task 00's note claimed this
prerequisite was met by extending my/appointments, which is the admin panel's
endpoint; appointments/user returns Appointment::toArray(), which the same task
extended separately. The outcome was right, the reasoning in the note was not.
This test pins it so neither can drift silently: breaking these fields produces no
build error in either repo.

Documents why appointment-service-slots cannot be grouped into shifts by the
client, and records task 00b's checklist including the two items deliberately not
done (colour rewrite, reschedule button) with the evidence for each.

Task: docs/new_feture/taskes/task-00b-nobat724-service-mode/
Slot-mode contract: unchanged (--group=slot-mode-frozen green)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
hamed
2026-07-30 15:59:31 +03:30
co-authored by Claude Opus 5
parent 118b7f9fba
commit 043713275c
3 changed files with 257 additions and 70 deletions
+12
View File
@@ -120,6 +120,18 @@ Get all appointment slots (available and booked) for a doctor on a specific date
`isSlotTaken()` تنها تداخل با نوبت دیگر را می‌گوید، ولی این فهرست شیفت، تعطیلی،
`date_override`، پنجرهٔ رزرو و بافر را هم اعمال می‌کند.
> **این پاسخ مرزِ شیفت‌ها را نمی‌گوید — و کلاینت هم نمی‌تواند حدس بزند.**
> برخلاف `appointment-slots` که `sessions` جدا می‌دهد، اینجا `start_times` مسطح است.
> با فهرست مسطح، شکافِ بین دو شیفت از شکافِ یک نوبتِ اشغال‌شده **قابل تفکیک نیست**:
> گام عادی `مدت + بافر` است و دو نوبت پشت‌سرهم شکافی می‌سازد که از تعطیلیِ میان صبح و
> عصر تشخیص‌پذیر نیست. هر آستانه‌ای که این دو را جدا کند، روی سرویس‌های بلند (گام >
> آستانه) هر اسلات را یک گروه می‌کند و روی نوبت‌های اشغال گروهِ جعلی می‌سازد.
>
> پس `nobat724_front/lib/appointmentSlots.js` عمداً **یک** session با بازهٔ واقعی
> برمی‌گرداند و تفکیک شیفت نمی‌سازد. اگر تفکیک لازم شد، باید **سرور** بدهد — جای
> طبیعی‌اش endpoint حالت چندمنبعی (تسک ۰۶) است، نه تغییر قرارداد این یکی که سه کلاینت
> مصرفش می‌کنند.
**عمومی** (بدون احراز هویت — مصرف‌کننده: سایت nobat724)، مگر با `exclude_appointment_uuid`
که JWT لازم دارد.