Files
ipwa-backend/src/routes/api/app/index.ts

102 lines
3.7 KiB
TypeScript

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"})
}
})