# karunya-dev/online-quiz architecture

> Architecture diagram of the GitHub repository karunya-dev/online-quiz, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/karunya-dev/online-quiz
- Repository: https://github.com/karunya-dev/online-quiz

## Overview

Online Quiz System is a role-based assessment platform: teachers prepare quizzes and classes, assign assessments or host sessions; students join, submit answers, and review results; administrators manage users and monitor system performance. The frontend provides role-oriented pages and an API client, while the Express backend handles authentication, quiz/session routes, and student-specific workflows backed by PostgreSQL. Feature pages and several backend capabilities are documented, but their individual frontend-to-endpoint wiring is not shown, so those links are documented rather than inferred from imports.

Main entry points: [`backend/src/server.ts`](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/server.ts) (Express API), [`backend/src/db.ts`](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/db.ts) (PostgreSQL access), [`backend/src/controllers/studentController.ts`](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/controllers/studentController.ts) (Student routes), [`backend/src/auth.ts`](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/auth.ts) (JWT authentication)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web experience"]
  node_teacher["Teacher workspace<br/>[teacher.vue]"]
  node_admin["Admin console<br/>[admin.vue]"]
  node_student["Student workspace<br/>[student.vue]"]
  node_authui["Sign in and signup<br/>[useApi.ts]"]
  node_api_client["API client<br/>[useApi.ts]"]
  node_access["Role access<br/>[useRoleAccess.ts]"]
  node_analytics_ui["Analytics and reports<br/>[analytics.vue]"]
  node_settings["System settings<br/>[settings.vue]"]
end

subgraph group_teaching["Teaching tools"]
  node_question_bank["Question bank<br/>[question-bank.vue]"]
  node_classes["Class management<br/>[classes.vue]"]
  node_assignments["Assignments<br/>[assignments.vue]"]
end

subgraph group_participation["Assessment participation"]
  node_live_ui["Live session play<br/>[&#91;sessionId&#93;.vue]"]
  node_join["Join session<br/>[join.vue]"]
  node_results_ui["Results views<br/>[results.vue]"]
  node_leaderboard_ui["Leaderboard view<br/>[leaderboard.vue]"]
end

subgraph group_backend["API and access"]
  node_api["Express API<br/>[server.ts]"]
  node_student_routes["Student routes"]
  node_student_service["Student workflow service<br/>[studentService.ts]"]
  node_auth["JWT authentication<br/>[auth.ts]"]
  node_config["Runtime configuration<br/>[config.ts]"]
end

subgraph group_storage["Persistence"]
  node_db[("PostgreSQL access<br/>[db.ts]")]
end

node_postgres[("PostgreSQL")]
node_teachers(("Teachers"))
node_students(("Students"))
node_admins(("Administrators"))

node_teachers -->|"manage teaching"| node_teacher
node_admins -->|"manage system"| node_admin
node_students -->|"track performance"| node_student
node_teachers -->|"create questions"| node_question_bank
node_teachers -->|"manage classes"| node_classes
node_teachers -->|"assign quizzes"| node_assignments
node_students -->|"join quizzes"| node_join
node_students -->|"submit responses"| node_live_ui
node_students -->|"view results"| node_results_ui
node_teachers -->|"review performance"| node_analytics_ui
node_admins -->|"configure system"| node_settings
node_authui -->|"send credentials"| node_api_client
node_api_client -->|"HTTP requests"| node_api
node_student -->|"check roles"| node_access
node_api -->|"authenticate routes"| node_auth
node_api -->|"register routes"| node_student_routes
node_student_routes -->|"guard requests"| node_auth
node_student_routes -->|"invoke workflows"| node_student_service
node_student_service -->|"query data"| node_db
node_auth -->|"load user"| node_db
node_api -->|"initialize schema"| node_db
node_db -->|"read connection settings"| node_config
node_db -->|"query database"| node_postgres
node_join -.->|"join session"| node_api
node_live_ui -.->|"submit answers"| node_api
node_question_bank -.->|"manage questions"| node_api
node_classes -.->|"manage classes"| node_api
node_assignments -.->|"manage assignments"| node_api
node_api -.->|"provide reports"| node_analytics_ui
node_api -.->|"provide rankings"| node_leaderboard_ui

