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 |