baublet/w8mngr

View on GitHub
api/helpers/algoliaService.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import algoliasearch from "algoliasearch";

import { config } from "../config/config";
import { log } from "../config/log";

type AlgoliaService = {
  readonly isLive: boolean;
  getIndex: (indexName: string) => Promise<{
    upsertObjects: (
      objects: { id: string; [key: string]: any }[]
    ) => Promise<void>;
    searchObjects: <T extends Record<string, any>>(
      searchTerm: string,
      filters?: string
    ) => Promise<T[]>;
  }>;
};

export function algoliaService(): () => AlgoliaService {
  if (config.get("SUPPRESS_ALGOLIA") === "true") {
    log("warn", "Algolia indexing manually suppressed");
    return () => stubAlgoliaService;
  }
  if (config.get("ALGOLIA_APPLICATION_ID") === "") {
    log(
      "warn",
      "ALGOLIA_APPLICATION_ID is not set, Algolia search will not work"
    );
    return () => stubAlgoliaService;
  }

  if (config.get("ALGOLIA_ADMIN_API_KEY") === "") {
    log(
      "warn",
      "ALGOLIA_ADMIN_API_KEY is not set, Algolia search will not work"
    );
    return () => stubAlgoliaService;
  }

  const client = algoliasearch(
    config.get("ALGOLIA_APPLICATION_ID"),
    config.get("ALGOLIA_ADMIN_API_KEY")
  );

  return () => ({
    isLive: true,
    getIndex: async (indexName: string) => {
      const index = client.initIndex(indexName);
      return {
        upsertObjects: async (objects) => {
          const formattedObjects = objects.map((obj) => ({
            ...obj,
            objectID: obj.id,
          }));
          await index.saveObjects(formattedObjects);
        },
        searchObjects: async (searchString: string, filters?: string) => {
          try {
            const foundObjects = await index.search(searchString, {
              filters,
            });
            return foundObjects.hits as any;
          } catch (error) {
            log("error", "Error upserting records to Algolia", {
              error,
            });
            return [];
          }
        },
      };
    },
  });
}

const stubAlgoliaService: AlgoliaService = {
  isLive: false,
  getIndex: async () => {
    return {
      upsertObjects: async () => {},
      searchObjects: async () => [],
    };
  },
};