File: src\internal\api\suggest\suggestApi.ts
/// <reference path="../../common/sdkConfig.ts"/>
/// <reference path="../../common/constants.ts"/>
/// <reference path="../../utils/http.ts"/>
/// <reference path="../../utils/object.ts"/>
/// <reference path="../../utils/typecheck.ts"/>
/// <reference path="../../telemetry/awa/awaEvent.ts"/>
/// <reference path="../../telemetry/awa/eventWriter.ts"/>
/// <reference path="suggestResultSet.ts"/>
/// <reference path="suggestConfig.ts"/>
/// <reference path="suggestConstants.ts"/>
/**
* @module API
* @submodule API Suggest
* @namespace api
*/
namespace internal.api.suggest {
/**
* Suggest API to get suggestion results for support
* @class suggest
* @static
*/
export class SuggestApi {
/**
* Gets suggestion results for the scopes, language specified
* @method getSuggestResults
* @static
* @param {object} config A config object to enlist the input criteria.
* @param {string} config.query. Suggest query.
* @param {string} config.locale. Comma delimited locale for suggest results.
* @param {number} config.count. Total number of suggest results to be returned.
* @param {string} config.tenant. Specify tenant to be used.
* @param {string} config.version. Targeting a specific version.
* @return {Promise | SuggestResultSet}. Promise of suggest results.
*/
static getSuggestResults(config: SuggestConfig): JQueryPromise<SuggestResultSet> {
let apiUrl = formSuggestUrl(config);
if (config.componentName == undefined || config.componentName == "") {
config.componentName = "Unspecified";
}
let additionalHeaders = <any>{};
let tenant = config.tenant || SdkConfig.current.partnerId + ":" + SdkConfig.current.appId;
additionalHeaders["x-caller-name"] = tenant;
additionalHeaders["x-caller-component"] = config.componentName;
let cv = telemetry.getCorrelationVector();
if (cv) {
additionalHeaders["ms-cv"] = telemetry.getCorrelationVector();
}
let requestOptions: HttpRequestOptions = {
operationName: "api.suggest.getSuggest",
url: apiUrl,
additionalHeaders: additionalHeaders,
dependencyName: "supportsuggest.microsoft.com",
dependencyOperationName: "Get Suggest Results"
};
return getSuggestResultsPromise(config, requestOptions);
}
}
function getSuggestResultsPromise(config: SuggestConfig, requestOptions: HttpRequestOptions): JQueryPromise<SuggestResultSet> {
let suggestDeferred = jQuery.Deferred();
utils.httpRequest.get(requestOptions).then(
function (jsonResult) {
let suggestResults = new Array<QuerySuggestion>();
let flightIds = new Array<string>();
if (jsonResult.Suggestions && jsonResult.Suggestions.length != 0) {
for (let i = 0; i < jsonResult.Suggestions.length; i++) {
let suggestResult = new QuerySuggestion();
suggestResult.Value = jsonResult.Suggestions[i].Value;
suggestResults.push(suggestResult);
}
}
if (jsonResult.FlightIds && jsonResult.FlightIds.length != 0) {
for (let i = 0; i < jsonResult.FlightIds.length; i++) {
flightIds.push(jsonResult.FlightIds[i]);
}
}
let suggestResultSet = new SuggestResultSet();
suggestResultSet.SuggestId = jsonResult.SuggestId;
suggestResultSet.FlightIds = flightIds;
suggestResultSet.Tenant = jsonResult.Tenant;
suggestResultSet.ProcessingMs = jsonResult.ProcessingMs;
suggestResultSet.ComponentName = jsonResult.ComponentName;
suggestResultSet.Suggestions = suggestResults;
suggestDeferred.resolve(suggestResultSet);
}, function (error) {
console.log(error);
suggestDeferred.reject(error);
});
return suggestDeferred.promise();
}
/**
* Forms the suggest endpoint with necessary suggest parameters
* @method formSuggestUrl
* @static
* @private
* @param {SuggestConfig} config
*/
function formSuggestUrl(config: SuggestConfig): string {
let queryParams = "";
if (config.query == undefined) {
throw "Please specify a suggest query";
}
queryParams += `?query=${config.query}`;
if (config.locale == undefined) {
config.locale = DEFAULT_LOCALE;
}
queryParams += `&locale=${config.locale}`;
if (config.count == undefined || config.count == 0) {
config.count = DEFAULT_SUGGESTRESULTSCOUNT;
}
queryParams += `&count=${config.count}`;
if (config.version == undefined || config.version == "") {
config.version = DEFAULT_VERSION;
}
return `https://${suggest.BASEURI}/api/${config.version}/${suggest.SUGGEST_ROUTE}` + queryParams;
}
}