feat: Added notification dialog on frontend
This commit is contained in:
102
src/routes/api/app/index.ts
Normal file
102
src/routes/api/app/index.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { Router } from "express";
|
||||
import { islogged } from "@/utility";
|
||||
import News from "@schemas/News";
|
||||
import Menu from "@schemas/Menu";
|
||||
import Vote from "@schemas/Vote";
|
||||
import { vote } from "@/pipelines/vote";
|
||||
import capability, { Features } from "@/helpers/capability";
|
||||
import Key, { IKey } from "@schemas/Key";
|
||||
import usettings from "@/helpers/usettings";
|
||||
import Grade from "@schemas/Grade";
|
||||
import { createHash } from "node:crypto";
|
||||
import Inbox from "@/schemas/Inbox";
|
||||
|
||||
export const appRouter = Router();
|
||||
|
||||
appRouter.use(islogged)
|
||||
|
||||
appRouter.get("/news", capability.mw(Features.News), async (req, res) => {
|
||||
var news = await News.find({"visible": {"$ne": false}}, {_id: 0, visible: 0}, {sort: {pinned: -1 ,date: -1}})
|
||||
res.send(news)
|
||||
})
|
||||
|
||||
appRouter.get("/news/check", capability.mw(Features.News), async (req, res) => {
|
||||
var news = await News.find({"visible": {"$ne": false}}, {_id: 0, visible: 0}, {sort: {pinned: -1 ,date: -1}})
|
||||
const hash = createHash('sha1')
|
||||
var newsha = hash.update(news.toString()).digest('hex');
|
||||
var check: { hash: string; count: number; } = {hash: newsha, count: news.length}
|
||||
res.send(check)
|
||||
})
|
||||
|
||||
appRouter.get("/menu/:timestamp", capability.mw(Features.Menu), async (req, res) => {
|
||||
var item = await Menu.aggregate(vote(new Date(Number.parseInt(req.params.timestamp)),req.user!._id))
|
||||
var votes = await Vote.find({dom: new Date(Number.parseInt(req.params.timestamp))})
|
||||
var grouped = votes.reduce((x, y) => {
|
||||
x[y.tom].push(y)
|
||||
return x
|
||||
}, {ob: [], kol: []})
|
||||
var count = {
|
||||
ob: (grouped.ob.filter(v=>v.vote == "+").length / grouped.ob.length * 100).toFixed(2),
|
||||
kol: (grouped.kol.filter(v=>v.vote == "+").length / grouped.kol.length * 100).toFixed(2)
|
||||
}
|
||||
var final = {
|
||||
...item[0],
|
||||
stat: count
|
||||
}
|
||||
res.send(final)
|
||||
})
|
||||
|
||||
appRouter.post("/menu/:timestamp", capability.mw(Features.Menu), async (req, res) => {
|
||||
const vote = await Vote.findOneAndUpdate({user: req.user._id, dom: new Date(req.params.timestamp), tom: req.body.tom}, {
|
||||
...req.body,
|
||||
user: req.user._id,
|
||||
dom: new Date(req.params.timestamp),
|
||||
}, {upsert: true, new: true})
|
||||
if (vote) {
|
||||
res.send({status: 200})
|
||||
} else {
|
||||
res.sendStatus(500)
|
||||
}
|
||||
})
|
||||
|
||||
appRouter.get("/keys", capability.mw(Features.Key), async (req, res) => {
|
||||
var keys = await Key.find<Pick<IKey, "room">>({tb: {$exists: false}}, {room: 1}, {sort: {room: 1}})
|
||||
var occ = keys.map(x=>x.room)
|
||||
var all = usettings.settings.keyrooms
|
||||
var free = all.filter(x=>!occ.includes(x)).sort().map(x => {
|
||||
return { room: x }
|
||||
})
|
||||
var final = [...keys, ...free]
|
||||
res.send(final)
|
||||
})
|
||||
|
||||
appRouter.get("/clean/:date", capability.mw(Features.Clean), async (req, res) => {
|
||||
res.send(await Grade.findOne({
|
||||
room: req.user.room,
|
||||
date: new Date(req.params.date)
|
||||
}))
|
||||
})
|
||||
|
||||
appRouter.get("/notif/check", capability.mw(Features.Notif), async (req, res) => {
|
||||
var result = await Inbox.find({rcpt: req.user._id, $nor: [{ack: req.user._id}]}, {message: 1, sentDate: 1})
|
||||
if (result) {
|
||||
res.send(result)
|
||||
} else {
|
||||
res.send([])
|
||||
}
|
||||
})
|
||||
|
||||
appRouter.post("/notif/:id/ack", capability.mw(Features.Notif), async (req, res) => {
|
||||
var result = await Inbox.findById(req.params.id)
|
||||
if (result) {
|
||||
if (result.rcpt.includes(req.user._id) && !result.ack.includes(req.user._id)) {
|
||||
result.ack.push(req.user._id)
|
||||
await result.save({})
|
||||
res.send({status: 200})
|
||||
} else {
|
||||
res.status(403).send({status: 401, message: "User doesn't have access or message already acknowledged"})
|
||||
}
|
||||
} else {
|
||||
res.status(404).send({status: 404, message: "Message not found"})
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user