Files
mek-tech-consulting/routes/notifications.js
T

73 lines
2.8 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { getDb } = require('../db');
const https = require('https');
const http = require('http');
function sendSlack(webhookUrl, message) {
return new Promise((resolve) => {
if (!webhookUrl) return resolve(false);
const data = JSON.stringify({ text: message });
const url = new URL(webhookUrl);
const client = url.protocol === 'https:' ? https : http;
const req = client.request(webhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data) } }, (res) => {
let body = '';
res.on('data', c => body += c);
res.on('end', () => resolve(true));
});
req.on('error', () => resolve(false));
req.write(data);
req.end();
});
}
function createNotification(userId, type, title, message, channel) {
const db = getDb();
const result = db.prepare('INSERT INTO notifications (user_id, type, title, message, channel) VALUES (?,?,?,?,?)')
.run(userId || null, type, title, message || '', channel || 'in-app');
return result.lastInsertRowid;
}
async function sendNotification(userId, type, title, message) {
const db = getDb();
const nid = createNotification(userId, type, title, message, 'in-app');
const settings = db.prepare('SELECT * FROM user_settings WHERE user_id = ?').get(userId);
if (settings) {
if (settings.slack_webhook && type !== 'test') {
const user = db.prepare('SELECT username FROM users WHERE id = ?').get(userId);
const msg = `[Mek-Tech] ${title}: ${message}`;
sendSlack(settings.slack_webhook, msg).then(sent => {
if (sent) db.prepare("UPDATE notifications SET sent=1, channel='slack' WHERE id=?").run(nid);
});
}
}
return nid;
}
router.get('/', (req, res) => {
const db = getDb();
const notifications = db.prepare('SELECT * FROM notifications WHERE user_id = ? OR user_id IS NULL ORDER BY created_at DESC LIMIT 100').all(req.session.userId);
const unread = notifications.filter(n => !n.read).length;
res.render('notification-list', { notifications, unread });
});
router.post('/:id/read', (req, res) => {
const db = getDb();
db.prepare("UPDATE notifications SET read=1 WHERE id=? AND (user_id=? OR user_id IS NULL)").run(req.params.id, req.session.userId);
res.redirect('/notifications');
});
router.post('/read-all', (req, res) => {
const db = getDb();
db.prepare("UPDATE notifications SET read=1 WHERE user_id=? AND read=0").run(req.session.userId);
res.redirect('/notifications');
});
router.get('/api/unread', (req, res) => {
const db = getDb();
const count = db.prepare("SELECT COUNT(*) as cnt FROM notifications WHERE (user_id=? OR user_id IS NULL) AND read=0").get(req.session.userId);
res.json({ unread: count.cnt });
});
module.exports = { router, createNotification, sendNotification, sendSlack };