# alfredsimpson/it490-longsoup architecture

> Architecture diagram of the GitHub repository alfredsimpson/it490-longsoup, 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/alfredsimpson/it490-longsoup
- Repository: https://github.com/alfredsimpson/it490-longsoup

## Overview

LongSoup is a music-discovery and social web app backed by queue-mediated services. A user reaches the Express web server, which serves account and API routes; documented product flows include authentication, Spotify browsing and playlist actions, profiles, and message boards. RabbitMQ separates the web tier from database workers, while the DMZ gathers external music metadata. The README also describes a staged deployment service. Several worker and route implementations were not excerpted, so those components are included where documented, but unverified connections are omitted or shown as dashed.

Main entry points: [`WebServer/webserver/server.js`](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/server.js) (Express server), [`WebServer/webserver/mustang.js`](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/mustang.js) (RabbitMQ client), [`DMZ/procedural_data_script.py`](https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/procedural_data_script.py) (Metadata collector), [`WebServer/webserver/lumberjack.js`](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/lumberjack.js) (Distributed logging)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_webserver["Express server<br/>[server.js]"]
  node_account_routes["Account routes<br/>[accountsRouter.js]"]
  node_api_routes["API routes<br/>[api.js]"]
  node_browser_ui["Browser UI<br/>[handler.js]"]
end

subgraph group_messaging["Messaging and logging"]
  node_web_messaging["RabbitMQ client<br/>[mustang.js]"]
  node_logging["Distributed logging<br/>[lumberjack.js]"]
end

subgraph group_data["Database services"]
  node_db_worker["Primary DB worker<br/>[DBWorker.py]"]
  node_profile_worker["Profile worker<br/>[DBProfileWorker.py]"]
  node_message_worker["Message-board worker<br/>[DBMessageWorker.py]"]
  node_mongo[("MongoDB")]
  node_twofa_worker["2FA worker<br/>[TESTDBWorker.py]"]
  node_email_auth["Email verification<br/>[LongAuthMessage.py]"]
end

subgraph group_catalog["Music data"]
  node_spot_worker["Spotify worker<br/>[DBSpotWorker.py]"]
  node_dmz_worker["DMZ worker<br/>[DMZWorker.py]"]
  node_metadata_job["Metadata collector"]
  node_recommendations["Recommendations"]
end

subgraph group_operations["Deployment"]
  node_deploy_client["Package submission<br/>[app.js]"]
  node_deploy_worker["Deployment service"]
end

node_user(("User"))
node_broker["RabbitMQ broker"]
node_spotify["Spotify API"]
node_audiodb["TheAudioDB API"]
node_dev(("Developer"))
node_qa(("QA approval"))

node_user -->|"uses"| node_webserver
node_webserver -->|"mounts routes"| node_account_routes
node_webserver -->|"mounts routes"| node_api_routes
node_user -->|"interacts"| node_browser_ui
node_browser_ui -.->|"requests data"| node_webserver
node_account_routes -->|"sends requests"| node_web_messaging
node_webserver -->|"sends requests"| node_web_messaging
node_web_messaging -->|"publishes and consumes"| node_broker
node_broker -.->|"dispatches requests"| node_db_worker
node_broker -.->|"dispatches profile requests"| node_profile_worker
node_broker -.->|"dispatches board requests"| node_message_worker
node_broker -.->|"dispatches music requests"| node_spot_worker
node_db_worker -.->|"reads and writes"| node_mongo
node_profile_worker -.->|"reads and writes"| node_mongo
node_message_worker -.->|"reads and writes"| node_mongo
node_spot_worker -.->|"queries catalog"| node_spotify
node_dmz_worker -->|"invokes job"| node_metadata_job
node_metadata_job -->|"queries artists"| node_audiodb
node_metadata_job -->|"publishes metadata"| node_broker
node_user -.->|"requests recommendations"| node_recommendations
node_twofa_worker -->|"imports authentication helper"| node_email_auth
node_email_auth -->|"sends verification email"| node_user
node_dev -->|"submits package"| node_deploy_client
node_deploy_client -->|"sends package request"| node_broker
node_broker -.->|"delivers package request"| node_deploy_worker
node_deploy_worker -.->|"requests approval"| node_qa
node_webserver -->|"logs events"| node_logging
node_web_messaging -->|"logs broker errors"| node_logging
node_logging -->|"publishes logs"| node_broker

