# invaderjmusic/royalties architecture

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

- Interactive diagram: https://gitdiagram.com/invaderjmusic/royalties
- Repository: https://github.com/invaderjmusic/royalties

## Overview

Royalties is an Express web app for recording music and product revenue, allocating it by contributor splits, and presenting earnings and payouts to users and administrators. Users log in to review royalties, sales, balances, and payouts; administrators manage users, releases, splits, royalties, sales, and transactions. Signup keys support account setup and password resets. The graph reflects the sampled server routes, domain logic, and database calls; admin page coverage and the daily exchange-rate capability are also documented, but unsampled frontend and scheduler wiring is not inferred.

Main entry points: [`index.js`](https://github.com/invaderjmusic/royalties/blob/main/index.js) (Express server), [`routes/admin.js`](https://github.com/invaderjmusic/royalties/blob/main/routes/admin.js) (Admin routes), [`routes/api.js`](https://github.com/invaderjmusic/royalties/blob/main/routes/api.js) (User API), [`lib/users.js`](https://github.com/invaderjmusic/royalties/blob/main/lib/users.js) (Password and key logic)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_server["Express server<br/>[index.js]"]
  node_user_pages["Contributor dashboard"]
  node_admin_pages["Admin console"]
  node_signup_pages["Signup and reset UI"]
  node_dashboard_routes["Dashboard routes<br/>[dashboard.js]"]
  node_admin_routes["Admin routes<br/>[admin.js]"]
  node_api_routes["User API<br/>[api.js]"]
end

subgraph group_accounts["Accounts and access"]
  node_signup_routes["Signup routes<br/>[signup.js]"]
  node_user_auth["Password and key logic<br/>[users.js]"]
end

subgraph group_royalties["Royalties and sales"]
  node_royalty_logic["Royalty allocation<br/>[royalties.js]"]
end

subgraph group_storage["Persistence and currency"]
  node_currency["Exchange-rate service<br/>[currency.js]"]
  node_database[("EdgeDB access<br/>[database.js]")]
end

node_visitor(("Visitor"))
node_user(("Contributor"))
node_admin_actor(("Administrator"))
node_edgedb[("EdgeDB")]
node_currency_api["Currency API"]

node_visitor -->|"opens app"| node_server
node_server -->|"checks login"| node_user_auth
node_server -->|"mounts routes"| node_dashboard_routes
node_server -->|"mounts routes"| node_admin_routes
node_server -->|"mounts routes"| node_api_routes
node_server -->|"mounts routes"| node_signup_routes
node_server -->|"starts rate fetch"| node_currency
node_user -->|"views earnings"| node_user_pages
node_admin_actor -->|"manages records"| node_admin_pages
node_visitor -->|"sets password"| node_signup_pages
node_user_pages -->|"requests pages"| node_dashboard_routes
node_admin_pages -->|"requests pages"| node_admin_routes
node_user_pages -->|"requests data"| node_api_routes
node_admin_pages -->|"submits changes"| node_admin_routes
node_signup_pages -.->|"submits credentials"| node_signup_routes
node_signup_routes -->|"validates keys"| node_user_auth
node_user_auth -->|"reads and writes users"| node_database
node_api_routes -->|"queries account data"| node_database
node_api_routes -->|"updates password"| node_user_auth
node_api_routes -->|"reads conversion rate"| node_currency
node_admin_routes -->|"manages records"| node_database
node_admin_routes -->|"allocates earnings"| node_royalty_logic
node_admin_routes -->|"creates reset key"| node_user_auth
node_admin_routes -->|"reads conversion rate"| node_currency
node_royalty_logic -->|"reads splits; writes earnings"| node_database
node_database -->|"queries and writes"| node_edgedb
node_currency -->|"fetches USD-GBP"| node_currency_api

click node_server "https://github.com/invaderjmusic/royalties/blob/main/index.js"
click node_user_pages "https://github.com/invaderjmusic/royalties/tree/main/dashboard"
click node_admin_pages "https://github.com/invaderjmusic/royalties/tree/main/admin"
click node_signup_pages "https://github.com/invaderjmusic/royalties/tree/main/public"
click node_dashboard_routes "https://github.com/invaderjmusic/royalties/blob/main/routes/dashboard.js"
click node_admin_routes "https://github.com/invaderjmusic/royalties/blob/main/routes/admin.js"
click node_api_routes "https://github.com/invaderjmusic/royalties/blob/main/routes/api.js"
click node_signup_routes "https://github.com/invaderjmusic/royalties/blob/main/routes/signup.js"
click node_user_auth "https://github.com/invaderjmusic/royalties/blob/main/lib/users.js"
click node_royalty_logic "https://github.com/invaderjmusic/royalties/blob/main/lib/royalties.js"
click node_currency "https://github.com/invaderjmusic/royalties/blob/main/lib/currency.js"
click node_database "https://github.com/invaderjmusic/royalties/blob/main/lib/database.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_user_pages,node_admin_pages,node_signup_pages,node_dashboard_routes,node_admin_routes,node_api_routes toneBlue
class node_signup_routes,node_user_auth,node_edgedb toneAmber
class node_royalty_logic,node_currency_api toneMint
class node_currency,node_database toneRose
class node_visitor,node_user,node_admin_actor toneIndigo
```

## Components

### Web application

- [Express server](https://github.com/invaderjmusic/royalties/blob/main/index.js): `index.js`
- [Contributor dashboard](https://github.com/invaderjmusic/royalties/tree/main/dashboard): `dashboard`
- [Admin console](https://github.com/invaderjmusic/royalties/tree/main/admin): `admin`
- [Signup and reset UI](https://github.com/invaderjmusic/royalties/tree/main/public): `public`
- [Dashboard routes](https://github.com/invaderjmusic/royalties/blob/main/routes/dashboard.js): `routes/dashboard.js`
- [Admin routes](https://github.com/invaderjmusic/royalties/blob/main/routes/admin.js): `routes/admin.js`
- [User API](https://github.com/invaderjmusic/royalties/blob/main/routes/api.js): `routes/api.js`

### Accounts and access

- [Signup routes](https://github.com/invaderjmusic/royalties/blob/main/routes/signup.js): `routes/signup.js`
- [Password and key logic](https://github.com/invaderjmusic/royalties/blob/main/lib/users.js): `lib/users.js`

### Royalties and sales

- [Royalty allocation](https://github.com/invaderjmusic/royalties/blob/main/lib/royalties.js): `lib/royalties.js`

### Persistence and currency

- [Exchange-rate service](https://github.com/invaderjmusic/royalties/blob/main/lib/currency.js): `lib/currency.js`
- [EdgeDB access](https://github.com/invaderjmusic/royalties/blob/main/lib/database.js): `lib/database.js`

### Other components

- **Visitor**
- **Contributor**
- **Administrator**
- **EdgeDB**
- **Currency API**

## Connections

- Visitor → Express server: opens app (evidence: `index.js`)
- Express server → Password and key logic: checks login (evidence: `index.js`)
- Express server → Dashboard routes: mounts routes (evidence: `index.js`)
- Express server → Admin routes: mounts routes (evidence: `index.js`)
- Express server → User API: mounts routes (evidence: `index.js`)
- Express server → Signup routes: mounts routes (evidence: `index.js`)
- Express server → Exchange-rate service: starts rate fetch (evidence: `index.js`)
- Contributor → Contributor dashboard: views earnings (evidence: `README.md`)
- Administrator → Admin console: manages records (evidence: `README.md`)
- Visitor → Signup and reset UI: sets password
- Contributor dashboard → Dashboard routes: requests pages (evidence: `routes/dashboard.js`)
- Admin console → Admin routes: requests pages (evidence: `routes/admin.js`)
- Contributor dashboard → User API: requests data (evidence: `README.md`)
- Admin console → Admin routes: submits changes (evidence: `routes/admin.js`)
- Signup and reset UI → Signup routes: submits credentials
- Signup routes → Password and key logic: validates keys (evidence: `routes/signup.js`)
- Password and key logic → EdgeDB access: reads and writes users (evidence: `lib/users.js`)
- User API → EdgeDB access: queries account data (evidence: `routes/api.js`)
- User API → Password and key logic: updates password (evidence: `routes/api.js`)
- User API → Exchange-rate service: reads conversion rate (evidence: `routes/api.js`)
- Admin routes → EdgeDB access: manages records (evidence: `routes/admin.js`)
- Admin routes → Royalty allocation: allocates earnings (evidence: `routes/admin.js`)
- Admin routes → Password and key logic: creates reset key (evidence: `routes/admin.js`)
- Admin routes → Exchange-rate service: reads conversion rate (evidence: `routes/admin.js`)
- Royalty allocation → EdgeDB access: reads splits; writes earnings (evidence: `lib/royalties.js`)
- EdgeDB access → EdgeDB: queries and writes (evidence: `lib/database.js`)
- Exchange-rate service → Currency API: fetches USD-GBP (evidence: `lib/currency.js`)
