# nifemiosadare26-glitch/lasustech-cbt architecture

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

- Interactive diagram: https://gitdiagram.com/nifemiosadare26-glitch/lasustech-cbt
- Repository: https://github.com/nifemiosadare26-glitch/lasustech-cbt

## Overview

This is a LASUSTECH computer-based testing web application. Administrators manage users, courses, schedules, sessions, results and live invigilation; lecturers create exams and questions, import content and review results; students and public candidates take exams and view results. Page excerpts and the source index show the frontend’s API-backed workflows, but the backend implementation and several route details were not provided, so those internals are represented only where evidence supports them.

Main entry points: [`lib/apiClient.ts`](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/apiClient.ts) (API client), [`app/(public)/exam/[slug]/attempt/page.tsx`](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(public)/exam/%5Bslug%5D/attempt/page.tsx) (Public exam attempt), [`app/(lecturer)/lecturer`](https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/app/(lecturer)/lecturer) (Lecturer workspace), [`lib/useApi.ts`](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/useApi.ts) (API query hook)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_admin["Administration"]
  node_admin_pages["Admin operations"]
  node_admin_dashboard["Admin dashboard<br/>[page.tsx]"]
  node_admin_users["User management<br/>[page.tsx]"]
  node_admin_schedule["Scheduling<br/>[page.tsx]"]
end

subgraph group_lecturer["Lecturer tools"]
  node_lecturer_pages["Lecturer workspace"]
  node_exam_authoring["Exam authoring<br/>[page.tsx]"]
  node_question_bank["Question bank<br/>[page.tsx]"]
  node_content_import["Content import<br/>[page.tsx]"]
end

subgraph group_exam["Candidate exams"]
  node_student_workspace["Student workspace<br/>[page.tsx]"]
  node_student_exam["Student exam attempt<br/>[page.tsx]"]
  node_public_exam["Public exam attempt<br/>[page.tsx]"]
  node_student_results["Student results<br/>[page.tsx]"]
end

subgraph group_shared["Shared frontend"]
  node_api_client["API client<br/>[apiClient.ts]"]
  node_query_hook["API query hook<br/>[useApi.ts]"]
  node_action_hook["Mutation hook<br/>[useAction.ts]"]
  node_realtime["Realtime client<br/>[realtime.ts]"]
  node_public_client["Public exam client"]
  node_candidate_modal["Candidate participation"]
  node_question_rendering["Question rendering"]
  node_math_text["Math text rendering<br/>[math-text.tsx]"]
  node_design_system["UI components"]
end

node_backend{{"Application API"}}
node_admin_user(("Administrator"))
node_lecturer_user(("Lecturer"))
node_candidate(("Candidate"))

node_admin_user -.->|"opens"| node_admin_dashboard
node_admin_user -.->|"manages"| node_admin_pages
node_lecturer_user -.->|"opens"| node_lecturer_pages
node_lecturer_pages -->|"creates exams"| node_exam_authoring
node_lecturer_pages -->|"opens import"| node_content_import
node_lecturer_pages -->|"opens bank"| node_question_bank
node_candidate -.->|"opens"| node_student_workspace
node_candidate -.->|"takes exam"| node_public_exam
node_student_workspace -.->|"opens exam"| node_student_exam
node_student_exam -->|"requests exam data"| node_api_client
node_student_exam -->|"uses updates"| node_realtime
node_public_exam -->|"requests data"| node_api_client
node_public_exam -->|"uses client"| node_public_client
node_public_exam -->|"uses updates"| node_realtime
node_public_exam -->|"renders diagrams"| node_question_rendering
node_public_exam -->|"renders math"| node_math_text
node_student_results -->|"loads results"| node_query_hook
node_student_results -.->|"requests results"| node_backend
node_admin_dashboard -->|"opens participation"| node_candidate_modal
node_admin_dashboard -->|"loads dashboard"| node_query_hook
node_admin_users -->|"loads users"| node_query_hook
node_admin_users -->|"exports users"| node_api_client
node_admin_schedule -->|"requests schedule"| node_api_client
node_exam_authoring -->|"submits exam"| node_api_client
node_question_bank -->|"renders diagrams"| node_question_rendering
node_question_bank -->|"renders math"| node_math_text
node_query_hook -->|"fetches through"| node_api_client
node_action_hook -->|"sends mutations"| node_api_client
node_action_hook -.->|"submits changes"| node_backend
node_api_client -->|"sends HTTP requests"| node_backend