click node_webserver "https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/server.js"
click node_account_routes "https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/routes/accountsRouter.js"
click node_api_routes "https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/routes/api.js"
click node_browser_ui "https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/public/js/handler.js"
click node_web_messaging "https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/mustang.js"
click node_logging "https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/lumberjack.js"
click node_db_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBWorker.py"
click node_profile_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBProfileWorker.py"
click node_message_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBMessageWorker.py"
click node_spot_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBSpotWorker.py"
click node_dmz_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/DMZWorker.py"
click node_metadata_job "https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/procedural_data_script.py"
click node_recommendations "https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/GetRecommendations.py"
click node_twofa_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/2FA/TESTDBWorker.py"
click node_email_auth "https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/2FA/LongAuthMessage.py"
click node_deploy_client "https://github.com/alfredsimpson/it490-longsoup/blob/main/Deployment/Testing/nodetest/app.js"
click node_deploy_worker "https://github.com/alfredsimpson/it490-longsoup/blob/main/Deployment/deploymentWorker.py"

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_webserver,node_account_routes,node_api_routes,node_browser_ui,node_user toneBlue
class node_web_messaging,node_logging toneAmber
class node_db_worker,node_profile_worker,node_message_worker,node_mongo,node_twofa_worker,node_email_auth,node_spotify,node_audiodb toneMint
class node_spot_worker,node_dmz_worker,node_metadata_job,node_recommendations toneRose
class node_deploy_client,node_deploy_worker,node_broker,node_dev,node_qa toneIndigo
```

## Components

### Web application

- [Express server](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/server.js): `WebServer/webserver/server.js`
- [Account routes](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/routes/accountsRouter.js): `WebServer/webserver/routes/accountsRouter.js`
- [API routes](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/routes/api.js): `WebServer/webserver/routes/api.js`
- [Browser UI](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/public/js/handler.js): `WebServer/public/js/handler.js`

### Messaging and logging

- [RabbitMQ client](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/mustang.js): `WebServer/webserver/mustang.js`
- [Distributed logging](https://github.com/alfredsimpson/it490-longsoup/blob/main/WebServer/webserver/lumberjack.js): `WebServer/webserver/lumberjack.js`

### Database services

- [Primary DB worker](https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBWorker.py): `DB/DBWorker.py`
- [Profile worker](https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBProfileWorker.py): `DB/DBProfileWorker.py`
- [Message-board worker](https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBMessageWorker.py): `DB/DBMessageWorker.py`
- **MongoDB**
- [2FA worker](https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/2FA/TESTDBWorker.py): `DB/2FA/TESTDBWorker.py`
- [Email verification](https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/2FA/LongAuthMessage.py): `DB/2FA/LongAuthMessage.py`

### Music data

- [Spotify worker](https://github.com/alfredsimpson/it490-longsoup/blob/main/DB/DBSpotWorker.py): `DB/DBSpotWorker.py`
- [DMZ worker](https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/DMZWorker.py): `DMZ/DMZWorker.py`
- [Metadata collector](https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/procedural_data_script.py): `DMZ/procedural_data_script.py`
- [Recommendations](https://github.com/alfredsimpson/it490-longsoup/blob/main/DMZ/GetRecommendations.py): `DMZ/GetRecommendations.py`

### Deployment

- [Package submission](https://github.com/alfredsimpson/it490-longsoup/blob/main/Deployment/Testing/nodetest/app.js): `Deployment/Testing/nodetest/app.js`
- [Deployment service](https://github.com/alfredsimpson/it490-longsoup/blob/main/Deployment/deploymentWorker.py): `Deployment/deploymentWorker.py`

### Other components

- **User**
- **RabbitMQ broker**
- **Spotify API**
- **TheAudioDB API**
- **Developer**
- **QA approval**

## Connections

- User → Express server: uses (evidence: `README.md`)
- Express server → Account routes: mounts routes (evidence: `WebServer/webserver/server.js`)
- Express server → API routes: mounts routes (evidence: `WebServer/webserver/server.js`)
- User → Browser UI: interacts (evidence: `README.md`)
- Browser UI → Express server: requests data
- Account routes → RabbitMQ client: sends requests (evidence: `WebServer/webserver/routes/accountsRouter.js`)
- Express server → RabbitMQ client: sends requests (evidence: `WebServer/webserver/server.js`)
- RabbitMQ client → RabbitMQ broker: publishes and consumes (evidence: `WebServer/webserver/mustang.js`)
- RabbitMQ broker → Primary DB worker: dispatches requests
- RabbitMQ broker → Profile worker: dispatches profile requests
- RabbitMQ broker → Message-board worker: dispatches board requests
- RabbitMQ broker → Spotify worker: dispatches music requests
- Primary DB worker → MongoDB: reads and writes
- Profile worker → MongoDB: reads and writes
- Message-board worker → MongoDB: reads and writes
- Spotify worker → Spotify API: queries catalog
- DMZ worker → Metadata collector: invokes job (evidence: `DMZ/DMZWorker.py`)
- Metadata collector → TheAudioDB API: queries artists (evidence: `DMZ/procedural_data_script.py`)
- Metadata collector → RabbitMQ broker: publishes metadata (evidence: `DMZ/procedural_data_script.py`)
- User → Recommendations: requests recommendations (evidence: `README.md`)
- 2FA worker → Email verification: imports authentication helper (evidence: `DB/2FA/TESTDBWorker.py`)
- Email verification → User: sends verification email (evidence: `DB/2FA/LongAuthMessage.py`)
- Developer → Package submission: submits package (evidence: `Deployment/Testing/nodetest/app.js`)
- Package submission → RabbitMQ broker: sends package request (evidence: `Deployment/Testing/nodetest/app.js`)
- RabbitMQ broker → Deployment service: delivers package request
- Deployment service → QA approval: requests approval (evidence: `README.md`)
- Express server → Distributed logging: logs events (evidence: `WebServer/webserver/server.js`)
- RabbitMQ client → Distributed logging: logs broker errors (evidence: `WebServer/webserver/mustang.js`)
- Distributed logging → RabbitMQ broker: publishes logs (evidence: `WebServer/webserver/lumberjack.js`)
