Name

global.VAAISearchHelperVancouver

Description

No description available

Script

var VAAISearchHelperVancouver = Class.create();

/**
* Generates Genius result card response 
*/
VAAISearchHelperVancouver.generateGeniusCardResponse = function(searchMetadata, geniusSearchResults, vaSystem, vaInputs, vaVars, vaContext, dynamicChoiceNodeName) {
  var logger = VAAISearchHelperTokyo.getLogger(vaVars.loggingContext);

  try {
  	return global.VAAISearchHelperVancouver.generateSearchCardResponse(
  		global.AISearchConstants.RESULT_TYPE_GENIUS, searchMetadata, geniusSearchResults, vaSystem, vaInputs, vaVars, vaContext, dynamicChoiceNodeName, 0);
  } catch (ex) {
  	logger.error('VAAISearchHelperVancouver: Error generating genius card response: {0}', ex);
  	return "";
  }
};

/**
* Generates Regular result card response 
*/
VAAISearchHelperVancouver.generateSearchResultsResponse = function(searchMetadata, searchResults, vaSystem, vaInputs, vaVars, vaContext, dynamicChoiceNodeName) {
  var logger = VAAISearchHelperTokyo.getLogger(vaVars.loggingContext);
  logger.info('VAAISearchHelperVancouver: Generating search result response');

  try {
  	var metadata = JSON.parse(searchMetadata);
  	var response = JSON.parse(searchResults);

  	// Only show first three search results - GroupedPartsOutMsg is limited to 3
  	var maxResults = VAAISearchHelperUtah.getRegularSearchDisplaySize(response);

  	for (var i = 0; i < maxResults; i++) {
  		var searchResult = response[i];
  		var propValues = searchResult.propValues;
  		var model = propValues.model;

  		if (model.sysId == vaInputs.display_options) {
  			var result = VAAISearchHelperTokyo.stripHighlightTags(JSON.stringify(searchResult));

  			return global.VAAISearchHelperVancouver.generateSearchCardResponse (
  				global.AISearchConstants.RESULT_TYPE_SEARCH, searchMetadata, result, vaSystem, vaInputs, vaVars, vaContext, dynamicChoiceNodeName, i);
  		}
  	}

  	return "";
  } catch(ex) {
  	logger.error('VAAISearchHelperVancouver: Error generating search response: {0}', ex);
  	return "";
  }
};

VAAISearchHelperVancouver.generateSearchCardResponse = function(resultType, searchMetadata, searchResults, vaSystem, vaInputs, vaVars, vaContext, dynamicChoiceNodeName, order) {
  var metadata = JSON.parse(searchMetadata);
  var searchResponse = JSON.parse(searchResults);

  VAAISearchHelperTokyo.getLogger(vaVars.loggingContext).info('VAAISearchHelperVancouver: Generating search result - result type:{0}', resultType);

  var cardCreator = global.VASearchCardCreatorFactoryVancouver.getCreator(resultType, metadata, searchResponse, vaSystem, vaInputs, vaVars, vaContext, order, dynamicChoiceNodeName);

  // Special case for IAR
  if (!gs.nil(searchResponse.auto_resolution_url))
  	cardCreator.setURL(searchResponse.auto_resolution_url);

  return cardCreator.createCard();
};

VAAISearchHelperVancouver.calculateResultsToDisplay = function(vaSystem, vaInputs, vaVars, vaContext) {
  var resultsToDisplay = "error";

  try {
      var errors = vaVars.errors;
      if (gs.nil(vaVars.errors))
          errors = [];
  	else {
  		errors = errors.split(',');}

      var isError = vaVars.didFdihInvocationTimeOut ||
      (gs.nil(vaVars.geniusResults) && gs.nil(vaVars.searchResults)) || errors.length > 0;

      var isGeniusResult = global.VAAISearchHelperVancouver.shouldDisplayGeniusResult(vaVars.geniusResults, vaVars.loggingContext, vaContext);

      var isRegularResult = !gs.nil(vaVars.searchResults);

      if (isError)
          resultsToDisplay = "error";
      else if(isGeniusResult)
          resultsToDisplay = "geniusResult";
      else if(isRegularResult)
          resultsToDisplay = "regularResult";
  } catch (e) {
      global.VAAISearchHelperTokyo.getLogger(vaVars.loggingContext).warn('Unable to calculate which results to display, falling back to error branch.');
  }

  return resultsToDisplay;
};

VAAISearchHelperVancouver.shouldDisplayGeniusResult = function(geniusSearchResults, loggingContext, vaContext) {
  try {
  	if(gs.nil(geniusSearchResults))
  		return false;

  	var searchResponse = JSON.parse(geniusSearchResults);
  	var model = searchResponse.propValues.model;

  	if(searchResponse.template === 'sn-va-genius-person-card') {
  		return !gs.nil(model["columns.table"]) && !gs.nil(model["columns.sys_id"]);
  	} else if (searchResponse.template === 'sn-va-genius-catalog-card'){
  		return VAAISearchHelperVancouver.isCatalogOrKnowledgeSearchGeniusResultValid(searchResponse);
  	} else if(searchResponse.template === 'sn-va-genius-qa-card'){
  		// For GenAI results, additionally check if the device type is supported
  		var cardName = searchResponse.propValues.cardName.toString();
  		if (cardName == "GAIQACard") {
  			var hasGenAISupport = VAAISearchHelperVancouver.isGenAIGeniusResultSupportedOnDevice(searchResponse, vaContext, loggingContext);
  			if (!hasGenAISupport)
  				return false;
  		}

  		return VAAISearchHelperVancouver.isCatalogOrKnowledgeSearchGeniusResultValid(searchResponse);
  	} else {
  		return false;
  	}
  } catch(ex){
  	VAAISearchHelper.getLogger(loggingContext).error(
  		'VAAISearchHelper: Error calculating whether to show genius result: {0}', ex);
  	return false;
  }
};

