import { requireMonitor, requireUser, requireRole } from '#api/middlewares/index.js'; import { DbUser, UserType } from '#db/schemas/index.js'; import { RouteMethod } from '#api/RouteDescription.js'; import { getUserById } from '#db/dbAccess/index.js'; import { AlarmDto } from '#dto/AlarmDto.js'; /** * @type {RouteDescription} */ export const alarmByUserRoute = { path: '/user/:id/alarm', methods: { get: new RouteMethod({ middlewares: [requireMonitor], description: 'Get the alarm for a monitored user, if one is set', async method(req, res) { const user = await getUserById(req.params.id); res.send(user.alarm); } }), delete: new RouteMethod({ middlewares: [requireMonitor], description: 'Clear the alarm for a monitored user', async method(req, res) { const user = await getUserById(req.params.id); if (user.alarm) { user.alarm = null; await user.save(); } res.status(204).send(); } }) } }; /** * @type {RouteDescription} */ export const alarmListRoute = { path: '/alarms', methods: { get: new RouteMethod({ middlewares: [requireMonitor], description: 'Get a list of all alarms for monitored users', async method(req, res) { // execute the query asynchronously and manually construct a response, for scaling reasons const users = DbUser.find({ _id: { $in: req.user.monitoredUsers } }) .lean() .cursor(); res.status(200); res.write('{\n'); for await (const user of users) { if (user.alarm) { res.write( `"${user._id}": ${JSON.stringify(user.alarm)},\n` ); } } res.write('}'); res.end(); } }) } }; /** * @type {RouteDescription} */ export const alarmRoute = { path: '/alarm/@me', methods: { get: new RouteMethod({ middlewares: [requireUser], description: "Get the current user's alarm", async method(req, res) { res.send(req.user.alarm); } }), put: new RouteMethod({ middlewares: [requireUser], description: 'Raise an alarm', async method(req, res) { req.user.alarm = await AlarmDto.create(req.body); await req.user.save(); res.status(204).send(); } }), delete: new RouteMethod({ middlewares: [requireUser], description: 'Clear alarm', async method(req, res) { if (req.user.alarm) { req.user.alarm = null; await req.user.save(); } res.status(204).send(); } }) } };