click node_teacher "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/teacher.vue"
click node_admin "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/admin.vue"
click node_student "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/student.vue"
click node_authui "https://github.com/karunya-dev/online-quiz/blob/main/frontend/composables/useApi.ts"
click node_api_client "https://github.com/karunya-dev/online-quiz/blob/main/frontend/composables/useApi.ts"
click node_access "https://github.com/karunya-dev/online-quiz/blob/main/frontend/composables/useRoleAccess.ts"
click node_question_bank "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/question-bank.vue"
click node_classes "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/classes.vue"
click node_assignments "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/assignments.vue"
click node_live_ui "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/play/%5BsessionId%5D.vue"
click node_join "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/join.vue"
click node_results_ui "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/results.vue"
click node_leaderboard_ui "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/leaderboard.vue"
click node_analytics_ui "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/analytics.vue"
click node_settings "https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/settings.vue"
click node_api "https://github.com/karunya-dev/online-quiz/blob/main/backend/src/server.ts"
click node_student_routes "https://github.com/karunya-dev/online-quiz/blob/main/backend/src/controllers/studentController.ts"
click node_student_service "https://github.com/karunya-dev/online-quiz/blob/main/backend/src/services/studentService.ts"
click node_auth "https://github.com/karunya-dev/online-quiz/blob/main/backend/src/auth.ts"
click node_config "https://github.com/karunya-dev/online-quiz/blob/main/backend/src/config.ts"
click node_db "https://github.com/karunya-dev/online-quiz/blob/main/backend/src/db.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_teacher,node_admin,node_student,node_authui,node_api_client,node_access,node_analytics_ui,node_settings toneBlue
class node_question_bank,node_classes,node_assignments,node_postgres toneAmber
class node_live_ui,node_join,node_results_ui,node_leaderboard_ui toneMint
class node_api,node_student_routes,node_student_service,node_auth,node_config toneRose
class node_db,node_teachers,node_students,node_admins toneIndigo
```

## Components

### Web experience

- [Teacher workspace](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/teacher.vue): `frontend/pages/teacher.vue`
- [Admin console](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/admin.vue): `frontend/pages/admin.vue`
- [Student workspace](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/student.vue): `frontend/pages/student.vue`
- [Sign in and signup](https://github.com/karunya-dev/online-quiz/blob/main/frontend/composables/useApi.ts): `frontend/composables/useApi.ts`
- [API client](https://github.com/karunya-dev/online-quiz/blob/main/frontend/composables/useApi.ts): `frontend/composables/useApi.ts`
- [Role access](https://github.com/karunya-dev/online-quiz/blob/main/frontend/composables/useRoleAccess.ts): `frontend/composables/useRoleAccess.ts`
- [Analytics and reports](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/analytics.vue): `frontend/pages/analytics.vue`
- [System settings](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/settings.vue): `frontend/pages/settings.vue`

### Teaching tools

- [Question bank](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/question-bank.vue): `frontend/pages/question-bank.vue`
- [Class management](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/classes.vue): `frontend/pages/classes.vue`
- [Assignments](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/assignments.vue): `frontend/pages/assignments.vue`

### Assessment participation

- [Live session play](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/play/%5BsessionId%5D.vue): `frontend/pages/play/[sessionId].vue`
- [Join session](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/join.vue): `frontend/pages/join.vue`
- [Results views](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/results.vue): `frontend/pages/results.vue`
- [Leaderboard view](https://github.com/karunya-dev/online-quiz/blob/main/frontend/pages/leaderboard.vue): `frontend/pages/leaderboard.vue`

### API and access

- [Express API](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/server.ts): `backend/src/server.ts`
- [Student routes](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/controllers/studentController.ts): `backend/src/controllers/studentController.ts`
- [Student workflow service](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/services/studentService.ts): `backend/src/services/studentService.ts`
- [JWT authentication](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/auth.ts): `backend/src/auth.ts`
- [Runtime configuration](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/config.ts): `backend/src/config.ts`

### Persistence

- [PostgreSQL access](https://github.com/karunya-dev/online-quiz/blob/main/backend/src/db.ts): `backend/src/db.ts`

### Other components

- **PostgreSQL**
- **Teachers**
- **Students**
- **Administrators**

## Connections

- Teachers → Teacher workspace: manage teaching (evidence: `README.md`)
- Administrators → Admin console: manage system (evidence: `README.md`)
- Students → Student workspace: track performance (evidence: `README.md`)
- Teachers → Question bank: create questions (evidence: `README.md`)
- Teachers → Class management: manage classes (evidence: `README.md`)
- Teachers → Assignments: assign quizzes (evidence: `README.md`)
- Students → Join session: join quizzes (evidence: `README.md`)
- Students → Live session play: submit responses (evidence: `README.md`)
- Students → Results views: view results (evidence: `README.md`)
- Teachers → Analytics and reports: review performance (evidence: `README.md`)
- Administrators → System settings: configure system (evidence: `README.md`)
- Sign in and signup → API client: send credentials (evidence: `frontend/composables/useApi.ts`)
- API client → Express API: HTTP requests (evidence: `README.md`)
- Student workspace → Role access: check roles (evidence: `frontend/composables/useRoleAccess.ts`)
- Express API → JWT authentication: authenticate routes (evidence: `backend/src/server.ts`)
- Express API → Student routes: register routes (evidence: `backend/src/server.ts`)
- Student routes → JWT authentication: guard requests (evidence: `backend/src/controllers/studentController.ts`)
- Student routes → Student workflow service: invoke workflows (evidence: `backend/src/controllers/studentController.ts`)
- Student workflow service → PostgreSQL access: query data (evidence: `backend/src/services/studentService.ts`)
- JWT authentication → PostgreSQL access: load user (evidence: `backend/src/auth.ts`)
- Express API → PostgreSQL access: initialize schema (evidence: `backend/src/server.ts`)
- PostgreSQL access → Runtime configuration: read connection settings (evidence: `backend/src/db.ts`)
- PostgreSQL access → PostgreSQL: query database (evidence: `backend/src/db.ts`)
- Join session → Express API: join session (evidence: `README.md`)
- Live session play → Express API: submit answers (evidence: `README.md`)
- Question bank → Express API: manage questions (evidence: `README.md`)
- Class management → Express API: manage classes (evidence: `README.md`)
- Assignments → Express API: manage assignments (evidence: `README.md`)
- Express API → Analytics and reports: provide reports (evidence: `README.md`)
- Express API → Leaderboard view: provide rankings (evidence: `README.md`)
