From c3caa4bb1cc2bc64ebb91e3a68e5990faf2ab9c8 Mon Sep 17 00:00:00 2001 From: Yusuf Suleman Date: Fri, 3 Apr 2026 06:04:28 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20wire=20media=20service=20into=20gateway?= =?UTF-8?q?=20=E2=80=94=20proxy,=20auth,=20app=20registration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- docker-compose.yml | 1 + gateway/config.py | 1 + gateway/database.py | 12 +++++++++++- gateway/server.py | 5 ++++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 31214b4..b7d8238 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -67,6 +67,7 @@ services: - TASKS_SERVICE_API_KEY=${TASKS_SERVICE_API_KEY} - BRAIN_BACKEND_URL=http://brain-api:8200 - READER_BACKEND_URL=http://reader-api:8300 + - MEDIA_BACKEND_URL=http://media-api:8400 - QBITTORRENT_HOST=${QBITTORRENT_HOST:-192.168.1.42} - QBITTORRENT_PORT=${QBITTORRENT_PORT:-8080} - QBITTORRENT_USERNAME=${QBITTORRENT_USERNAME:-admin} diff --git a/gateway/config.py b/gateway/config.py index a581baa..ccf75bf 100644 --- a/gateway/config.py +++ b/gateway/config.py @@ -24,6 +24,7 @@ SPOTIZERR_URL = os.environ.get("SPOTIZERR_URL", "http://spotizerr-app:7171") BUDGET_URL = os.environ.get("BUDGET_BACKEND_URL", "http://localhost:3001") TASKS_URL = os.environ.get("TASKS_BACKEND_URL", "http://tasks-service:8098") BRAIN_URL = os.environ.get("BRAIN_BACKEND_URL", "http://brain-api:8200") +MEDIA_URL = os.environ.get("MEDIA_BACKEND_URL", "http://media-api:8400") # ── Service API keys (for internal service auth) ── INVENTORY_SERVICE_API_KEY = os.environ.get("INVENTORY_SERVICE_API_KEY", "") diff --git a/gateway/database.py b/gateway/database.py index 2a26e04..a5c9d76 100644 --- a/gateway/database.py +++ b/gateway/database.py @@ -8,7 +8,7 @@ import bcrypt from config import ( DB_PATH, TRIPS_URL, FITNESS_URL, INVENTORY_URL, - MINIFLUX_URL, READER_URL, SHELFMARK_URL, SPOTIZERR_URL, BUDGET_URL, TASKS_URL, BRAIN_URL, + MINIFLUX_URL, READER_URL, SHELFMARK_URL, SPOTIZERR_URL, BUDGET_URL, TASKS_URL, BRAIN_URL, MEDIA_URL, ) @@ -140,6 +140,16 @@ def init_db(): conn.commit() print("[Gateway] Added brain app") + # Ensure media/podcast app exists + media = c.execute("SELECT id FROM apps WHERE id = 'media'").fetchone() + if not media: + c.execute("INSERT INTO apps VALUES ('media', 'Media', 'headphones', '/media', ?, 10, 1, NULL)", (MEDIA_URL,)) + conn.commit() + print("[Gateway] Added media app") + else: + c.execute("UPDATE apps SET proxy_target = ? WHERE id = 'media'", (MEDIA_URL,)) + conn.commit() + # Seed admin user from env vars if no users exist import os user_count = c.execute("SELECT COUNT(*) FROM users").fetchone()[0] diff --git a/gateway/server.py b/gateway/server.py index 8fbbcbd..537b130 100644 --- a/gateway/server.py +++ b/gateway/server.py @@ -325,7 +325,10 @@ class GatewayHandler(ResponseMixin, BaseHTTPRequestHandler): headers["X-Gateway-User-Id"] = str(user["id"]) headers["X-Gateway-User-Name"] = user.get("display_name", user.get("username", "")) elif service_id == "brain": - # Inject user identity for the brain service + if user: + headers["X-Gateway-User-Id"] = str(user["id"]) + headers["X-Gateway-User-Name"] = user.get("display_name", user.get("username", "")) + elif service_id == "media": if user: headers["X-Gateway-User-Id"] = str(user["id"]) headers["X-Gateway-User-Name"] = user.get("display_name", user.get("username", ""))