diff --git a/backend/src/routes/admin.js b/backend/src/routes/admin.js index 7b69a66..148752a 100644 --- a/backend/src/routes/admin.js +++ b/backend/src/routes/admin.js @@ -170,6 +170,25 @@ router.put('/users/:id/hidden', authenticate, requireAdmin, (req, res) => { res.json({ hidden: newHidden }); }); +// Test-Pushover an beliebigen User senden +router.post('/users/:id/test-push', authenticate, requireAdmin, async (req, res) => { + const user = db.prepare('SELECT * FROM users WHERE id=?').get(req.params.id); + if (!user) return res.status(404).json({ error: 'Nicht gefunden' }); + const poCfg = db.prepare('SELECT user_key, app_token FROM pushover_settings WHERE user_id=?').get(user.id); + if (!poCfg?.app_token || !poCfg?.user_key) return res.status(400).json({ error: 'Kein Pushover eingerichtet' }); + const { message = 'Wat is mit meinen Fische?' } = req.body; + try { + const r = await fetch('https://api.pushover.net/1/messages.json', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ token: poCfg.app_token, user: poCfg.user_key, title: '📣 DockStation', message, priority: 0 }), + }); + const d = await r.json(); + if (d.status === 1) res.json({ ok: true }); + else res.status(500).json({ error: d.errors?.join(', ') || 'Pushover-Fehler' }); + } catch(e) { res.status(500).json({ error: e.message }); } +}); + // ── WebDAV / Synology NAS Einstellungen ─────────────────────────────────── router.get('/webdav', authenticate, requireAdmin, (req, res) => { const get = k => db.prepare('SELECT value FROM admin_settings WHERE key=?').get(k)?.value || ''; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index e16dafa..066c384 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -2439,6 +2439,19 @@ function UserManagement({ toast }) { {/* Aktions-Buttons */}
+ {!!u.has_pushover && ( + + )}