From 5717e67b6d4886801983cbae0a3f386ef3eaecf1 Mon Sep 17 00:00:00 2001 From: Dicken Date: Sat, 6 Jun 2026 16:28:29 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20media=20=E2=80=93=20requireAdmin=20korre?= =?UTF-8?q?kt,=20Header,=20Token-Hinweis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/tools/media/routes.js | 9 ++- frontend/src/tools/media.jsx | 100 ++++++++++++++---------------- 2 files changed, 51 insertions(+), 58 deletions(-) diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 2ad612c..66a8c34 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -1,6 +1,7 @@ const express = require('express'); const router = express.Router(); const db = require('../../db'); +const { requireAdmin } = require('../../middleware/auth'); const TMDB_BASE = 'https://api.themoviedb.org/3'; @@ -71,16 +72,14 @@ router.delete('/favorites/:tmdb_id', (req, res) => { res.json({ ok: true }); }); -// GET /api/tools/media/settings (admin only – gibt Token maskiert zurΓΌck) -router.get('/settings', (req, res) => { - if (!req.user.is_admin) return res.status(403).json({ error: 'Nur Admin' }); +// GET /api/tools/media/settings (admin only) +router.get('/settings', requireAdmin, (req, res) => { const token = getToken(); res.json({ configured: !!token }); }); // PUT /api/tools/media/settings (admin only) -router.put('/settings', (req, res) => { - if (!req.user.is_admin) return res.status(403).json({ error: 'Nur Admin' }); +router.put('/settings', requireAdmin, (req, res) => { const { tmdb_token } = req.body; if (typeof tmdb_token !== 'string') return res.status(400).json({ error: 'tmdb_token fehlt' }); db.prepare('INSERT OR REPLACE INTO admin_settings (key,value) VALUES (?,?)').run('tmdb_token', tmdb_token.trim()); diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index 95d638a..0cf3c9b 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -13,15 +13,19 @@ export default function Media() { return (
-
+

+ 🎬 Media +

+ +
{TABS.map(t => ( @@ -35,7 +39,7 @@ export default function Media() { ); } -// ── Gemeinsame Film-Karte ───────────────────────────────────────────────────── +// ── Film-Karte ──────────────────────────────────────────────────────────────── function MovieCard({ movie, favIds, onToggleFav }) { const isFav = favIds.has(movie.id); const releaseDE = movie.release_date @@ -44,19 +48,16 @@ function MovieCard({ movie, favIds, onToggleFav }) { return (
- {/* Poster */} -
+
{movie.poster_path ? {movie.title} - :
🎬
+ style={{ width:'100%', height:'100%', objectFit:'cover', display:'block' }} /> + :
🎬
} - {/* Rating Badge */} {movie.vote_average > 0 && (
)} - {/* Fav Button */}
- - {/* Info */} -
+
@@ -95,7 +92,7 @@ function MovieCard({ movie, favIds, onToggleFav }) { ); } -// ── Grid-Wrapper (now-playing / upcoming) ───────────────────────────────────── +// ── Grid (now-playing / upcoming) ───────────────────────────────────────────── function MovieGrid({ endpoint, emptyText }) { const [movies, setMovies] = useState([]); const [favIds, setFavIds] = useState(new Set()); @@ -120,7 +117,7 @@ function MovieGrid({ endpoint, emptyText }) { const toggleFav = async (movie, isFav) => { try { if (isFav) { - await api(`/tools/media/favorites/${movie.id}`, { method: 'DELETE' }); + await api(`/tools/media/favorites/${movie.id}`, { method:'DELETE' }); setFavIds(prev => { const s = new Set(prev); s.delete(movie.id); return s; }); } else { await api('/tools/media/favorites', { body: { @@ -137,14 +134,21 @@ function MovieGrid({ endpoint, emptyText }) { }; if (loading) return ⏳ LΓ€dt…; - if (error) return ⚠ {error}; + if (error) return + ⚠ {error} + {error.includes('Token') && ( +
+ β†’ Einstellungen β†’ Benutzer β†’ TMDB API (KINO-FEATURE) +
+ )} +
; if (!movies.length) return {emptyText}; return (
{movies.map(m => ( @@ -153,26 +157,20 @@ function MovieGrid({ endpoint, emptyText }) { ); } -// ── Favoriten-Tab ───────────────────────────────────────────────────────────── +// ── Favoriten ───────────────────────────────────────────────────────────────── function FavoritenTab() { const [favs, setFavs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); - const load = useCallback(async () => { + useEffect(() => { setLoading(true); setError(''); - try { - const data = await api('/tools/media/favorites'); - setFavs(data); - } catch (e) { setError(e.message); } - finally { setLoading(false); } + api('/tools/media/favorites').then(setFavs).catch(e => setError(e.message)).finally(() => setLoading(false)); }, []); - useEffect(() => { load(); }, []); - const removeFav = async (tmdbId) => { try { - await api(`/tools/media/favorites/${tmdbId}`, { method: 'DELETE' }); + await api(`/tools/media/favorites/${tmdbId}`, { method:'DELETE' }); setFavs(prev => prev.filter(f => f.tmdb_id !== tmdbId)); } catch (e) { alert(e.message); } }; @@ -182,11 +180,7 @@ function FavoritenTab() { if (!favs.length) return Noch keine Favoriten – markiere Filme mit ❀; return ( -
+
{favs.map(f => (
{f.poster_path ? {f.title} - :
🎬
+ style={{ width:'100%', height:'100%', objectFit:'cover', display:'block' }} /> + :
🎬
}
-
+
{f.title}
{f.release_date_de && ( -
+
πŸ‡©πŸ‡ͺ {f.release_date_de}
)}