Quran_Tech_Server / docs /session-workflow.md
aboalaa147's picture
Initial deployment
eb6a2f9
|
Raw
History Blame Contribute Delete
7.58 kB

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