routes.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. const c = require('./controllers');
  2. const utils = require('./core/utils');
  3. const multer = require('multer');
  4. function initRoutes(app, config) {
  5. const misc = new c.MiscController(config);
  6. const reader = new c.ReaderController(config);
  7. const worker = new c.WorkerController(config);
  8. //access
  9. const [aAll, aNormal, aSite, aReader, aOmnireader] = // eslint-disable-line no-unused-vars
  10. [config.mode, 'normal', 'site', 'reader', 'omnireader'];
  11. //multer
  12. const storage = multer.diskStorage({
  13. destination: (req, file, cb) => {
  14. cb(null, config.uploadDir);
  15. },
  16. filename: (req, file, cb) => {
  17. cb(null, utils.randomHexString(30));
  18. }
  19. });
  20. const upload = multer({ storage, limits: {fileSize: config.maxUploadFileSize} });
  21. //routes
  22. const routes = [
  23. ['POST', '/api/config', misc.getConfig.bind(misc), [aAll], {}],
  24. ['POST', '/api/reader/load-book', reader.loadBook.bind(reader), [aAll], {}],
  25. ['POST', '/api/reader/storage', reader.storage.bind(reader), [aAll], {}],
  26. ['POST', '/api/reader/upload-file', [upload.single('file'), reader.uploadFile.bind(reader)], [aAll], {}],
  27. ['POST', '/api/worker/get-state', worker.getState.bind(worker), [aAll], {}],
  28. ];
  29. //to app
  30. for (let route of routes) {
  31. let callbacks = [];
  32. let [httpMethod, path, controllers, access, options] = route;
  33. let controller = controllers;
  34. if (Array.isArray(controllers)) {
  35. controller = controllers[controllers.length - 1];
  36. callbacks = controllers.slice(0, -1);
  37. }
  38. access = new Set(access);
  39. let callback = () => {};
  40. if (access.has(config.mode)) {//allowed
  41. callback = async function(req, res) {
  42. try {
  43. const result = await controller(req, res, options);
  44. if (result !== false)
  45. res.send(result);
  46. } catch (e) {
  47. res.status(500).send({error: e.message});
  48. }
  49. };
  50. } else {//forbidden
  51. callback = async function(req, res) {
  52. res.status(403);
  53. };
  54. }
  55. callbacks.push(callback);
  56. switch (httpMethod) {
  57. case 'GET' :
  58. app.get(path, ...callbacks);
  59. break;
  60. case 'POST':
  61. app.post(path, ...callbacks);
  62. break;
  63. default:
  64. throw new Error(`initRoutes error: unknown httpMethod: ${httpMethod}`);
  65. }
  66. }
  67. }
  68. module.exports = {
  69. initRoutes
  70. }