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({ exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, 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 ?? 'null'); } }), delete: new RouteMethod({ exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, 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({ exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, 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 }, alarm: { $exists: true, $ne: null } }) .lean() .cursor(); res.status(200); res.write('{\n'); let first = true; for await (const user of users) { res.write( `${first ? '' : ','}"${user._id}": ${JSON.stringify(user.alarm)}\n` ); first = false; } res.write('}'); res.end(); } }) } }; /** * @type {RouteDescription} */ export const alarmRoute = { path: '/alarm/@me', methods: { get: new RouteMethod({ exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, middlewares: [requireUser], description: "Get the current user's alarm", async method(req, res) { res.send(req.user.alarm ?? 'null'); } }), put: new RouteMethod({ exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, exampleBody: { reason: 'fall' }, middlewares: [requireUser], description: 'Raise an alarm (enum: one of "fall" or "toilet")', async method(req, res) { req.user.alarm = await AlarmDto.create(req.body); await req.user.save(); res.status(204).send(); } }), delete: new RouteMethod({ exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, 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(); } }) } };