# Sprint 3 — تصفّح المستخدم (User browse & discovery)

> تطبيق العميل: المصادقة + التصفّح العام (ضيف) + الاكتشاف + المفضلة.
> المرجع: [`../analysis.md`](../analysis.md) §3/§6 + `scratchpad/screens_u1.md`,`screens_visitor.md`.

## النطاق
- **API user — auth:** register(+verify OTP) · ربط login/forgot الموجودين بتطبيق العميل (REUSE base auth).
- **API user — home:** `GET /home` (greeting, sliders/banner, occasions, service-categories, featured providers) · `GET /sliders`.
- **API user — catalog (عام/ضيف):**
  - `GET /occasions` · `GET /service-categories`
  - `GET /providers` (فلترة: category_id, occasion_id, city, rating, price_range, available_date · sort: relevance|rating|price_asc|price_desc · paginate)
  - `GET /providers/{id}` (+ services, packages(+items), works, reviews, stats, availability)
  - `GET /providers/{id}/{services|packages|works|reviews}` · `/availability?month=` · `/time-slots?date=`
- **API user — search:** `GET /search?q=` · `/search/suggestions` · `/search/recent` (list/add/clear).
- **API user — favorites:** `GET /favorites` · `POST /favorites` · `DELETE /favorites/{provider}` (ملكية).

## الاعتماديات
- Sprint 2 (providers/services/packages/works/availability + approval) — DONE. (الكتالوج يعرض فقط `approved` + `is_active`.)

## فكّر-الأول
- **لبنات Laravel:** API Resources (enum `{value,label}`, computed accessors) · Query scopes للفلترة/الترتيب · Guest access (بدون `auth:sanctum` على التصفّح؛ المحمي يرجّع 401 بنسخة «برجاء تسجيل الدخول اولا») · Pagination trait.
- **قواعد أعمال:** الضيف يتصفّح كل شيء؛ favorites/حجز/تقييم محميّة. الكتالوج يُظهر المزوّد المعتمد النشط فقط. recent_searches سيرفر-side.
- **حواف:** فلترة بتاريخ متاح (ربط بـ time_slots) · ترتيب relevance افتراضي · بحث عربي · صفحة فارغة.

## design pattern (اقتراح)
- **Strategy** لخيارات الترتيب (relevance/rating/price) — أو scopes بسيطة (الافتراضي). موافقة عند التنفيذ.

## نتيجة الإنجاز (DoD)
```
migrate:fresh --seed: ⬜ · pint: ⬜ · dump-autoload -o: ⬜ · schema:check: ⬜ · test: ⬜ · smoke: ⬜ · commit: <hash>
```
