Route.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const nodePath = require('path');
  2. const JWT = require('jsonwebtoken');
  3. const db = require('knex')({
  4. client: process.env.DB_CLIENT,
  5. connection: {
  6. host: process.env.DB_HOST,
  7. user: process.env.DB_USER,
  8. password: process.env.DB_PASSWORD,
  9. database: process.env.DB_DATABASE,
  10. filename: nodePath.join(__dirname, '..', '..', '..', 'database.sqlite')
  11. }
  12. });
  13. const moment = require('moment');
  14. const log = require('../utils/Log');
  15. class Route {
  16. constructor(path, method, options) {
  17. if (!path) throw new Error('Every route needs a URL associated with it.');
  18. if (!method) throw new Error('Every route needs its method specified.');
  19. this.path = path;
  20. this.method = method;
  21. this.options = options || {};
  22. }
  23. authorize(req, res) {
  24. if (this.options.bypassAuth) return this.run(req, res, db);
  25. if (!req.headers.authorization) return res.status(401).json({ message: 'No authorization header provided' });
  26. const token = req.headers.authorization.split(' ')[1];
  27. if (!token) return res.status(401).json({ message: 'No authorization header provided' });
  28. return JWT.verify(token, process.env.SECRET, async (error, decoded) => {
  29. if (error) {
  30. log.error(error);
  31. return res.status(401).json({ message: 'Your token appears to be invalid' });
  32. }
  33. const id = decoded ? decoded.sub : '';
  34. const iat = decoded ? decoded.iat : '';
  35. const user = await db.table('users').where({ id }).first();
  36. if (!user) return res.status(401).json({ message: 'Invalid authorization' });
  37. if (iat && iat < moment(user.passwordEditedAt).format('x')) return res.status(401).json({ message: 'Token expired' });
  38. if (!user.enabled) return res.status(401).json({ message: 'This account has been disabled' });
  39. return this.run(req, res, db, user);
  40. });
  41. }
  42. run(req, res, db) { // eslint-disable-line no-unused-vars
  43. return;
  44. }
  45. error(res, error) {
  46. log.error(error);
  47. return res.status(500).json({ message: 'There was a problem parsing the request' });
  48. }
  49. }
  50. module.exports = Route;