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 |