feat: Media-Requests im Dashboard mit Neu/Gesehen-Unterscheidung statt nur Favoriten-Zaehler
This commit is contained in:
@@ -566,6 +566,8 @@ if (!db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='mov
|
||||
db.exec("ALTER TABLE movie_favorites ADD COLUMN user_notified INTEGER NOT NULL DEFAULT 0");
|
||||
if (!cols.includes('media_type'))
|
||||
db.exec("ALTER TABLE movie_favorites ADD COLUMN media_type TEXT NOT NULL DEFAULT 'movie'");
|
||||
if (!cols.includes('admin_seen'))
|
||||
db.exec("ALTER TABLE movie_favorites ADD COLUMN admin_seen INTEGER NOT NULL DEFAULT 0");
|
||||
}
|
||||
|
||||
// xREL Badge Cache (persistent, überlebt Container-Restarts)
|
||||
|
||||
@@ -866,12 +866,13 @@ router.post('/favorites/user-notify', authenticate, (req, res) => {
|
||||
res.json({ ok: true });
|
||||
});
|
||||
|
||||
// GET /favorites/unacked – unquittierte Zählung (Admin: neue Favoriten; User: quittierte aber unbestätigte)
|
||||
// GET /favorites/unacked – unquittierte Zählung (Admin: neue Requests; User: quittierte aber unbestätigte)
|
||||
router.get('/favorites/unacked', authenticate, (req, res) => {
|
||||
const isAdmin = req.user.role === 'admin';
|
||||
if (isAdmin) {
|
||||
const count = db.prepare('SELECT COUNT(*) as n FROM movie_favorites WHERE acknowledged=0').get();
|
||||
res.json({ count: count.n, isAdmin: true });
|
||||
const newCount = db.prepare('SELECT COUNT(*) as n FROM movie_favorites WHERE acknowledged=0 AND admin_seen=0').get();
|
||||
res.json({ count: count.n, newCount: newCount.n, isAdmin: true });
|
||||
} else {
|
||||
// User: Favoriten die vom Admin quittiert wurden aber User noch nicht gesehen hat
|
||||
const count = db.prepare('SELECT COUNT(*) as n FROM movie_favorites WHERE user_id=? AND acknowledged=1 AND user_notified=0').get(req.user.id);
|
||||
@@ -879,6 +880,14 @@ router.get('/favorites/unacked', authenticate, (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// POST /favorites/mark-seen – Admin hat die offenen Requests angesehen (noch
|
||||
// nicht zwingend quittiert) — nimmt ihnen das "neu"-Label im Dashboard
|
||||
router.post('/favorites/mark-seen', authenticate, (req, res) => {
|
||||
if (req.user.role !== 'admin') return res.status(403).json({ error: 'Kein Zugriff' });
|
||||
db.prepare('UPDATE movie_favorites SET admin_seen=1 WHERE acknowledged=0 AND admin_seen=0').run();
|
||||
res.json({ ok: true });
|
||||
});
|
||||
|
||||
|
||||
|
||||
// ── Quittier-Logik (wiederverwendbar: HTTP-Routen + MQTT-Buttons) ───────────
|
||||
@@ -993,7 +1002,7 @@ router.post('/favorites/:id/acknowledge', authenticate, requireAdmin, (req, res)
|
||||
router.post('/favorites/:id/unacknowledge', authenticate, requireAdmin, (req, res) => {
|
||||
const fav = db.prepare('SELECT * FROM movie_favorites WHERE id=?').get(req.params.id);
|
||||
if (!fav) return res.status(404).json({ error: 'Nicht gefunden' });
|
||||
db.prepare('UPDATE movie_favorites SET acknowledged=0, acknowledged_at=NULL, user_notified=0 WHERE id=?').run(fav.id);
|
||||
db.prepare('UPDATE movie_favorites SET acknowledged=0, acknowledged_at=NULL, user_notified=0, admin_seen=0 WHERE id=?').run(fav.id);
|
||||
res.json({ ok: true });
|
||||
// Pushover an den User — Quittierung zurückgezogen (fire & forget)
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user