# gryfklapryd/rust-cbt-master architecture

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

- Interactive diagram: https://gitdiagram.com/gryfklapryd/rust-cbt-master
- Repository: https://github.com/gryfklapryd/rust-cbt-master

## Overview

This repository is the central server and administration panel for a distributed computer-based testing system; the desktop exam client is a separate project. The main workflow configures sites, participants, questions, exams and schedules in the admin panel, publishes exam packages for local exam sites, then ingests, grades and reports returned attempts. The graph preserves those stages and the shared question-rendering/grading layer. README documents product capabilities not fully represented in sampled source; links for those unsampled details are limited to supported module paths.

Main entry points: [`apps/server/src/db/client.ts`](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/db/client.ts) (PostgreSQL), [`apps/server/src/app.ts`](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/app.ts) (Fastify API), [`apps/admin/src/App.tsx`](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/App.tsx) (Admin application), [`apps/admin/src/lib/api.ts`](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/lib/api.ts) (Admin API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_admin["Admin panel"]
  node_admin_app["Admin application<br/>[App.tsx]"]
  node_admin_auth["Admin authentication<br/>[auth.tsx]"]
  node_admin_catalog["Sites, participants, users<br/>[Sites.tsx]"]
  node_admin_questions["Banks and questions<br/>[QuestionEditor.tsx]"]
  node_admin_exams["Exams and schedules<br/>[Schedules.tsx]"]
  node_admin_results["Results and grading<br/>[Results.tsx]"]
  node_admin_sync["Sync monitoring<br/>[Sync.tsx]"]
  node_admin_api["Admin API client<br/>[api.ts]"]
end

subgraph group_api["Central API"]
  node_server_app["Fastify API<br/>[app.ts]"]
  node_auth_routes["Login and auth<br/>[auth.ts]"]
  node_catalog_routes["Catalog and sites<br/>[sites.ts]"]
  node_participant_routes["Participants<br/>[participants.ts]"]
  node_question_routes["Banks and questions<br/>[questions.ts]"]
  node_exam_routes["Exams and schedules<br/>[schedules.ts]"]
  node_sync_routes["Site synchronization<br/>[sync.ts]"]
  node_result_routes["Results API<br/>[results.ts]"]
end

subgraph group_exam["Exam processing"]
  node_package_builder["Package builder<br/>[package-builder.ts]"]
  node_ingest["Results ingestion<br/>[results-ingest.ts]"]
  node_grading["Attempt grading<br/>[grading.ts]"]
  node_worker["Queue workers<br/>[worker.ts]"]
end

subgraph group_platform["Shared and infrastructure"]
  node_question_ui["Question renderer<br/>[QuestionView.tsx]"]
  node_shared_grading["Shared grading rules<br/>[grading.ts]"]
  node_database[("PostgreSQL<br/>[client.ts]")]
  node_storage[("S3 object storage<br/>[storage.ts]")]
  node_queue_lib["Queue dispatch<br/>[queue.ts]"]
end

node_admin_actor(("Admin / staff"))
node_site_client(("Local exam site"))

node_admin_actor -->|"uses"| node_admin_app
node_admin_app -->|"checks session"| node_admin_auth
node_admin_app -->|"manages"| node_admin_catalog
node_admin_app -->|"authors"| node_admin_questions
node_admin_app -->|"schedules"| node_admin_exams
node_admin_app -->|"reviews"| node_admin_results
node_admin_app -->|"monitors"| node_admin_sync
node_admin_catalog -->|"requests"| node_admin_api
node_admin_questions -->|"requests"| node_admin_api
node_admin_exams -->|"requests"| node_admin_api
node_admin_results -->|"requests"| node_admin_api
node_admin_sync -->|"requests"| node_admin_api
node_admin_auth -->|"authenticates"| node_admin_api
node_admin_api -->|"HTTP requests"| node_server_app
node_server_app -->|"registers routes"| node_auth_routes
node_server_app -->|"registers routes"| node_catalog_routes
node_server_app -->|"registers routes"| node_participant_routes
node_server_app -->|"registers routes"| node_question_routes
node_server_app -->|"registers routes"| node_exam_routes
node_server_app -->|"registers routes"| node_sync_routes
node_server_app -->|"registers routes"| node_result_routes
node_auth_routes -->|"reads / updates users"| node_database
node_catalog_routes -->|"reads / writes"| node_database
node_participant_routes -->|"reads / writes"| node_database
node_question_routes -->|"reads / writes"| node_database
node_exam_routes -->|"reads / writes"| node_database
node_sync_routes -->|"reads / writes"| node_database
node_result_routes -->|"reads / writes"| node_database
node_admin_questions -->|"previews questions"| node_question_ui
node_site_client -->|"syncs packages / results"| node_sync_routes
node_sync_routes -->|"enqueues processing"| node_queue_lib
node_queue_lib -->|"dispatches jobs"| node_worker
node_worker -->|"runs package jobs"| node_package_builder
node_worker -->|"runs ingest jobs"| node_ingest
node_worker -->|"runs grading jobs"| node_grading
node_package_builder -->|"reads exam data"| node_database
node_package_builder -->|"stores package"| node_storage
node_ingest -->|"reads batch payload"| node_storage
node_ingest -->|"stores attempts"| node_database
node_ingest -->|"enqueues grading"| node_queue_lib
node_grading -->|"reads / updates scores"| node_database
node_grading -->|"uses scoring rules"| node_shared_grading
node_result_routes -->|"dispatches grading"| node_queue_lib

click node_admin_app "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/App.tsx"
click node_admin_auth "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/lib/auth.tsx"
click node_admin_catalog "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Sites.tsx"
click node_admin_questions "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/QuestionEditor.tsx"
click node_admin_exams "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Schedules.tsx"
click node_admin_results "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Results.tsx"
click node_admin_sync "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Sync.tsx"
click node_admin_api "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/lib/api.ts"
click node_server_app "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/app.ts"
click node_auth_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/auth.ts"
click node_catalog_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/sites.ts"
click node_participant_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/participants.ts"
click node_question_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/questions.ts"
click node_exam_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/schedules.ts"
click node_sync_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/sync.ts"
click node_result_routes "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/results.ts"
click node_package_builder "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/services/package-builder.ts"
click node_ingest "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/services/results-ingest.ts"
click node_grading "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/services/grading.ts"
click node_worker "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/worker.ts"
click node_question_ui "https://github.com/gryfklapryd/rust-cbt-master/blob/main/packages/question-ui/src/QuestionView.tsx"
click node_shared_grading "https://github.com/gryfklapryd/rust-cbt-master/blob/main/packages/shared/src/questions/grading.ts"
click node_database "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/db/client.ts"
click node_storage "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/lib/storage.ts"
click node_queue_lib "https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/lib/queue.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_admin_app,node_admin_auth,node_admin_catalog,node_admin_questions,node_admin_exams,node_admin_results,node_admin_sync,node_admin_api toneBlue
class node_server_app,node_auth_routes,node_catalog_routes,node_participant_routes,node_question_routes,node_exam_routes,node_sync_routes,node_result_routes toneAmber
class node_package_builder,node_ingest,node_grading,node_worker toneMint
class node_question_ui,node_shared_grading,node_database,node_storage,node_queue_lib toneRose
class node_admin_actor,node_site_client toneIndigo
```

## Components

### Admin panel

- [Admin application](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/App.tsx): `apps/admin/src/App.tsx`
- [Admin authentication](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/lib/auth.tsx): `apps/admin/src/lib/auth.tsx`
- [Sites, participants, users](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Sites.tsx): `apps/admin/src/pages/Sites.tsx`
- [Banks and questions](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/QuestionEditor.tsx): `apps/admin/src/pages/QuestionEditor.tsx`
- [Exams and schedules](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Schedules.tsx): `apps/admin/src/pages/Schedules.tsx`
- [Results and grading](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Results.tsx): `apps/admin/src/pages/Results.tsx`
- [Sync monitoring](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/pages/Sync.tsx): `apps/admin/src/pages/Sync.tsx`
- [Admin API client](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/admin/src/lib/api.ts): `apps/admin/src/lib/api.ts`

### Central API

- [Fastify API](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/app.ts): `apps/server/src/app.ts`
- [Login and auth](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/auth.ts): `apps/server/src/modules/auth.ts`
- [Catalog and sites](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/sites.ts): `apps/server/src/modules/sites.ts`
- [Participants](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/participants.ts): `apps/server/src/modules/participants.ts`
- [Banks and questions](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/questions.ts): `apps/server/src/modules/questions.ts`
- [Exams and schedules](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/schedules.ts): `apps/server/src/modules/schedules.ts`
- [Site synchronization](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/sync.ts): `apps/server/src/modules/sync.ts`
- [Results API](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/modules/results.ts): `apps/server/src/modules/results.ts`

### Exam processing

- [Package builder](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/services/package-builder.ts): `apps/server/src/services/package-builder.ts`
- [Results ingestion](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/services/results-ingest.ts): `apps/server/src/services/results-ingest.ts`
- [Attempt grading](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/services/grading.ts): `apps/server/src/services/grading.ts`
- [Queue workers](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/worker.ts): `apps/server/src/worker.ts`

### Shared and infrastructure

- [Question renderer](https://github.com/gryfklapryd/rust-cbt-master/blob/main/packages/question-ui/src/QuestionView.tsx): `packages/question-ui/src/QuestionView.tsx`
- [Shared grading rules](https://github.com/gryfklapryd/rust-cbt-master/blob/main/packages/shared/src/questions/grading.ts): `packages/shared/src/questions/grading.ts`
- [PostgreSQL](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/db/client.ts): `apps/server/src/db/client.ts`
- [S3 object storage](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/lib/storage.ts): `apps/server/src/lib/storage.ts`
- [Queue dispatch](https://github.com/gryfklapryd/rust-cbt-master/blob/main/apps/server/src/lib/queue.ts): `apps/server/src/lib/queue.ts`

### Other components

- **Admin / staff**
- **Local exam site**

## Connections

- Admin / staff → Admin application: uses
- Admin application → Admin authentication: checks session
- Admin application → Sites, participants, users: manages
- Admin application → Banks and questions: authors
- Admin application → Exams and schedules: schedules
- Admin application → Results and grading: reviews
- Admin application → Sync monitoring: monitors
- Sites, participants, users → Admin API client: requests
- Banks and questions → Admin API client: requests
- Exams and schedules → Admin API client: requests
- Results and grading → Admin API client: requests
- Sync monitoring → Admin API client: requests
- Admin authentication → Admin API client: authenticates
- Admin API client → Fastify API: HTTP requests
- Fastify API → Login and auth: registers routes
- Fastify API → Catalog and sites: registers routes
- Fastify API → Participants: registers routes
- Fastify API → Banks and questions: registers routes
- Fastify API → Exams and schedules: registers routes
- Fastify API → Site synchronization: registers routes
- Fastify API → Results API: registers routes
- Login and auth → PostgreSQL: reads / updates users
- Catalog and sites → PostgreSQL: reads / writes
- Participants → PostgreSQL: reads / writes
- Banks and questions → PostgreSQL: reads / writes
- Exams and schedules → PostgreSQL: reads / writes
- Site synchronization → PostgreSQL: reads / writes
- Results API → PostgreSQL: reads / writes
- Banks and questions → Question renderer: previews questions
- Local exam site → Site synchronization: syncs packages / results
- Site synchronization → Queue dispatch: enqueues processing
- Queue dispatch → Queue workers: dispatches jobs
- Queue workers → Package builder: runs package jobs
- Queue workers → Results ingestion: runs ingest jobs
- Queue workers → Attempt grading: runs grading jobs
- Package builder → PostgreSQL: reads exam data
- Package builder → S3 object storage: stores package
- Results ingestion → S3 object storage: reads batch payload
- Results ingestion → PostgreSQL: stores attempts
- Results ingestion → Queue dispatch: enqueues grading
- Attempt grading → PostgreSQL: reads / updates scores
- Attempt grading → Shared grading rules: uses scoring rules
- Results API → Queue dispatch: dispatches grading
