Route.js 2.0 KB

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