VAAISearchHelperVancouver.isCatalogOrKnowledgeSearchGeniusResultValid = function(searchResponse) {
  var model = searchResponse.propValues.model;
  var header = searchResponse.propValues.identifier;
  var description = searchResponse.propValues.description;
  var table = model["columns.table"];
  var sys_id = model["columns.sys_id"];

  return (!gs.nil(table) && !gs.nil(sys_id)) || !gs.nil(header) || !gs.nil(description);
};

VAAISearchHelperVancouver.isGenAIGeniusResultSupportedOnDevice = function(searchResponse, vaContext, loggingContext) {
  var hasGenAISupport = false;
  var extensionPoints = new GlideScriptedExtensionPoint().getExtensions("global.NowAssistDeviceSupportExtensionPoint");

  for (var i = 0; i < extensionPoints.length; i++) {
  	var currentResult = extensionPoints[i].isGenAIGeniusTemplateSupported(vaContext.deviceType);
  	hasGenAISupport = hasGenAISupport || currentResult;
  }

  VAAISearchHelper.getLogger(loggingContext).info("VAAISearchHelperVancouver: GenAI results supported on deviceType {0} : {1}", vaContext.deviceType, hasGenAISupport);

  return hasGenAISupport;
};

VAAISearchHelperVancouver.createResultMap = function(searchMetadata, searchResults, vaSystem, vaInputs, vaVars, vaContext) {
  
  var logger = VAAISearchHelperTokyo.getLogger(vaVars.loggingContext);
  try {
  	var response = JSON.parse(searchResults);
  	var groupedResultsMap = {};
  	var maxResults = VAAISearchHelperUtah.getRegularSearchDisplaySize(response);

  	for (var i = 0; i < maxResults; i++) {
  		var sysId = response[i].propValues.model.sysId;
  		var title = VAAISearchHelperVancouver.buildSearchTitle(response[i].propValues, vaContext);
  		groupedResultsMap[sysId] = GlideStringUtil.unEscapeHTML(title);

  		// create SEARCH_RESULT_DISPLAYED event.
  		// This createResultMap method can be called multiple times. 
  		// So, we need to rely on this flag to avoid sending the same payload multiple times.
  		var shouldSend = vaVars.sendDisplayedSearchResultClickMetricsEvent;

  		if (!gs.nil(shouldSend) && shouldSend) {
  			var searchResult = response[i];
  			var metadata = JSON.parse(searchMetadata);
  			VAAISearchClickMetricsURLHelper.createDisplayedSearchResultEventMetrics(metadata, searchResult, vaSystem, vaInputs, vaVars, i); 
  		}
  	}

  	return groupedResultsMap;
  } catch(ex) {
  	logger.error('VAAISearchHelperVancouver: Error generating regular search result map: {0}', ex);
  	// Return any links that have been successfully generated
  	return groupedResultsMap;
  }

};

VAAISearchHelperVancouver.buildSearchTitle = function(props, vaContext) {
  var titleParts = [];
  var titleFields = [
  	"prefix",
  	"titleEmoji",
  	"title"
  ];

  for (var i in titleFields) {
  	var titleField = titleFields[i];
  	var titleFieldValue = props[titleField];

  	if (!gs.nil(titleFieldValue)) {
  		// Translate the prefix field
  		if (titleField == "prefix") {
  			if (titleFieldValue == "(Catalog)")
  				titleFieldValue = gs.getMessageLang("(Catalog)", vaContext.getRequesterLang());
  			if (titleFieldValue == "(People)")
  				titleFieldValue = gs.getMessageLang("(People)", vaContext.getRequesterLang());
  			if (titleFieldValue == "(KB)")
  				titleFieldValue = gs.getMessageLang("(KB)", vaContext.getRequesterLang());
  		}

  		titleParts.push(titleFieldValue);
  	}
  }

  var title = titleParts.join(" ");
  return VAAISearchHelperTokyo.stripHighlightTags(title);
};

VAAISearchHelperVancouver.processSearchHelpfulMetrics = function(searchMetadata, vaSystem, vaInputs, vaVars) {

  if (!global.VAClickMetrics.isAISearchClickMetricsAllowed())
  	return {};

  var collector = new global.VAAISearchHelpfulMetricCollector(JSON.parse(searchMetadata), vaSystem, vaInputs, vaVars);

  collector.collect();

  collector.sendOutMetrics();
};

VAAISearchHelperVancouver.processSearchFallbackMetrics = function(searchMetadata, vaSystem, vaInputs, vaVars) {

  if (!global.VAClickMetrics.isAISearchClickMetricsAllowed())
  	return {};

  var collector = new global.VAAISearchFallbackMetricCollector(JSON.parse(searchMetadata), vaSystem, vaInputs, vaVars);

  collector.collect();

  collector.sendOutMetrics();
};

VAAISearchHelperVancouver.processSearchCatalogRequestedMetrics = function(searchMetadata, vaSystem, vaInputs, vaVars) {

  if (!global.VAClickMetrics.isAISearchClickMetricsAllowed())
  	return {};

  var collector = new global.VAAISearchCatalogRequestedMetricCollector(JSON.parse(searchMetadata), vaSystem, vaInputs, vaVars);

  collector.collect();

  collector.sendOutMetrics();
};

Sys ID

472edd7deb116110506f7558b5522896

Offical Documentation

Official Docs: