API Session
Endpoint lifecycle sesi ujian - create, next_item (planned), answer (planned), complete.
API: Session
Source:
backend/app/routers/sessions.pySchemas:backend/app/schemas/session.py
Lifecycle sesi ujian siswa. Sebagian endpoint di sini masih planned karena berkaitan langsung dengan transisi ke Pola B (1-AJAX-per-soal).
Diagram Lifecycle (Visi Pola B)
flowchart TD
A["POST /session/ create"] --> B["status: created"]
B --> C["POST /session/id/next_item"]
C --> D["status: in_progress, current_item di-set"]
D --> E["POST /session/id/answer"]
E --> F{terminasi?}
F -->|"tidak, masih ada soal"| C
F -->|"ya, SE cukup atau max items"| G["POST /session/id/complete"]
G --> H["status: completed"]
H --> I["return NM, NN, theta"]
🚧 Endpoint
next_itemdananswerbelum ada — lihat Gap Analysis Gap 1 & 2.
Endpoint Reference
✅ POST /api/v1/session/ — Create Session
Implemented. Buat sesi baru untuk attempt siswa.
Response 201 Created:
Validasi:
wp_user_idharus match dengan token owner (untuk rolestudent)tryout_idharus exists di website tersebutsession_idharus unique (kalau ada →409 Conflict)
Field entitlement: optional, hanya metadata untuk audit. App tidak enforce quota (lihat Integrasi Sejoli).
✅ GET /api/v1/session/{session_id} — Get Session
Implemented. Ambil detail sesi (status, skor kalau sudah complete).
Response 200 OK:
🚧 POST /api/v1/session/{session_id}/next_item — Get Next Question
Planned — lihat Gap Analysis Gap 1.
Endpoint kritis untuk Pola B. Sejoli call ini setiap kali siswa klik "Next" untuk dapat soal berikutnya.
Response 200 OK (proposed):
Response saat sesi selesai:
Aturan:
- Idempotent — double-click harus return item yang sama (Gap 5)
- Return
item: null+should_terminate: truekalau SE sudah cukup - Menerapkan algoritma
cat_selection.get_next_item()(sudah ada di service layer)
🚧 POST /api/v1/session/{session_id}/answer — Submit Single Answer
Planned — lihat Gap Analysis Gap 2.
Submit 1 jawaban, simpan ke UserAnswer, update theta real-time.
Response 200 OK (proposed):
Aturan:
item_idharus matchcurrent_item_iddi session (Gap 6)- Jika mode
irt/hybrid: update theta real-time viairt_calibration.update_theta_after_response() - Jika mode
ctt:thetadantheta_sereturnnull
⚠️ POST /api/v1/session/{session_id}/complete — Complete Session
Implemented (Pola A) — needs refactor for Pola B — lihat Gap Analysis Gap 3.
Pola A (saat ini)
Menerima batch jawaban di akhir ujian:
Cocok untuk integrasi Sejoli saat ini (Pola A — pre-render semua soal).
Pola B (target setelah refactor)
Hanya menerima signal "selesai", tidak terima jawaban (karena sudah tersimpan via /answer):
Behavior baru:
- Validasi minimal 1 jawaban tersimpan di
UserAnswer - Hitung skor final dari
UserAnswer(bukan dari request body) - Untuk mode
irt/hybrid: theta sudah real-time, tinggal ambil nilai terakhir - Update Session status →
completed - Update
TryoutStatsinkremental
Backward compatibility: butuh feature flag atau versioning selama transisi.
State Machine Session
🚧 Planned — lihat Gap Analysis Gap 4.
Validasi Endpoint (Planned)
Bacaan Lanjutan
- API → Adaptive — endpoint CAT khusus (alternate interface)
- Modul → CAT Selection — algoritma pemilihan soal
- Integrasi → Sejoli Tryout — alur integrasi end-to-end
- Gap Analysis — detail gap & rencana implementasi
Last updated Jul 25, 2026