Name

sn_appclient.ProductsDao

Description

for all CRUD operations on products table

Script

var ProductsDao = Class.create();
ProductsDao.prototype = {
  initialize: function() {
      this.appsData = new AppsData();
  },

  getProducts: function(searchExpression, filterParams, apiUtil) {
      var products = [];
      var gr = new GlideRecord("sn_appclient_product");
      var encodedQuery = "";
      if (searchExpression)
          encodedQuery = CommonUtils.getEncodedQueryFromExpression(searchExpression, "name");
      var productFamily = this.getProductFamily(filterParams);
      if (productFamily && productFamily.length > 0)
          encodedQuery = CommonUtils.appendEncodedQueryFromproductFamily(searchExpression, encodedQuery, productFamily);
      if (encodedQuery.length !== 0) {
          gr.addEncodedQuery(encodedQuery);
          gr.query();
          while (gr.next()) {
              var productId = gr.getValue("id");
              var productName = gr.getValue("name");
              var family = gr.getValue("family");
              products.push({
                  productId: productId,
                  productName: productName,
                  productFamily: family,
                  source: 'store'
              });
          }
      }
      var productsForFilters = this.getProductForApps(apiUtil);
      var filteredProducts = CommonUtils.getUnionOfProducts(products, productsForFilters);
      return filteredProducts;
  },
  getProductFamily: function(filterParams) {
      var productFamily = [];
      if (filterParams.hasOwnProperty('productFamily'))
          productFamily = filterParams['productFamily'];
      return productFamily;
  },
  getProductForApps: function(appManagerAPIUtil) {
      var args = {};
      args.searchTerm = appManagerAPIUtil.getSearchTerm();
      args.filterParams = appManagerAPIUtil.getRequestBody();
      args.encodedQuery = this._getEncodedQueryBySearchContext(args);
      var gr = new GlideRecord('sys_remote_app');
      gr.addEncodedQuery(args.encodedQuery);
      gr.query();
      var productsForFilters = [];
      var productIdMap = {};
      while (gr.next()) {
          var products = JSON.parse(gr.products);
          if (products && products.length > 0)
              for (var i = 0; i < products.length; i++) {
                  var productFamily = products[i];
                  var productList = productFamily.productList;
                  for (var proIndex = 0; proIndex < productList.length; proIndex++) {
                      var newProduct = productList[proIndex];
                      if (!productIdMap.hasOwnProperty(newProduct.productId)) {
                          productIdMap[newProduct.productId] = newProduct;
                          productsForFilters.push({
                              productId: newProduct.productId,
                              productName: newProduct.productName,
                              productFamily: newProduct.product_family,
                              source: 'store'
                          });
                      }
                  }
              }
      }
      return productsForFilters;
  },
  _getEncodedQueryBySearchContext: function(args) {
      var encodedQuery = "shared_internally=" + !!args.sharedInternally;
      if (args.searchTerm)
          encodedQuery += "^GOTO123TEXTQUERY321=" + args.searchTerm;
      if (args.filterParams && Object.keys(args.filterParams).length > 0)
          encodedQuery = this._appendEncodedQueryByFilterParams(encodedQuery, args.filterParams);
      if (!gs.getUser().hasRole("maint"))
          encodedQuery += "^hide_on_ui=false";
      return encodedQuery;
  },
  _appendEncodedQueryByFilterParams: function(encodedQuery, filterParams) {
      var LOBs = [];
      var productFamily = [];
      var adoptionBluePrint = [];
      var offeredBy = [];
      var listings = [];
      if (filterParams.hasOwnProperty('productFamily'))
          LOBs = filterParams['productFamily'];
      if (filterParams.hasOwnProperty('productFamily'))
          productFamily = filterParams['productFamily'];
      if (filterParams.hasOwnProperty('offeredBy'))
          offeredBy = filterParams['offeredBy'];
      if (filterParams.hasOwnProperty('adoptionBlueprint'))
          adoptionBluePrint = filterParams['adoptionBlueprint'];
      if (filterParams.hasOwnProperty('listings'))
          listings = filterParams['listings'];

      var isfreeToTryPresent = listings.indexOf('free_to_try') != -1;
      if (isfreeToTryPresent) {
          encodedQuery += "^price_type=free";
      }
      if (offeredBy != null && offeredBy.length == 1)
          if (offeredBy[0] === 'partners')
              encodedQuery += "^vendor!=" + 'servicenow';
          else
              encodedQuery += "^vendor=" + offeredBy[0];

      if (LOBs != null && LOBs.length > 0)
          for (i = 0; i < LOBs.length; i++) {
              if (i > 0) encodedQuery += "^OR";
              else encodedQuery += "^";
              encodedQuery += "lobLIKE" + LOBs[i];
          }
      if (productFamily != null && productFamily.length > 0)
          for (i = 0; i < productFamily.length; i++) {
              if (i > 0 || (LOBs && LOBs.length > 0)) encodedQuery += "^OR";
              else encodedQuery += "^";
              encodedQuery += "productsLIKE" + productFamily[i];
          }
      if (adoptionBluePrint != null && adoptionBluePrint.length > 0) {
          adoptionBluePrintQuery = this.getEncodedQueryByAdoptionBluePrint(adoptionBluePrint);
          appNames = new AppManagerFiltersUtil().getFilteredIdsWithAdoptionBluePrint(adoptionBluePrintQuery);
          if (appNames != null && appNames.length > 0)
              for (i = 0; i < appNames.length; i++) {
                  if (i > 0) encodedQuery += "^OR";
                  else encodedQuery += "^";
                  encodedQuery += "name=" + appNames[i];
              }
      }
      return encodedQuery;
  },
  getEncodedQueryByAdoptionBluePrint: function(adoptionBluePrint) {
      var adoptionBluePrintQuery = "";
      for (var i = 0; i < adoptionBluePrint.length; i++) {
          if (i > 0) adoptionBluePrintQuery += "^OR";
          adoptionBluePrintQuery += "objective.sys_id=" + adoptionBluePrint[i];
      }
      return adoptionBluePrintQuery;
  },
  getAllAppsByProductId: function(productId) {
      // get Installed apps
      var gr = new GlideRecord("sys_store_app");
      gr.addEncodedQuery('active=true^products!=[]^productsLIKE' + productId);
      gr.query();
      var installedAppsMap = {};
      while (gr.next()) {
          var sourceAppId = gr.sys_id;
          var app = this.appsData.getAppInfoFromInstance(sourceAppId, gr);
          app.hide_on_ui = gr.getValue('hide_on_ui');
          app.licensable = gr.getValue('licensable');
          app.isUpdateAvailable = app.version != app.latest_version ? true : false;
          if (this.appsData.isVisible(gr)) installedAppsMap[sourceAppId] = app;
      }

      // get available apps
      gr = new GlideRecord("sys_remote_app");
      gr.addEncodedQuery('products!=[]^productsLIKE' + productId);
      gr.query();
      var availableAppsMap = {};
      while (gr.next()) {
          sourceAppId = gr.source_app_id;
          if (!installedAppsMap[sourceAppId]) {
              app = this.appsData.getAppInfoFromInstance(sourceAppId, gr);
              app.hide_on_ui = gr.getValue('hide_on_ui');
              app.licensable = gr.getValue('licensable');
              if (this.appsData.isVisible(gr)) availableAppsMap[sourceAppId] = app;
          }
      }
      var installedApps = CommonUtils.getValues(installedAppsMap);
      var availableApps = CommonUtils.getValues(availableAppsMap);
      return installedApps.concat(availableApps);
  },
  _getAppDetails: function( /*GlideRecord sys_remote_app | sys_store_app */ gr) {
      var app = {};
      app.block_install = gr.getValue('block_install');
      app.compatibilities = gr.getValue('compatibilities');
      app.dependencies = gr.getValue('dependencies');
      app.enforce_license = gr.getValue('enforce_license');
      app.hide_on_ui = gr.getValue('hide_on_ui');
      app.source_app_id = gr.getValue('source_app_id');
      app.installed_as_dependency = gr.getValue('installed_as_dependency');
      app.is_store_app = gr.getValue('is_store_app');
      app.licensable = gr.getValue('licensable');
      app.logo = this.appsData.getLogo(gr);
      app.short_description = gr.getValue('short_description');
      app.needs_app_engine_licensing = gr.getValue('needs_app_engine_licensing');
      app.name = gr.getValue('name');
      app.price_type = gr.getValue('price_type');
      app.latest_version = gr.getValue('latest_version');
      app.uninstall_blocked = gr.getValue('uninstall_blocked');
      app.product = JSON.parse(gr.getValue('products'));
      app.scope = gr.getValue('scope');
      return app;
  },

  /**
   * Synchronize products data from sys_remote_app, and sys_store_app tables
   */
  syncProductsData: function() {
      gs.debug("Running Product Data Sync");
      //prepare product map from sys_remote_app table
      var encodedQuery = 'products!=[]';
      var map = this._getProductMap(Constants.TABLE_SYS_REMOTE_APP, encodedQuery, {});
      //prepare product map from sys_store_app table
      encodedQuery = 'active=true^products!=[]';
      map = this._getProductMap(Constants.TABLE_SYS_STORE_APP, encodedQuery, map);
      //reset products data table with product map
      gr = new GlideRecord("sn_appclient_product");
      gr.query();
      var deleteCount = 0;
      var insertCount = 0;
      while (gr.next()) {
          var productId = gr.getValue("id");
          if (map[productId]) {
              delete map[productId];
          } else {
              gr.deleteRecord();
              deleteCount++;
          }
      }
      for (var key in map) {
          gr.setValue("id", key);
          gr.setValue("name", map[key].productName);
          gr.setValue("family", map[key].product_family);
          gr.insert();
          insertCount++;
      }
      gs.debug("Completed Product Data Sync with {0} insertions, and {1} deletions", insertCount, deleteCount);
  },

  _getProductMap: function(table, encodedQuery, productMap) {
      var map = productMap || {};
      var gr = new GlideRecord(table);
      gr.addEncodedQuery(encodedQuery);
      gr.query();
      while (gr.next()) {
          productFamilies = JSON.parse(gr.getValue("products"));
          productFamilies.forEach(function(family) {
              var productList = family.productList || [];
              productList.forEach(function(product) {
                  map[product.productId] = product;
              });
          });
      }
      return map;
  },

  type: 'ProductsDao'
};

Sys ID

61cab34d77fe5510c918256a5b5a990b

Offical Documentation

Official Docs: