diff --git a/backend/src/tools/koepi/routes.js b/backend/src/tools/koepi/routes.js index 2b9bdd2..43c0b48 100644 --- a/backend/src/tools/koepi/routes.js +++ b/backend/src/tools/koepi/routes.js @@ -425,11 +425,18 @@ function formatOfferMessage(offers) { .join('\n'); } -async function sendKoepiPushover(offers) { - const recipients = db.prepare(` - SELECT user_key, app_token FROM pushover_settings - WHERE user_key IS NOT NULL AND app_token IS NOT NULL - `).all(); +// onlyUserId gesetzt: nur an diesen einen Nutzer schicken (z.B. Admin-Testklick), +// sonst an alle Nutzer mit hinterlegtem Pushover (echter Tages-Cron) +async function sendKoepiPushover(offers, onlyUserId = null) { + const recipients = onlyUserId + ? db.prepare(` + SELECT user_key, app_token FROM pushover_settings + WHERE user_id = ? AND user_key IS NOT NULL AND app_token IS NOT NULL + `).all(onlyUserId) + : db.prepare(` + SELECT user_key, app_token FROM pushover_settings + WHERE user_key IS NOT NULL AND app_token IS NOT NULL + `).all(); const message = formatOfferMessage(offers); for (const r of recipients) { try { @@ -467,9 +474,10 @@ async function refreshOffersOnly() { } } -// Wird täglich um 06:00 vom Scheduler in index.js aufgerufen. -// forceNotify=true (manueller Admin-Test): Pushover wird auch ohne Änderung verschickt. -async function runDailyCheck(forceNotify = false) { +// Wird täglich um 06:00 vom Scheduler in index.js aufgerufen (ohne onlyUserId +// → geht an alle). forceNotify=true (manueller Admin-Test): Pushover wird auch +// ohne Änderung verschickt; onlyUserId gesetzt: nur an diesen einen Nutzer. +async function runDailyCheck(forceNotify = false, onlyUserId = null) { try { const { offers } = await scrapeMarktguru(true); const currentSig = offerSignature(offers); @@ -482,10 +490,10 @@ async function runDailyCheck(forceNotify = false) { return { changed: false, sent: false, offerCount: offers.length }; } - await sendKoepiPushover(offers); + await sendKoepiPushover(offers, onlyUserId); db.prepare('INSERT OR REPLACE INTO admin_settings (key, value) VALUES (?, ?)') .run(KOEPI_SETTINGS_KEY, currentSig); - console.log(`🍺 KöPi-Check: ${offers.length} Angebot(e)${changed ? ' geändert' : ' (Test, unverändert)'} – Pushover versendet.`); + console.log(`🍺 KöPi-Check: ${offers.length} Angebot(e)${changed ? ' geändert' : ' (Test, unverändert)'} – Pushover versendet${onlyUserId ? ` (nur an User ${onlyUserId})` : ''}.`); mqttClient.publishKoepiState({ offers, changed }); return { changed, sent: true, offerCount: offers.length }; } catch (e) { @@ -514,11 +522,12 @@ router.post('/clear-cache', authenticate, (req, res) => { res.json({ ok: true }); }); -// Manueller Test des Tages-Checks (Admin) — sendet Pushover auch ohne echte Änderung +// Manueller Test des Tages-Checks (Admin) — sendet Pushover auch ohne echte +// Änderung, aber NUR an den Admin selbst (nicht an alle Nutzer) router.post('/run-daily-check', authenticate, async (req, res) => { if (req.user?.role !== 'admin') return res.status(403).json({ error: 'Kein Zugriff' }); try { - const result = await runDailyCheck(true); + const result = await runDailyCheck(true, req.user.id); if (result.error) return res.status(500).json({ error: result.error }); res.json(result); } catch(e) { res.status(500).json({ error: e.message }); }