Push-Erinnerungen: Widget, Backend-Scheduler, Pushover-Versand jede Minute
This commit is contained in:
@@ -313,6 +313,20 @@ if (!db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='boa
|
||||
`);
|
||||
}
|
||||
|
||||
// ── Push-Zeitplaner ───────────────────────────────────────────────────────────
|
||||
if (!db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='push_schedules'").get()) {
|
||||
db.exec(`
|
||||
CREATE TABLE push_schedules (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
message TEXT NOT NULL,
|
||||
scheduled_at DATETIME NOT NULL,
|
||||
sent INTEGER NOT NULL DEFAULT 0,
|
||||
created_at DATETIME DEFAULT NULL
|
||||
)
|
||||
`);
|
||||
}
|
||||
|
||||
// ── Link-Liste ────────────────────────────────────────────────────────────────
|
||||
if (!db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='link_list'").get()) {
|
||||
db.exec(`
|
||||
|
||||
@@ -68,3 +68,33 @@ app.use(express.static(PUBLIC));
|
||||
app.get('*', (_req, res) => res.sendFile(path.join(PUBLIC, 'index.html')));
|
||||
|
||||
app.listen(4000, () => console.log('🚀 Dicken Dock läuft auf Port 4000'));
|
||||
|
||||
// ── Push-Zeitplaner Hintergrund-Job ──────────────────────────────────────────
|
||||
const db = require('./db');
|
||||
|
||||
async function sendPushoverMsg(userKey, appToken, message) {
|
||||
try {
|
||||
await fetch('https://api.pushover.net/1/messages.json', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
body: new URLSearchParams({ token: appToken, user: userKey, title: 'DickenDock Erinnerung', message }),
|
||||
});
|
||||
} catch(e) { console.error('Pushover Fehler:', e.message); }
|
||||
}
|
||||
|
||||
setInterval(async () => {
|
||||
try {
|
||||
const due = db.prepare(`
|
||||
SELECT s.*, p.user_key, p.app_token
|
||||
FROM push_schedules s
|
||||
JOIN pushover_settings p ON p.user_id = s.user_id
|
||||
WHERE s.sent = 0 AND s.scheduled_at <= datetime('now','localtime')
|
||||
`).all();
|
||||
|
||||
for (const row of due) {
|
||||
await sendPushoverMsg(row.user_key, row.app_token, row.message);
|
||||
db.prepare('UPDATE push_schedules SET sent=1 WHERE id=?').run(row.id);
|
||||
console.log(`✓ Push gesendet an user ${row.user_id}: ${row.message}`);
|
||||
}
|
||||
} catch(e) { console.error('Push-Job Fehler:', e.message); }
|
||||
}, 60 * 1000); // jede Minute
|
||||
|
||||
@@ -206,4 +206,38 @@ router.post('/board/:id/promote', authenticate, (req, res) => {
|
||||
res.json(updated);
|
||||
});
|
||||
|
||||
// ── Push-Zeitplaner ───────────────────────────────────────────────────────────
|
||||
router.get('/push-schedules', authenticate, (req, res) => {
|
||||
const rows = db.prepare(`
|
||||
SELECT * FROM push_schedules
|
||||
WHERE user_id=? AND sent=0 AND scheduled_at > datetime('now','localtime')
|
||||
ORDER BY scheduled_at ASC
|
||||
`).all(uid(req));
|
||||
res.json(rows);
|
||||
});
|
||||
|
||||
router.post('/push-schedules', authenticate, (req, res) => {
|
||||
const { message, scheduled_at } = req.body;
|
||||
if (!message?.trim() || !scheduled_at) return res.status(400).json({ error: 'Nachricht und Zeitpunkt erforderlich' });
|
||||
const r = db.prepare(`
|
||||
INSERT INTO push_schedules (user_id, message, scheduled_at, created_at)
|
||||
VALUES (?, ?, ?, datetime('now','localtime'))
|
||||
`).run(uid(req), message.trim(), scheduled_at);
|
||||
res.json(db.prepare('SELECT * FROM push_schedules WHERE id=?').get(r.lastInsertRowid));
|
||||
});
|
||||
|
||||
router.put('/push-schedules/:id', authenticate, (req, res) => {
|
||||
const row = db.prepare('SELECT * FROM push_schedules WHERE id=? AND user_id=?').get(req.params.id, uid(req));
|
||||
if (!row) return res.status(404).json({ error: 'Nicht gefunden' });
|
||||
const { message, scheduled_at } = req.body;
|
||||
db.prepare('UPDATE push_schedules SET message=?, scheduled_at=?, sent=0 WHERE id=?')
|
||||
.run(message ?? row.message, scheduled_at ?? row.scheduled_at, row.id);
|
||||
res.json(db.prepare('SELECT * FROM push_schedules WHERE id=?').get(row.id));
|
||||
});
|
||||
|
||||
router.delete('/push-schedules/:id', authenticate, (req, res) => {
|
||||
db.prepare('DELETE FROM push_schedules WHERE id=? AND user_id=?').run(req.params.id, uid(req));
|
||||
res.json({ ok: true });
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user