Spaces:
Sleeping
Sleeping
| # Session Workflow | |
| ## Session Status Lifecycle | |
| ``` | |
| βββββββββββββββ | |
| β REQUESTED β β Student books session | |
| ββββββββ¬βββββββ | |
| β | |
| ββββββββββββββ΄βββββββββββββ | |
| β Sheikh Accept β Sheikh Reject | |
| βΌ βΌ | |
| ββββββββββββ βββββββββββββ | |
| β TOPAY β β CANCELLED β | |
| ββββββ¬ββββββ βββββββββββββ | |
| β | |
| β Student pays via Stripe | |
| β (auto-cancel if unpaid 5min before start) | |
| βΌ | |
| ββββββββββββββββ | |
| β SCHEDULED β | |
| ββββββββ¬ββββββββ | |
| β | |
| β Both parties join | |
| β (auto-MISSED if no-show 10min after start) | |
| βΌ | |
| βββββββββββββ | |
| β ON_GOING β | |
| βββββββ¬ββββββ | |
| β Sheikh ends session | |
| βΌ | |
| βββββββββββββ | |
| β COMPLETED β β Payout triggered to Sheikh | |
| βββββββββββββ | |
| ``` | |
| --- | |
| ## Step-by-Step Flow | |
| ### 1. Student Discovers & Books | |
| **Components**: `FindSheikh.tsx` β `SheikhProfile.tsx` | |
| ``` | |
| Student browses sheikhs | |
| β | |
| βΌ | |
| GET /api/sheikhs/{id}/available-dates?from=...&days=30 | |
| β | |
| βΌ | |
| Student picks a date | |
| β | |
| βΌ | |
| GET /api/sheikhs/{id}/available-slots/day?date=... | |
| β | |
| βΌ | |
| Student picks a time slot + writes session description | |
| β | |
| βΌ | |
| POST /api/student/sessions | |
| { sheikhId, startDateTime, sessionDescription } | |
| β | |
| βΌ | |
| Session created β status: REQUESTED | |
| ``` | |
| --- | |
| ### 2. Sheikh Reviews & Accepts/Rejects | |
| **Component**: `SheikhSessionRequests.tsx` β Pending Requests tab | |
| ``` | |
| Sheikh sees new session request | |
| β | |
| βββ Accept β POST /api/sheikh/sessions/{id}/accept | |
| β β | |
| β βΌ | |
| β Status β TOPAY | |
| β ββ schedules: auto-cancel task (5min before start) | |
| β ββ schedules: missed-check task (10min after start) | |
| β | |
| βββ Reject β POST /api/sheikh/sessions/{id}/reject | |
| β | |
| βΌ | |
| Status β CANCELLED | |
| ``` | |
| --- | |
| ### 3. Student Pays | |
| **Components**: `MySessions.tsx` β `StripePaymentModal.tsx` | |
| ``` | |
| Student sees session in TOPAY state β clicks "Pay Now" | |
| β | |
| βΌ | |
| POST /api/payments/initiate/card | |
| { sessionId, studentId, sheikhId, amount } | |
| β | |
| βΌ | |
| Backend creates Stripe PaymentIntent | |
| Returns: { clientSecret, publishableKey, paymentIntentId } | |
| β | |
| βΌ | |
| Frontend: Stripe.js collects card details | |
| β | |
| βΌ | |
| stripe.confirmCardPayment(clientSecret) | |
| β | |
| βΌ | |
| POST /api/payments/confirm-payment/{paymentIntentId} | |
| β | |
| βΌ | |
| Backend verifies PaymentIntent β status: PAID | |
| Session status β SCHEDULED | |
| ``` | |
| > If student doesn't pay: auto-cancel task fires 5 min before start β status: CANCELLED | |
| --- | |
| ### 4. Waiting Room | |
| **Component**: `WaitingRoom.tsx` | |
| **Route**: `/waiting-room/{sessionId}` | |
| ``` | |
| Both parties navigate to waiting room | |
| β | |
| βΌ | |
| Polls GET /api/{role}/sessions/{id} every 5 seconds | |
| β | |
| βββ countdown > 5 min β Button disabled, show timer | |
| βββ countdown β€ 5 min β "Enter Session" button enabled | |
| βββ session = ON_GOING β Auto-redirect to /session/{id} | |
| βββ session = MISSED β Redirect to session report | |
| βββ session = CANCELLED β Redirect to sessions list | |
| ``` | |
| --- | |
| ### 5. Live Session | |
| **Component**: `LiveSession.tsx` | |
| **Route**: `/session/{sessionId}` | |
| ``` | |
| Party joins | |
| β | |
| βΌ | |
| POST /api/{role}/sessions/{id}/join β records joinedAt timestamp | |
| β | |
| βΌ | |
| WebRTC peer-to-peer connection established | |
| β | |
| βββ Video / Audio controls (mute, camera toggle) | |
| βββ Chat sidebar (both parties) | |
| βββ Notes sidebar (Sheikh only β auto-saved every 60s) | |
| βββ Connection quality indicator | |
| When BOTH have joined: | |
| β | |
| βΌ | |
| Status auto-transitions β ON_GOING | |
| > If sheikh doesn't join within 10 min after start: | |
| > Missed-check task fires β status: MISSED β refund issued to student | |
| ``` | |
| --- | |
| ### 6. Ending the Session | |
| **Only the Sheikh can end the session.** | |
| ``` | |
| Sheikh clicks "End Session" | |
| β | |
| βΌ | |
| Confirmation dialog | |
| β | |
| βΌ | |
| POST /api/sheikh/sessions/{id}/end | |
| { sessionNotes } | |
| β | |
| βΌ | |
| Backend: | |
| - Records actualEnd = now | |
| - Saves session notes | |
| - Status β COMPLETED | |
| - Triggers payout to Sheikh (85% of payment) | |
| β | |
| βΌ | |
| Sheikh: stays on session page / redirected to sessions list | |
| Student: redirected to SessionReport.tsx for review & rating | |
| ``` | |
| --- | |
| ### 7. Auto-Safety Nets (Backend Scheduled Tasks) | |
| | Trigger | When | Action | | |
| |---|---|---| | |
| | Unpaid session | 5 min before scheduled start | Status β CANCELLED | | |
| | No-show (either party) | 10 min after scheduled start | Status β MISSED, refund to student | | |
| | Sheikh no-show | 10 min after scheduled start | Status β MISSED, refund to student | | |
| | Server restart | On startup | All SCHEDULED/TOPAY tasks re-queued | | |
| --- | |
| ## Key Components Map | |
| | Component | Role | | |
| |---|---| | |
| | `FindSheikh.tsx` | Browse & search sheikhs | | |
| | `SheikhProfile.tsx` | Pick availability slot, initiate booking | | |
| | `SheikhSessionRequests.tsx` | Sheikh reviews/accepts/rejects requests | | |
| | `SheikhAvailabilityForm.tsx` | Sheikh sets weekly availability | | |
| | `MySessions.tsx` | Session list with status tabs & Pay Now | | |
| | `StripePaymentModal.tsx` | Stripe card payment UI | | |
| | `WaitingRoom.tsx` | Pre-session countdown & status polling | | |
| | `LiveSession.tsx` | WebRTC video, chat, notes | | |
| | `SessionReport.tsx` | Post-session review & rating | | |
| --- | |
| ## API Endpoints Reference | |
| ### Student | |
| | Method | Endpoint | Description | | |
| |---|---|---| | |
| | POST | `/api/student/sessions` | Book session | | |
| | GET | `/api/student/sessions` | List sessions | | |
| | GET | `/api/student/sessions/{id}` | Get session details | | |
| | POST | `/api/student/sessions/{id}/join` | Record student joined | | |
| | POST | `/api/student/sessions/{id}/leave` | Record student left | | |
| ### Sheikh | |
| | Method | Endpoint | Description | | |
| |---|---|---| | |
| | GET | `/api/sheikh/sessions` | List sessions | | |
| | POST | `/api/sheikh/sessions/{id}/accept` | Accept β TOPAY | | |
| | POST | `/api/sheikh/sessions/{id}/reject` | Reject β CANCELLED | | |
| | POST | `/api/sheikh/sessions/{id}/join` | Record sheikh joined | | |
| | POST | `/api/sheikh/sessions/{id}/end` | End session β COMPLETED | | |
| | POST | `/api/sheikh/sessions/{id}/notes` | Save session notes | | |
| ### Availability | |
| | Method | Endpoint | Description | | |
| |---|---|---| | |
| | GET | `/api/sheikh/availability` | Get sheikh's weekly slots | | |
| | PUT | `/api/sheikh/availability` | Update weekly slots | | |
| | GET | `/api/sheikhs/{id}/available-dates` | List available dates (student view) | | |
| | GET | `/api/sheikhs/{id}/available-slots/day` | List slots for a date | | |