Admin: Test-Push-Button pro User (nur sichtbar wenn Pushover eingerichtet)

This commit is contained in:
2026-06-25 00:11:41 +02:00
parent e6c80ab7ee
commit 8eea117321
2 changed files with 32 additions and 0 deletions

View File

@@ -170,6 +170,25 @@ router.put('/users/:id/hidden', authenticate, requireAdmin, (req, res) => {
res.json({ hidden: newHidden }); 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 ─────────────────────────────────── // ── WebDAV / Synology NAS Einstellungen ───────────────────────────────────
router.get('/webdav', authenticate, requireAdmin, (req, res) => { router.get('/webdav', authenticate, requireAdmin, (req, res) => {
const get = k => db.prepare('SELECT value FROM admin_settings WHERE key=?').get(k)?.value || ''; const get = k => db.prepare('SELECT value FROM admin_settings WHERE key=?').get(k)?.value || '';

View File

@@ -2439,6 +2439,19 @@ function UserManagement({ toast }) {
</div> </div>
{/* Aktions-Buttons */} {/* Aktions-Buttons */}
<div style={{display:'flex',gap:4,flexShrink:0,flexWrap:'wrap',justifyContent:'flex-end'}}> <div style={{display:'flex',gap:4,flexShrink:0,flexWrap:'wrap',justifyContent:'flex-end'}}>
{!!u.has_pushover && (
<button
onClick={async () => {
try {
await api(`/admin/users/${u.id}/test-push`, { method:'POST', body:{ message:'Wat is mit meinen Fische?' } });
toast(`Push an ${u.username} gesendet ✓`);
} catch(e) { toast(e.message, 'error'); }
}}
title={`Test-Push an ${u.username}`}
style={{...S.btn('#ff6b9d',true), fontSize:11, padding:'4px 8px'}}>
🔔
</button>
)}
<button onClick={()=>{setResetId(u.id);setResetPw('');}} <button onClick={()=>{setResetId(u.id);setResetPw('');}}
style={{...S.btn('#ffe66d',true),fontSize:10,padding:'4px 8px'}}>🔑</button> style={{...S.btn('#ffe66d',true),fontSize:10,padding:'4px 8px'}}>🔑</button>
<button <button