export default async function handleRequest()

in packages/search-ui-engines-connector/src/handlers/autocomplete/index.ts [26:144]


export default async function handleRequest(
  configuration: AutocompleteHandlerConfiguration
): Promise<AutocompleteResponseState> {
  const { state, queryConfig } = configuration;

  const suggestionConfigurations = [];

  if (queryConfig.results) {
    const { hitFields, highlightFields } = getResultFields(
      queryConfig.results.result_fields
    );

    suggestionConfigurations.push(
      new HitsSuggestor({
        identifier: "hits-suggestions",
        hits: {
          fields: hitFields,
          highlightedFields: highlightFields
        },
        query: new PrefixQuery({ fields: ["*"] }),
        size: queryConfig.results.resultsPerPage || 5
      })
    );
  }

  if (queryConfig.suggestions && queryConfig.suggestions.types) {
    const configs = Object.keys(queryConfig.suggestions.types).map((type) => {
      const configuration = queryConfig.suggestions.types[type];
      const suggestionsSize = queryConfig.suggestions.size || 5;

      if (configuration.queryType === "results") {
        const { hitFields, highlightFields } = getResultFields(
          configuration.result_fields
        );

        return new HitsSuggestor({
          identifier: `suggestions-hits-${type}`,
          index: configuration.index,
          hits: {
            fields: hitFields,
            highlightedFields: highlightFields
          },
          query: new PrefixQuery({ fields: ["*"] }),
          size: suggestionsSize
        });
      } else if (
        !configuration.queryType ||
        configuration.queryType === "suggestions"
      ) {
        const { fields } = configuration;

        return new CompletionSuggester({
          identifier: `suggestions-completion-${type}`,
          field: fields[0],
          size: suggestionsSize
        });
      }
    });
    suggestionConfigurations.push(...configs);
  }

  const searchkitConfig: SearchkitConfig = {
    host: "host",
    index: "engineName",
    suggestions: suggestionConfigurations
  };

  const response = await Searchkit(
    searchkitConfig,
    configuration.transporter
  ).executeSuggestions(state.searchTerm);

  const results: AutocompleteResponseState = response.reduce(
    (acc, suggestion) => {
      const { identifier } = suggestion;

      if (identifier === "hits-suggestions") {
        return {
          ...acc,
          autocompletedResults: suggestion.hits.map(fieldResponseMapper)
        };
      } else if (identifier.startsWith("suggestions-completion-")) {
        const name = identifier.replace("suggestions-completion-", "");

        return {
          ...acc,
          autocompletedSuggestions: {
            ...acc.autocompletedSuggestions,
            [name]: suggestion.suggestions.map((suggestion) => {
              return {
                suggestion: suggestion
              };
            })
          }
        };
      } else if (identifier.startsWith("suggestions-hits-")) {
        const name = identifier.replace("suggestions-hits-", "");
        const config = queryConfig.suggestions.types[
          name
        ] as ResultSuggestionConfiguration;
        return {
          ...acc,
          autocompletedSuggestions: {
            ...acc.autocompletedSuggestions,
            [name]: suggestion.hits.map((hit) => ({
              queryType: config.queryType,
              result: fieldResponseMapper(hit)
            }))
          }
        };
      }
    },
    {
      autocompletedSuggestions: {}
    }
  );

  return results;
}