import express, { Request } from "express"; import { getLogin } from "../auth"; import { parseToken } from "../utils"; import { getNotificationSettings, saveNotificationSettings } from "../notifikace"; import { subscribePush, unsubscribePush, getVapidPublicKey, findLoginByEndpoint } from "../pushReminder"; import { addChoice } from "../service"; import { getWebsocket } from "../websocket"; import { UpdateNotificationSettingsData } from "../../../types"; const router = express.Router(); /** Vrátí nastavení notifikací pro přihlášeného uživatele. */ router.get("/settings", async (req, res, next) => { const login = getLogin(parseToken(req)); try { const settings = await getNotificationSettings(login); res.status(200).json(settings); } catch (e: any) { next(e) } }); /** Uloží nastavení notifikací pro přihlášeného uživatele. */ router.post("/settings", async (req: Request<{}, any, UpdateNotificationSettingsData["body"]>, res, next) => { const login = getLogin(parseToken(req)); try { const settings = await saveNotificationSettings(login, { ntfyTopic: req.body.ntfyTopic, discordWebhookUrl: req.body.discordWebhookUrl, teamsWebhookUrl: req.body.teamsWebhookUrl, enabledEvents: req.body.enabledEvents, reminderTime: req.body.reminderTime, }); res.status(200).json(settings); } catch (e: any) { next(e) } }); /** Vrátí veřejný VAPID klíč pro registraci push notifikací. */ router.get("/push/vapidKey", (req, res) => { const key = getVapidPublicKey(); if (!key) { return res.status(503).json({ error: "Push notifikace nejsou nakonfigurovány" }); } res.status(200).json({ key }); }); /** Přihlásí uživatele k push připomínkám. */ router.post("/push/subscribe", async (req, res, next) => { const login = getLogin(parseToken(req)); try { if (!req.body.subscription) { return res.status(400).json({ error: "Nebyla předána push subscription" }); } if (!req.body.reminderTime) { return res.status(400).json({ error: "Nebyl předán čas připomínky" }); } await subscribePush(login, req.body.subscription, req.body.reminderTime); res.status(200).json({}); } catch (e: any) { next(e) } }); /** Odhlásí uživatele z push připomínek. */ router.post("/push/unsubscribe", async (req, res, next) => { const login = getLogin(parseToken(req)); try { await unsubscribePush(login); res.status(200).json({}); } catch (e: any) { next(e) } }); /** Rychlá akce z push notifikace — nastaví volbu bez JWT (identita přes subscription endpoint). */ router.post("/push/quickChoice", async (req, res, next) => { try { const { endpoint } = req.body; if (!endpoint) { return res.status(400).json({ error: "Nebyl předán endpoint" }); } const login = await findLoginByEndpoint(endpoint); if (!login) { return res.status(404).json({ error: "Subscription nenalezena" }); } const data = await addChoice(login, false, 'NEOBEDVAM', undefined, undefined); getWebsocket().emit("message", data); res.status(200).json({}); } catch (e: any) { next(e) } }); export default router;