NotificationLatch/src/routes/api.js

79 lines
1.8 KiB
JavaScript

class ApiRoutes
{
constructor(logger, notificationFacade, config)
{
this.logger = logger;
this.notificationFacade = notificationFacade;
this.authToken = config.authToken;
}
create(express)
{
const router = express.Router();
router.post('/notification', (req, res) => this._wrapAsyncHandler(req, res, this._handlePostNotification.bind(this)));
router.post('/notification/reset', (req, res) => this._wrapAsyncHandler(req, res, this._handleResetNotification.bind(this)));
return router;
}
async _handlePostNotification(req, res)
{
if (req.headers.authorization !== 'Bearer ' + this.authToken)
{
this._logRequestWarning(req, 'Missing or invalid authorization header');
res.sendStatus(401);
return;
}
if (!req.body || !req.body.subject || !req.body.message)
{
this._logRequestWarning(req, 'Missing body, subject and/or message parameters');
res.sendStatus(400);
return;
}
await this.notificationFacade.postNotification(req.body.subject, req.body.message, req.body.priority || 0);
res.sendStatus(200);
}
async _handleResetNotification(req, res)
{
if (!req.body || !req.body.token)
{
this._logRequestWarning(req, 'Missing token');
res.sendStatus(400);
return;
}
await this.notificationFacade.resetNotification(req.body.token);
res.sendStatus(200);
}
async _wrapAsyncHandler(req, res, handler)
{
try
{
await handler(req, res);
}
catch (err)
{
this.logger.error(`Unhandled exception in request handler: ${err}`);
this.logger.verbose(err.stack);
res.sendStatus(500);
}
}
_logRequestWarning(req, message)
{
this.logger.warn(`[${req.ip}] ${message}`);
}
}
module.exports = ApiRoutes;