UpgradeService.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. 'use strict';
  2. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  3. /*
  4. *+------------------------------------------------------------------------+
  5. *| Licensed Materials - Property of IBM
  6. *| IBM Cognos Products: Dashboard
  7. *| (C) Copyright IBM Corp. 2017, 2020
  8. *|
  9. *| US Government Users Restricted Rights - Use, duplication or disclosure
  10. *| restricted by GSA ADP Schedule Contract with IBM Corp.
  11. *+------------------------------------------------------------------------+
  12. */
  13. define(['../../lib/@waca/upgrades/lib/UpgradeRunner', '../../lib/@waca/core-client/js/core-client/utils/ClassFactory', '../../app/nls/StringResources'], function (UpgradeRunner, ClassFactory, StringResources) {
  14. var UpgradeService = function () {
  15. /**
  16. * @param {object} options
  17. * @param {object} options.upgrades - a list of paths to upgrades
  18. */
  19. function UpgradeService() {
  20. _classCallCheck(this, UpgradeService);
  21. //default version meaning no upgrades will be performed
  22. this._latestDashboardSpecVersion = 0;
  23. }
  24. UpgradeService.prototype.getLatestDashboardSpecVersion = function getLatestDashboardSpecVersion() {
  25. return parseInt(this._latestDashboardSpecVersion);
  26. };
  27. UpgradeService.prototype.initialize = function initialize(glassContext) {
  28. var _this = this;
  29. return glassContext.getCoreSvc('.Perspective').getModel('dashboard').then(function (model) {
  30. var upgradesPath = model.content.options.config.upgrades;
  31. if (!upgradesPath) {
  32. return Promise.resolve();
  33. }
  34. return ClassFactory.loadModule(upgradesPath).then(function (upgrades) {
  35. var upgradeVersions = Object.keys(upgrades);
  36. if (_this._isValidUpgrade(upgradeVersions)) {
  37. _this._latestDashboardSpecVersion = upgradeVersions[upgradeVersions.length - 1];
  38. _this.upgradeRunner = new UpgradeRunner({
  39. migrations: upgrades
  40. });
  41. }
  42. }).catch(function (error) {
  43. _this._logger = glassContext.getCoreSvc('.Logger');
  44. _this._logger.error(error);
  45. });
  46. });
  47. };
  48. /**
  49. * Verifies if an upgrade version is valid by performing the following checks
  50. * Checks if the version is an empty string or a string that does not translate to a number then returns false
  51. * Converts the version from string to a number and checks if its an integer, if its not an integer returns false
  52. * @param {object} upgradeVersions - an object containing mappings of upgrade version number and upgrade paths
  53. *
  54. * @return {Boolean} true if the version is valid else false
  55. */
  56. UpgradeService.prototype._isValidUpgrade = function _isValidUpgrade(upgradeVersions) {
  57. if (!upgradeVersions.length) {
  58. return false;
  59. }
  60. var latestUpgradeVersion = upgradeVersions[upgradeVersions.length - 1];
  61. if (!latestUpgradeVersion || isNaN(latestUpgradeVersion)) {
  62. return false;
  63. }
  64. return Number.isInteger(Number(latestUpgradeVersion));
  65. };
  66. /**
  67. * Do we need to perform an upgrade?
  68. *
  69. * @param {object} spec - spec to upgrade
  70. * @param {number} requestedVersion - requested version
  71. *
  72. * @return {Boolean}
  73. */
  74. UpgradeService.prototype.needsUpgrade = function needsUpgrade(spec, requestedVersion) {
  75. if (this.upgradeRunner) {
  76. return this.upgradeRunner.needsUpgrade(spec, requestedVersion);
  77. }
  78. return false;
  79. };
  80. /**
  81. * Upgrade board spec
  82. *
  83. * @param {object} spec - spec to upgrade
  84. * @param {number} requestedVersion - requested version
  85. * @param {object} [data] - additional data to pass into upgrades
  86. *
  87. * @return {Promise} Promise to be resolved when upgrade complete
  88. */
  89. UpgradeService.prototype.upgrade = function upgrade(spec, requestedVersion, data) {
  90. if (this.upgradeRunner) {
  91. return this.upgradeRunner.upgrade(spec, requestedVersion, data).then(function (result) {
  92. if (result) {
  93. // IF we've done a query to perform the upgrade and the user has write access
  94. // then we should let them know that they should save the dashboard for performance reasons
  95. if (result.upgradePerformed && data.hasWrite && result.obj.queriedForUpgrade) {
  96. delete result.obj.queriedForUpgrade;
  97. if (!data.noToast) {
  98. data.dashboardApi.showToast(StringResources.get('toastUpgradeDone'), {
  99. type: 'info'
  100. });
  101. }
  102. }
  103. return result.obj;
  104. } else {
  105. // TODO: log the error
  106. // no result? don't blow up, return the spec as is
  107. return spec;
  108. }
  109. });
  110. } else {
  111. if (requestedVersion && spec.version !== requestedVersion) {
  112. return Promise.reject(new Error('The requested spec upgrade version is not available'));
  113. } else {
  114. return Promise.resolve(spec);
  115. }
  116. }
  117. };
  118. UpgradeService.prototype.destroy = function destroy() {
  119. this.upgradeRunner = null;
  120. };
  121. return UpgradeService;
  122. }();
  123. return UpgradeService;
  124. });
  125. //# sourceMappingURL=UpgradeService.js.map