# ruur31337/nmc-lab architecture

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

- Interactive diagram: https://gitdiagram.com/ruur31337/nmc-lab
- Repository: https://github.com/ruur31337/nmc-lab

## Overview

Northern Metro College Lab is a collection of four independently presented campus web applications: a public college website, Academy learning portal, Admission Portal, and Registrar System. The documented user journeys include browsing college information, using Academy services, applying to and checking admission status, and submitting or tracking registrar document requests; staff also manage registrar requests. The graph captures these domains and their evidenced runtime relationships. Admission route behavior and some registrar workflows are represented at subsystem level; links between apps are shown only where documented.

Main entry points: [`academy/server.js`](https://github.com/ruur31337/nmc-lab/blob/main/academy/server.js) (Academy server), [`academy/db/init.js`](https://github.com/ruur31337/nmc-lab/blob/main/academy/db/init.js) (Academy data), [`main-web/www/index.php`](https://github.com/ruur31337/nmc-lab/blob/main/main-web/www/index.php) (College pages), [`registrar/www/includes/db.php`](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/includes/db.php) (Registrar database)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_main["Public Website"]
  node_main_site["College pages<br/>[index.php]"]
  node_careers["Careers page<br/>[careers.php]"]
end

subgraph group_academy["Academy Portal"]
  node_academy_server["Academy server<br/>[server.js]"]
  node_academy_auth["Authentication<br/>[auth.js]"]
  node_academy_guard["Token guards<br/>[auth.js]"]
  node_academy_db[("Academy data<br/>[init.js]")]
  node_announcements["Announcements<br/>[announcements.js]"]
  node_courses["Courses<br/>[courses.js]"]
  node_photos["Photo services<br/>[photos.js]"]
  node_inbox_api["Inbox APIs<br/>[inbox.js]"]
  node_users_api["User APIs<br/>[users.js]"]
  node_internal_api["Internal routes<br/>[internal.js]"]
end

subgraph group_admission["Admission Portal"]
  node_admission_web["Admission pages<br/>[views.py]"]
  node_admission_api["Application APIs<br/>[api_v1.py]"]
  node_admission_api_v2["Application API v2<br/>[api_v2.py]"]
  node_admission_models[("Admission records<br/>[models.py]")]
end

subgraph group_registrar["Registrar System"]
  node_registrar_home["Public portal<br/>[index.php]"]
  node_request_form["Document request<br/>[apply.php]"]
  node_staff_search["Student search<br/>[search.php]"]
  node_staff_request["Request management<br/>[view_request.php]"]
  node_registrar_auth["Session guards<br/>[auth.php]"]
  node_registrar_db[("Registrar database<br/>[db.php]")]
end

node_visitor(("Website visitor"))
node_academy_user(("Portal user"))
node_applicant(("Applicant"))
node_registrar_user(("Public requester"))
node_registrar_staff(("Registrar staff"))

node_visitor -->|"browses"| node_main_site
node_main_site -->|"links to"| node_careers
node_main_site -->|"links to portal"| node_academy_user
node_main_site -->|"links to admission"| node_applicant
node_academy_user -->|"uses portal"| node_academy_server
node_academy_server -->|"initializes"| node_academy_db
node_academy_server -->|"mounts"| node_academy_auth
node_academy_server -->|"mounts"| node_announcements
node_academy_server -->|"mounts"| node_courses
node_academy_server -->|"mounts"| node_photos
node_academy_server -->|"mounts"| node_inbox_api
node_academy_server -->|"mounts"| node_users_api
node_academy_server -->|"mounts"| node_internal_api
node_academy_auth -->|"reads and updates"| node_academy_db
node_academy_auth -->|"verifies tokens"| node_academy_guard
node_announcements -->|"uses"| node_academy_db
node_courses -->|"uses"| node_academy_db
node_photos -->|"uses"| node_academy_db
node_inbox_api -->|"uses"| node_academy_db
node_users_api -->|"uses"| node_academy_db
node_applicant -->|"uses"| node_admission_web
node_applicant -->|"submits application"| node_admission_api
node_applicant -.->|"uses API v2"| node_admission_api_v2
node_admission_api -->|"uses records"| node_admission_models
node_admission_api_v2 -->|"uses records"| node_admission_models
node_admission_web -->|"uses records"| node_admission_models
node_registrar_user -->|"tracks requests"| node_registrar_home
node_registrar_user -->|"submits request"| node_request_form
node_registrar_home -->|"queries requests and notices"| node_registrar_db
node_request_form -->|"stores request"| node_registrar_db
node_registrar_staff -->|"searches students"| node_staff_search
node_registrar_staff -->|"manages requests"| node_staff_request
node_staff_search -->|"checks session"| node_registrar_auth
node_staff_request -->|"checks session"| node_registrar_auth
node_staff_search -->|"queries"| node_registrar_db
node_staff_request -->|"reads request"| node_registrar_db

click node_main_site "https://github.com/ruur31337/nmc-lab/blob/main/main-web/www/index.php"
click node_careers "https://github.com/ruur31337/nmc-lab/blob/main/main-web/www/careers.php"
click node_academy_server "https://github.com/ruur31337/nmc-lab/blob/main/academy/server.js"
click node_academy_auth "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/auth.js"
click node_academy_guard "https://github.com/ruur31337/nmc-lab/blob/main/academy/middleware/auth.js"
click node_academy_db "https://github.com/ruur31337/nmc-lab/blob/main/academy/db/init.js"
click node_announcements "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/announcements.js"
click node_courses "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/courses.js"
click node_photos "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/photos.js"
click node_inbox_api "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/v2/inbox.js"
click node_users_api "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/v2/users.js"
click node_internal_api "https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/internal.js"
click node_admission_web "https://github.com/ruur31337/nmc-lab/blob/main/admission/app/routes/views.py"
click node_admission_api "https://github.com/ruur31337/nmc-lab/blob/main/admission/app/routes/api_v1.py"
click node_admission_api_v2 "https://github.com/ruur31337/nmc-lab/blob/main/admission/app/routes/api_v2.py"
click node_admission_models "https://github.com/ruur31337/nmc-lab/blob/main/admission/app/models.py"
click node_registrar_home "https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/index.php"
click node_request_form "https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/apply.php"
click node_staff_search "https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/staff/search.php"
click node_staff_request "https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/staff/view_request.php"
click node_registrar_auth "https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/includes/auth.php"
click node_registrar_db "https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/includes/db.php"

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_main_site,node_careers,node_academy_user toneBlue
class node_academy_server,node_academy_auth,node_academy_guard,node_academy_db,node_announcements,node_courses,node_photos,node_inbox_api,node_users_api,node_internal_api toneAmber
class node_admission_web,node_admission_api,node_admission_api_v2,node_admission_models,node_registrar_user toneMint
class node_registrar_home,node_request_form,node_staff_search,node_staff_request,node_registrar_auth,node_registrar_db toneRose
class node_visitor,node_applicant,node_registrar_staff toneIndigo
```

## Components

### Public Website

- [College pages](https://github.com/ruur31337/nmc-lab/blob/main/main-web/www/index.php): `main-web/www/index.php`
- [Careers page](https://github.com/ruur31337/nmc-lab/blob/main/main-web/www/careers.php): `main-web/www/careers.php`

### Academy Portal

- [Academy server](https://github.com/ruur31337/nmc-lab/blob/main/academy/server.js): `academy/server.js`
- [Authentication](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/auth.js): `academy/routes/auth.js`
- [Token guards](https://github.com/ruur31337/nmc-lab/blob/main/academy/middleware/auth.js): `academy/middleware/auth.js`
- [Academy data](https://github.com/ruur31337/nmc-lab/blob/main/academy/db/init.js): `academy/db/init.js`
- [Announcements](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/announcements.js): `academy/routes/announcements.js`
- [Courses](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/courses.js): `academy/routes/courses.js`
- [Photo services](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/photos.js): `academy/routes/photos.js`
- [Inbox APIs](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/v2/inbox.js): `academy/routes/v2/inbox.js`
- [User APIs](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/v2/users.js): `academy/routes/v2/users.js`
- [Internal routes](https://github.com/ruur31337/nmc-lab/blob/main/academy/routes/internal.js): `academy/routes/internal.js`

### Admission Portal

- [Admission pages](https://github.com/ruur31337/nmc-lab/blob/main/admission/app/routes/views.py): `admission/app/routes/views.py`
- [Application APIs](https://github.com/ruur31337/nmc-lab/blob/main/admission/app/routes/api_v1.py): `admission/app/routes/api_v1.py`
- [Application API v2](https://github.com/ruur31337/nmc-lab/blob/main/admission/app/routes/api_v2.py): `admission/app/routes/api_v2.py`
- [Admission records](https://github.com/ruur31337/nmc-lab/blob/main/admission/app/models.py): `admission/app/models.py`

### Registrar System

- [Public portal](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/index.php): `registrar/www/index.php`
- [Document request](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/apply.php): `registrar/www/apply.php`
- [Student search](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/staff/search.php): `registrar/www/staff/search.php`
- [Request management](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/staff/view_request.php): `registrar/www/staff/view_request.php`
- [Session guards](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/includes/auth.php): `registrar/www/includes/auth.php`
- [Registrar database](https://github.com/ruur31337/nmc-lab/blob/main/registrar/www/includes/db.php): `registrar/www/includes/db.php`

### Other components

- **Website visitor**
- **Portal user**
- **Applicant**
- **Public requester**
- **Registrar staff**

## Connections

- Website visitor → College pages: browses (evidence: `README.md`)
- College pages → Careers page: links to
- College pages → Portal user: links to portal
- College pages → Applicant: links to admission
- Portal user → Academy server: uses portal (evidence: `README.md`)
- Academy server → Academy data: initializes (evidence: `academy/server.js`)
- Academy server → Authentication: mounts (evidence: `academy/server.js`)
- Academy server → Announcements: mounts (evidence: `academy/server.js`)
- Academy server → Courses: mounts (evidence: `academy/server.js`)
- Academy server → Photo services: mounts (evidence: `academy/server.js`)
- Academy server → Inbox APIs: mounts (evidence: `academy/server.js`)
- Academy server → User APIs: mounts (evidence: `academy/server.js`)
- Academy server → Internal routes: mounts (evidence: `academy/server.js`)
- Authentication → Academy data: reads and updates (evidence: `academy/routes/auth.js`)
- Authentication → Token guards: verifies tokens (evidence: `academy/routes/auth.js`)
- Announcements → Academy data: uses (evidence: `academy/routes/announcements.js`)
- Courses → Academy data: uses (evidence: `academy/routes/courses.js`)
- Photo services → Academy data: uses (evidence: `academy/routes/photos.js`)
- Inbox APIs → Academy data: uses (evidence: `academy/routes/v2/inbox.js`)
- User APIs → Academy data: uses (evidence: `academy/routes/v2/users.js`)
- Applicant → Admission pages: uses (evidence: `README.md`)
- Applicant → Application APIs: submits application (evidence: `README.md`)
- Applicant → Application API v2: uses API v2
- Application APIs → Admission records: uses records (evidence: `admission/app/routes/api_v1.py`)
- Application API v2 → Admission records: uses records (evidence: `admission/app/routes/api_v2.py`)
- Admission pages → Admission records: uses records (evidence: `admission/app/routes/views.py`)
- Public requester → Public portal: tracks requests (evidence: `registrar/www/index.php`)
- Public requester → Document request: submits request (evidence: `README.md`)
- Public portal → Registrar database: queries requests and notices (evidence: `registrar/www/index.php`)
- Document request → Registrar database: stores request (evidence: `registrar/www/apply.php`)
- Registrar staff → Student search: searches students (evidence: `README.md`)
- Registrar staff → Request management: manages requests (evidence: `README.md`)
- Student search → Session guards: checks session (evidence: `registrar/www/staff/search.php`)
- Request management → Session guards: checks session (evidence: `registrar/www/staff/view_request.php`)
- Student search → Registrar database: queries (evidence: `registrar/www/staff/search.php`)
- Request management → Registrar database: reads request (evidence: `registrar/www/staff/view_request.php`)
