server/features/dashboard/middlewares/main/middleware.js

  1. /* eslint-disable security/detect-object-injection */
  2. 'use strict';
  3. /**
  4. * Module dependencies, required for ALL Twyr' modules
  5. * @ignore
  6. */
  7. /**
  8. * Module dependencies, required for this module
  9. * @ignore
  10. */
  11. const TwyrBaseMiddleware = require('twyr-base-middleware').TwyrBaseMiddleware;
  12. const TwyrMiddlewareError = require('twyr-middleware-error').TwyrMiddlewareError;
  13. /**
  14. * @class Main
  15. * @extends {TwyrBaseMiddleware}
  16. * @classdesc The Twyr Web Application Server Profile Feature Main middleware - manages CRUD for profile data.
  17. *
  18. *
  19. */
  20. class Main extends TwyrBaseMiddleware {
  21. // #region Constructor
  22. constructor(parent, loader) {
  23. super(parent, loader);
  24. }
  25. // #endregion
  26. // #region Protected methods
  27. async _registerApis() {
  28. try {
  29. const ApiService = this.$dependencies.ApiService;
  30. await ApiService.add(`${this.name}::getFeatures`, this._getFeatures.bind(this));
  31. await super._registerApis();
  32. return null;
  33. }
  34. catch(err) {
  35. throw new TwyrMiddlewareError(`${this.name}::_registerApis`, err);
  36. }
  37. }
  38. async _deregisterApis() {
  39. try {
  40. const ApiService = this.$dependencies.ApiService;
  41. await ApiService.remove(`${this.name}::getFeatures`, this._getFeatures.bind(this));
  42. await super._deregisterApis();
  43. return null;
  44. }
  45. catch(err) {
  46. throw new TwyrMiddlewareError(`${this.name}::_deregisterApis`, err);
  47. }
  48. }
  49. // #endregion
  50. // #region API
  51. async _getFeatures(ctxt) {
  52. try {
  53. let serverModule = this.$parent;
  54. while(serverModule.$parent) serverModule = serverModule.$parent;
  55. const serverFeatureNames = Object.keys(serverModule.$features || {});
  56. const validFeatures = [];
  57. for(let idx = 0; idx < serverFeatureNames.length; idx++) {
  58. const featureModule = serverModule.$features[(serverFeatureNames[idx])];
  59. const dashboardDisplayDetails = await featureModule.getDashboardDisplayDetails(ctxt);
  60. if(!dashboardDisplayDetails) continue;
  61. validFeatures.push(dashboardDisplayDetails);
  62. }
  63. validFeatures.sort((left, right) => {
  64. if(left.name < right.name) return -1;
  65. if(left.name > right.name) return 1;
  66. return 0;
  67. });
  68. if(ctxt.state.user.tenantAttributes['default_route'] !== 'dashboard') { // eslint-disable-line curly
  69. validFeatures.unshift({
  70. 'id': 'home',
  71. 'type': 'dashboard/feature',
  72. 'attributes': {
  73. 'name': 'home',
  74. 'type': 'feature',
  75. 'route': (ctxt.state.user.tenantAttributes['default_route'] && ctxt.state.user.tenantAttributes['default_route'].trim() !== '') ? ctxt.state.user.tenantAttributes['default_route'] : 'application',
  76. 'description': 'Home',
  77. 'icon_type': 'fa', // eslint-disable-line Other choices are md, mdi, img, custom
  78. 'icon_path': 'home'
  79. }
  80. });
  81. }
  82. return { 'data': validFeatures };
  83. }
  84. catch(err) {
  85. throw new TwyrMiddlewareError(`${this.name}::_getFeatures`, err);
  86. }
  87. }
  88. // #endregion
  89. // #region Properties
  90. /**
  91. * @override
  92. */
  93. get basePath() {
  94. return __dirname;
  95. }
  96. // #endregion
  97. }
  98. exports.middleware = Main;