routes.js 2.8 KB

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