1.6 KiB
1.6 KiB
Minimal Architecture (Django + Angular)
Goals
- Read exam JSON from
input/, render online, autosave progress, submit, and write bundled JSON tooutput/. - Keep logic simple, deterministic, and file-backed.
Components
- Frontend: Angular SPA (exam UI, autosave, timer, resume)
- Backend: Django REST API (file I/O, attempt state, publish/finish checks)
- Storage: File system folders (
input/,attempts/,output/,progress/,manifest.json) - Web: Nginx (serve Angular, proxy
/api/to Django)
Data Flow
- Angular requests
/api/exams→ Django lists published exams by readingmanifest.json+input/. - Start/resume attempt:
/api/exams/{examId}/attempt→ Django reads/writesattempts/and returns current attempt JSON. - Autosave: PUT
/api/attempts/{attemptId}→ backend persists answers and updatesprogress/. - Submit: POST
/api/attempts/{attemptId}/submit→ backend writesoutput/{examId}_{attemptId}.jsonwith{ exam, attempt }and marks finished.
Minimal State Machine
- draft → published → in_progress → submitted → finished
Files & Folders
input/— source exam JSON filesattempts/{userId}/{examId}/{attemptId}.json— current attemptoutput/{examId}_{attemptId}.json— final bundle{ exam, attempt }progress/{userId}.json— per-user progress snapshotmanifest.json— registry of exams (published flags) and per-user finished set
Security (minimal)
- Auth: simple token cookie, userId in session
- CORS/CSRF configured for Angular origin
- No external services required
Observability
- Request logs, error logs
- Autosave frequency metric (client)