API Docs for: 2.0.20133.2
Show:

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;
    }
}