# fullstacksofteng101/jukebox-pro architecture

> Architecture diagram of the GitHub repository fullstacksofteng101/jukebox-pro, 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/fullstacksofteng101/jukebox-pro
- Repository: https://github.com/fullstacksofteng101/jukebox-pro

## Overview

Jukebox Pro is an Express music-catalog and playlist API backed by PostgreSQL. The implemented request flow is client → server/app → track or playlist router → query functions → database; playlist handlers also retrieve tracks and add playlist-track associations. The README describes account registration/login and user-owned playlist access, but the sampled app does not mount user routes or authentication middleware, and the tree contains no user API module. Those documented account capabilities are shown as an unverified API branch, not as implemented wiring.

Main entry points: [`db/client.js`](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/client.js) (PostgreSQL client), [`db/seed.js`](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/seed.js) (Sample data seeding), [`api/playlists.js`](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/api/playlists.js) (Playlist routes), [`db/queries/tracks.js`](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/tracks.js) (Track queries)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["HTTP runtime"]
  node_server["Server startup<br/>[server.js]"]
  node_app["Express app<br/>[app.js]"]
end

subgraph group_identity["Identity and access"]
  node_account_api["Account flows"]
  node_token_middleware["Token lookup"]
  node_body_middleware["Body validation<br/>[requireBody.js]"]
  node_require_user["User guard<br/>[requireUser.js]"]
  node_jwt["JWT utilities<br/>[jwt.js]"]
end

subgraph group_catalog["Music and playlists"]
  node_playlists_api["Playlist routes<br/>[playlists.js]"]
  node_tracks_api["Track routes<br/>[tracks.js]"]
end

subgraph group_storage["PostgreSQL data"]
  node_playlist_queries["Playlist queries<br/>[playlists.js]"]
  node_association_queries["Playlist-track queries"]
  node_track_queries["Track queries<br/>[tracks.js]"]
  node_user_queries["User queries<br/>[users.js]"]
  node_db_client[("PostgreSQL client<br/>[client.js]")]
  node_schema["Relational schema<br/>[schema.sql]"]
  node_seed["Sample data seeding<br/>[seed.js]"]
end

node_client(("API client"))

node_client -->|"sends requests"| node_server
node_server -->|"starts"| node_app
node_server -->|"connects"| node_db_client
node_app -->|"mounts routes"| node_playlists_api
node_app -->|"mounts routes"| node_tracks_api
node_client -.->|"registers or logs in"| node_account_api
node_account_api -.->|"creates or checks users"| node_user_queries
node_account_api -.->|"issues tokens"| node_jwt
node_token_middleware -->|"verifies tokens"| node_jwt
node_token_middleware -->|"loads user"| node_user_queries
node_playlists_api -->|"queries playlists"| node_playlist_queries
node_playlists_api -->|"adds track"| node_association_queries
node_playlists_api -->|"loads playlist tracks"| node_track_queries
node_tracks_api -->|"queries tracks"| node_track_queries
node_playlist_queries -->|"runs SQL"| node_db_client
node_association_queries -->|"runs SQL"| node_db_client
node_track_queries -->|"runs SQL"| node_db_client
node_user_queries -->|"runs SQL"| node_db_client
node_seed -->|"creates users"| node_user_queries
node_seed -->|"creates playlists"| node_playlist_queries
node_seed -->|"creates tracks"| node_track_queries
node_seed -->|"adds playlist tracks"| node_association_queries
node_schema -.->|"defines stored tables"| node_db_client

