5f03471541
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 21s
CI / Generate TypeScript types (pull_request) Successful in 47s
CI / Build server (push) Successful in 27s
CI / Server unit tests (pull_request) Successful in 20s
CI / Build server (pull_request) Successful in 27s
CI / Build client (pull_request) Successful in 40s
CI / Playwright E2E tests (pull_request) Successful in 1m20s
CI / Build and push Docker image (pull_request) Has been skipped
CI / Notify (pull_request) Has been skipped
CI / Build client (push) Successful in 4m13s
CI / Playwright E2E tests (push) Successful in 6m7s
CI / Build and push Docker image (push) Has been skipped
CI / Notify (push) Successful in 6s
68 lines
2.5 KiB
TypeScript
68 lines
2.5 KiB
TypeScript
import express, { Request } from "express";
|
|
import { getLogin } from "../auth";
|
|
import { parseToken } from "../utils";
|
|
import { getNotificationSettings, saveNotificationSettings } from "../notifikace";
|
|
import { subscribePush, unsubscribePush, getVapidPublicKey } from "../pushReminder";
|
|
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) }
|
|
});
|
|
|
|
export default router;
|