Admin (Dashboard) API Flows
JWT audience: snr_dash.
Save review type
Section titled “Save review type”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
Dash->>Worker: POST /admin/save-reviewtypes
Worker->>D1: check duplicate active names
alt duplicate
Worker-->>Dash: 409 Conflict
else ok
Worker->>D1: INSERT review_types
Worker-->>Dash: { review_type_id }
end
Assign coordinator
Section titled “Assign coordinator”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
participant PX as Persistence
participant Sock as Socket Hub
Dash->>Worker: POST /admin/assign-coordinator
Worker->>D1: UPDATE case_coordinator_id + payment_pending
Worker->>D1: SET payment_url, total_amount
Worker->>D1: INSERT second_opinions (is_coordinator=1)
Worker->>D1: UPSERT sticky_header_cards (Proceed to pay)
Worker->>D1: INSERT case_status_history milestones
Worker->>D1: INSERT sop_activity
Worker->>PX: fetch coordinator profile
Worker->>Sock: notify coordinator + patient
Worker-->>Dash: { status: 1000 }
List review cases (dashboard)
Section titled “List review cases (dashboard)”sequenceDiagram participant Dash as Admin Dashboard participant Worker as second_opinion participant D1 as D1 participant PX as Persistence Dash->>Worker: POST /admin/list-review-cases Worker->>D1: SELECT with filters (status, date, payment) Worker->>PX: enrich with patient/doctor names Worker-->>Dash: paginated case list
Review case details
Section titled “Review case details”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
participant PX as Persistence
Dash->>Worker: POST /admin/review-case-details { case_id }
Worker->>D1: SELECT review_cases + review_type + disease_category
Worker->>D1: SELECT second_opinions + case_status_history
Worker->>D1: LOAD sop_doctors (coordinator + assignees)
Worker->>PX: fetch patient profile
Worker->>PX: fetch PriceInfo, invoices, PaymentInfo
Worker-->>Dash: full case detail, tracking timeline, financials
Reject case
Section titled “Reject case”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
Dash->>Worker: POST /admin/reject-reviewcase
Worker->>D1: UPDATE status → rejected, reject_reason
Worker->>D1: INSERT case_status_history (rejected)
Worker->>D1: INSERT sop_activity
Worker-->>Dash: { status: 1000 }
Dashboard overview
Section titled “Dashboard overview”sequenceDiagram participant Dash as Admin Dashboard participant Worker as second_opinion participant D1 as D1 Dash->>Worker: POST /admin/dashboard-overview Note over Worker: Riyadh timezone period bounds Worker->>D1: aggregate counts by status/period Worker-->>Dash: overview metrics
Cancel case (admin)
Section titled “Cancel case (admin)”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
participant PX as Persistence
participant Sock as Socket Hub
Dash->>Worker: POST /admin/cancel-review-case { case_id, reason }
Worker->>D1: validate case status
alt payment was taken
Worker->>PX: post refund to Payment Hub
end
Worker->>D1: UPDATE status → cancelled
Worker->>D1: INSERT case_status_history + sop_activity
Worker->>Sock: notify patient
Worker-->>Dash: { status: 1000 }
Edit coordinator (before payment)
Section titled “Edit coordinator (before payment)”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
Dash->>Worker: POST /admin/edit-coordinator { case_id, doctor_id }
Note over Worker: Only while status = payment_pending
Worker->>D1: UPDATE case_coordinator_id
Worker->>D1: deactivate old second_opinions coordinator row
Worker->>D1: INSERT new coordinator second_opinions row
Worker->>D1: INSERT sop_activity
Worker-->>Dash: { status: 1000 }
Verify case and employee
Section titled “Verify case and employee”sequenceDiagram
participant Dash as Admin Dashboard
participant Worker as second_opinion
participant D1 as D1
Dash->>Worker: POST /admin/verify-case-and-emp { case_id, emp_id }
Worker->>D1: check case exists
Worker->>D1: check sop_doctors / coordinator eligibility
Worker-->>Dash: { valid: true/false }
Configuration endpoints
Section titled “Configuration endpoints”Admin setup CRUD (no sequence diagrams — straightforward D1 operations). See API Reference for request/response shapes.
| Area | Endpoints |
|---|---|
| Review types | save-reviewtypes, list-reviewtypes, reviewtype-details, edit-reviewtypes, update-status, fetch-types-and-diseases |
| Disease categories | save-disease-categories, list-disease-categories, disease-category-details, disease-category-edit, disease-category-update-status, map-doctors, list-mapped-doctors, mapped-doctors-details, list-mapped-department |
| Case coordinators | save-case-coordinators, list-case-coordinators, case-coordinator-details, edit-case-coordinators, coordinator-list, list-assign-coordinator-doctors |