click node_server "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/server.js"
click node_app "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/app.js"
click node_playlists_api "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/api/playlists.js"
click node_tracks_api "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/api/tracks.js"
click node_account_api "https://github.com/fullstacksofteng101/jukebox-pro/tree/main/api"
click node_token_middleware "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/middleware/getUserFromToken.js"
click node_body_middleware "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/middleware/requireBody.js"
click node_require_user "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/middleware/requireUser.js"
click node_jwt "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/utils/jwt.js"
click node_playlist_queries "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/playlists.js"
click node_association_queries "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/playlists_tracks.js"
click node_track_queries "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/tracks.js"
click node_user_queries "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/users.js"
click node_db_client "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/client.js"
click node_schema "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/schema.sql"
click node_seed "https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/seed.js"

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_server,node_app,node_client toneBlue
class node_account_api,node_token_middleware,node_body_middleware,node_require_user,node_jwt toneAmber
class node_playlists_api,node_tracks_api toneMint
class node_playlist_queries,node_association_queries,node_track_queries,node_user_queries,node_db_client,node_schema,node_seed toneRose
```

## Components

### HTTP runtime

- [Server startup](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/server.js): `server.js`
- [Express app](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/app.js): `app.js`

### Identity and access

- [Account flows](https://github.com/fullstacksofteng101/jukebox-pro/tree/main/api): `api`
- [Token lookup](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/middleware/getUserFromToken.js): `middleware/getUserFromToken.js`
- [Body validation](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/middleware/requireBody.js): `middleware/requireBody.js`
- [User guard](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/middleware/requireUser.js): `middleware/requireUser.js`
- [JWT utilities](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/utils/jwt.js): `utils/jwt.js`

### Music and playlists

- [Playlist routes](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/api/playlists.js): `api/playlists.js`
- [Track routes](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/api/tracks.js): `api/tracks.js`

### PostgreSQL data

- [Playlist queries](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/playlists.js): `db/queries/playlists.js`
- [Playlist-track queries](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/playlists_tracks.js): `db/queries/playlists_tracks.js`
- [Track queries](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/tracks.js): `db/queries/tracks.js`
- [User queries](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/queries/users.js): `db/queries/users.js`
- [PostgreSQL client](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/client.js): `db/client.js`
- [Relational schema](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/schema.sql): `db/schema.sql`
- [Sample data seeding](https://github.com/fullstacksofteng101/jukebox-pro/blob/main/db/seed.js): `db/seed.js`

### Other components

- **API client**

## Connections

- API client → Server startup: sends requests
- Server startup → Express app: starts (evidence: `server.js`)
- Server startup → PostgreSQL client: connects (evidence: `server.js`)
- Express app → Playlist routes: mounts routes (evidence: `app.js`)
- Express app → Track routes: mounts routes (evidence: `app.js`)
- API client → Account flows: registers or logs in (evidence: `README.md`)
- Account flows → User queries: creates or checks users (evidence: `README.md`)
- Account flows → JWT utilities: issues tokens (evidence: `README.md`)
- Token lookup → JWT utilities: verifies tokens (evidence: `middleware/getUserFromToken.js`)
- Token lookup → User queries: loads user (evidence: `middleware/getUserFromToken.js`)
- Playlist routes → Playlist queries: queries playlists (evidence: `api/playlists.js`)
- Playlist routes → Playlist-track queries: adds track (evidence: `api/playlists.js`)
- Playlist routes → Track queries: loads playlist tracks (evidence: `api/playlists.js`)
- Track routes → Track queries: queries tracks (evidence: `api/tracks.js`)
- Playlist queries → PostgreSQL client: runs SQL (evidence: `db/queries/playlists.js`)
- Playlist-track queries → PostgreSQL client: runs SQL (evidence: `db/queries/playlists_tracks.js`)
- Track queries → PostgreSQL client: runs SQL (evidence: `db/queries/tracks.js`)
- User queries → PostgreSQL client: runs SQL (evidence: `db/queries/users.js`)
- Sample data seeding → User queries: creates users (evidence: `db/seed.js`)
- Sample data seeding → Playlist queries: creates playlists (evidence: `db/seed.js`)
- Sample data seeding → Track queries: creates tracks (evidence: `db/seed.js`)
- Sample data seeding → Playlist-track queries: adds playlist tracks (evidence: `db/seed.js`)
- Relational schema → PostgreSQL client: defines stored tables (evidence: `README.md`)