click node_admin_pages "https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/app/(admin)/admin"
click node_admin_dashboard "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(admin)/admin/page.tsx"
click node_admin_users "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(admin)/admin/users/page.tsx"
click node_admin_schedule "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(admin)/admin/schedule/page.tsx"
click node_lecturer_pages "https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/app/(lecturer)/lecturer"
click node_exam_authoring "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(lecturer)/lecturer/exams/new/page.tsx"
click node_question_bank "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(lecturer)/lecturer/questions/page.tsx"
click node_content_import "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(lecturer)/lecturer/import/page.tsx"
click node_student_workspace "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(student)/student/page.tsx"
click node_student_exam "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(student)/student/exam/%5Bid%5D/page.tsx"
click node_public_exam "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(public)/exam/%5Bslug%5D/attempt/page.tsx"
click node_student_results "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(student)/student/results/page.tsx"
click node_api_client "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/apiClient.ts"
click node_query_hook "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/useApi.ts"
click node_action_hook "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/useAction.ts"
click node_realtime "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/realtime.ts"
click node_public_client "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/publicExamClient.ts"
click node_candidate_modal "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/components/exam/candidate-participation-modal.tsx"
click node_question_rendering "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/components/question/diagram-renderer.tsx"
click node_math_text "https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/components/question/math-text.tsx"
click node_design_system "https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/components/ui"

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_admin_pages,node_admin_dashboard,node_admin_users,node_admin_schedule toneBlue
class node_lecturer_pages,node_exam_authoring,node_question_bank,node_content_import toneAmber
class node_student_workspace,node_student_exam,node_public_exam,node_student_results,node_backend toneMint
class node_api_client,node_query_hook,node_action_hook,node_realtime,node_public_client,node_candidate_modal,node_question_rendering,node_math_text,node_design_system toneRose
class node_admin_user,node_lecturer_user,node_candidate toneIndigo
```

## Components

### Administration

- [Admin operations](https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/app/(admin)/admin): `app/(admin)/admin`
- [Admin dashboard](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(admin)/admin/page.tsx): `app/(admin)/admin/page.tsx`
- [User management](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(admin)/admin/users/page.tsx): `app/(admin)/admin/users/page.tsx`
- [Scheduling](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(admin)/admin/schedule/page.tsx): `app/(admin)/admin/schedule/page.tsx`

### Lecturer tools

- [Lecturer workspace](https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/app/(lecturer)/lecturer): `app/(lecturer)/lecturer`
- [Exam authoring](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(lecturer)/lecturer/exams/new/page.tsx): `app/(lecturer)/lecturer/exams/new/page.tsx`
- [Question bank](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(lecturer)/lecturer/questions/page.tsx): `app/(lecturer)/lecturer/questions/page.tsx`
- [Content import](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(lecturer)/lecturer/import/page.tsx): `app/(lecturer)/lecturer/import/page.tsx`

### Candidate exams

- [Student workspace](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(student)/student/page.tsx): `app/(student)/student/page.tsx`
- [Student exam attempt](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(student)/student/exam/%5Bid%5D/page.tsx): `app/(student)/student/exam/[id]/page.tsx`
- [Public exam attempt](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(public)/exam/%5Bslug%5D/attempt/page.tsx): `app/(public)/exam/[slug]/attempt/page.tsx`
- [Student results](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/app/(student)/student/results/page.tsx): `app/(student)/student/results/page.tsx`

### Shared frontend

- [API client](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/apiClient.ts): `lib/apiClient.ts`
- [API query hook](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/useApi.ts): `lib/useApi.ts`
- [Mutation hook](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/useAction.ts): `lib/useAction.ts`
- [Realtime client](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/realtime.ts): `lib/realtime.ts`
- [Public exam client](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/lib/publicExamClient.ts): `lib/publicExamClient.ts`
- [Candidate participation](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/components/exam/candidate-participation-modal.tsx): `components/exam/candidate-participation-modal.tsx`
- [Question rendering](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/components/question/diagram-renderer.tsx): `components/question/diagram-renderer.tsx`
- [Math text rendering](https://github.com/nifemiosadare26-glitch/lasustech-cbt/blob/main/components/question/math-text.tsx): `components/question/math-text.tsx`
- [UI components](https://github.com/nifemiosadare26-glitch/lasustech-cbt/tree/main/components/ui): `components/ui`

### Other components

- **Application API**
- **Administrator**
- **Lecturer**
- **Candidate**

## Connections

- Administrator → Admin dashboard: opens
- Administrator → Admin operations: manages
- Lecturer → Lecturer workspace: opens
- Lecturer workspace → Exam authoring: creates exams (evidence: `app/(lecturer)/lecturer/page.tsx`)
- Lecturer workspace → Content import: opens import (evidence: `app/(lecturer)/lecturer/page.tsx`)
- Lecturer workspace → Question bank: opens bank (evidence: `app/(lecturer)/lecturer/page.tsx`)
- Candidate → Student workspace: opens
- Candidate → Public exam attempt: takes exam
- Student workspace → Student exam attempt: opens exam
- Student exam attempt → API client: requests exam data (evidence: `app/(student)/student/exam/[id]/page.tsx`)
- Student exam attempt → Realtime client: uses updates (evidence: `app/(student)/student/exam/[id]/page.tsx`)
- Public exam attempt → API client: requests data (evidence: `app/(public)/exam/[slug]/attempt/page.tsx`)
- Public exam attempt → Public exam client: uses client (evidence: `app/(public)/exam/[slug]/attempt/page.tsx`)
- Public exam attempt → Realtime client: uses updates (evidence: `app/(public)/exam/[slug]/attempt/page.tsx`)
- Public exam attempt → Question rendering: renders diagrams (evidence: `app/(public)/exam/[slug]/attempt/page.tsx`)
- Public exam attempt → Math text rendering: renders math (evidence: `app/(public)/exam/[slug]/attempt/page.tsx`)
- Student results → API query hook: loads results (evidence: `app/(student)/student/results/page.tsx`)
- Student results → Application API: requests results
- Admin dashboard → Candidate participation: opens participation (evidence: `app/(admin)/admin/page.tsx`)
- Admin dashboard → API query hook: loads dashboard (evidence: `app/(admin)/admin/page.tsx`)
- User management → API query hook: loads users (evidence: `app/(admin)/admin/users/page.tsx`)
- User management → API client: exports users (evidence: `app/(admin)/admin/users/page.tsx`)
- Scheduling → API client: requests schedule (evidence: `app/(admin)/admin/schedule/page.tsx`)
- Exam authoring → API client: submits exam (evidence: `app/(lecturer)/lecturer/exams/new/page.tsx`)
- Question bank → Question rendering: renders diagrams (evidence: `app/(lecturer)/lecturer/questions/page.tsx`)
- Question bank → Math text rendering: renders math (evidence: `app/(lecturer)/lecturer/questions/page.tsx`)
- API query hook → API client: fetches through (evidence: `lib/useApi.ts`)
- Mutation hook → API client: sends mutations (evidence: `lib/useAction.ts`)
- Mutation hook → Application API: submits changes
- API client → Application API: sends HTTP requests (evidence: `lib/apiClient.ts`)
