All checks were successful
Build and Push Docker Image / build (push) Successful in 24s
ARCHITECTURE.md: - Directory structure: add middleware/requireAuth.js and favicon assets - §4.1: remove CORS from middleware list - §4.2: all proxy routes now auth-required via requireAuth; add middleware description - §6: cookie payload corrected (no token); document secure+sameSite - §7: add emby:users cache key (60s TTL) - §8: Download Object table: userTag → allTags/matchedUserTag/tagBadges - §9 POST /login: document cookie security attributes - §10: add Tag Badge Rendering section; remove hardcoded line count Diagrams: - class-server.puml: add requireAuth middleware module; update dashboard.js methods (extractAllTags, extractUserTag w/ username, buildTagBadges, getEmbyUsers); add TagBadge value class; add auth relationships for all proxy routes - class-data.puml: Download Object userTag → allTags/matchedUserTag/ tagBadges; add TagBadge class; remove token from Session Cookie - seq-auth.puml: cookie payload no longer contains token; add secure/sameSite note - component.puml: remove CORS component; add requireAuth; consolidate Emby connection to show tag badge + user-summary usage - activity-matching.puml: update to extractAllTags/extractUserTag (with username); showAll uses hasAnyTag; tagBadges built from embyUserMap; add Emby user fetch step; update legend - seq-dashboard.puml: add emby:users cache lookup / Emby fetch for showAll; update matching groups to show tag classification; add tag badge rendering note on renderDownloads()
100 lines
2.4 KiB
Plaintext
100 lines
2.4 KiB
Plaintext
@startuml component
|
|
!theme plain
|
|
title sofarr — Component Diagram
|
|
|
|
skinparam componentStyle rectangle
|
|
skinparam packageStyle frame
|
|
|
|
package "Browser" as browser {
|
|
[index.html] as html
|
|
[app.js] as appjs
|
|
[style.css] as css
|
|
html ..> appjs : loads
|
|
html ..> css : loads
|
|
}
|
|
|
|
package "Express Server" as server {
|
|
|
|
package "Middleware" {
|
|
[cookie-parser] as cp
|
|
[express.json] as ej
|
|
[express.static] as es
|
|
[requireAuth.js] as requireauth
|
|
}
|
|
|
|
package "Routes" as routes {
|
|
[auth.js\n/api/auth] as auth
|
|
[dashboard.js\n/api/dashboard] as dashboard
|
|
[emby.js\n/api/emby] as emby_route
|
|
[sabnzbd.js\n/api/sabnzbd] as sab_route
|
|
[sonarr.js\n/api/sonarr] as sonarr_route
|
|
[radarr.js\n/api/radarr] as radarr_route
|
|
}
|
|
|
|
package "Utilities" as utils {
|
|
[poller.js] as poller
|
|
[cache.js\nMemoryCache] as cache
|
|
[config.js] as config
|
|
[qbittorrent.js\nQBittorrentClient] as qbt
|
|
[logger.js] as logger
|
|
}
|
|
|
|
[index.js\nEntry Point] as entry
|
|
|
|
entry --> cp
|
|
entry --> ej
|
|
entry --> es
|
|
entry --> auth
|
|
entry --> dashboard
|
|
entry --> emby_route
|
|
entry --> sab_route
|
|
entry --> sonarr_route
|
|
entry --> radarr_route
|
|
|
|
emby_route --> requireauth
|
|
sab_route --> requireauth
|
|
sonarr_route --> requireauth
|
|
radarr_route --> requireauth
|
|
dashboard --> requireauth
|
|
entry --> poller : startPoller()
|
|
|
|
dashboard --> cache : read poll:* keys
|
|
dashboard --> poller : pollAllServices()\n(on-demand mode)
|
|
dashboard --> config : getSonarrInstances()\ngetRadarrInstances()
|
|
dashboard --> qbt : mapTorrentToDownload()
|
|
|
|
poller --> cache : set poll:* keys
|
|
poller --> config : get all instances
|
|
poller --> qbt : getTorrents()
|
|
poller --> logger
|
|
|
|
qbt --> config : getQbittorrentInstances()
|
|
qbt --> logger
|
|
}
|
|
|
|
cloud "External Services" as external {
|
|
[Emby / Jellyfin] as emby
|
|
[SABnzbd] as sab
|
|
[Sonarr] as sonarr
|
|
[Radarr] as radarr
|
|
[qBittorrent] as qbit
|
|
}
|
|
|
|
auth --> emby : authenticate\nuser profile
|
|
dashboard --> emby : GET /Users\n(user-summary + tag badge classification)
|
|
emby_route --> emby
|
|
sab_route --> sab
|
|
sonarr_route --> sonarr
|
|
radarr_route --> radarr
|
|
|
|
poller --> sab : queue + history
|
|
poller --> sonarr : tags + queue + history
|
|
poller --> radarr : tags + queue + history
|
|
qbt --> qbit : login + torrents/info
|
|
|
|
appjs --> auth : POST /login\nGET /me
|
|
appjs --> dashboard : GET /user-downloads\nGET /status
|
|
es --> html : serve static
|
|
|
|
@enduml
|