index.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { ApiError } from "@/lib/api/errors";
  2. import { createQsirchProvider } from "@/lib/search/providers/qsirch";
  3. import { createFsProvider } from "@/lib/search/providers/fs";
  4. /**
  5. * Provider selection.
  6. *
  7. * We keep provider selection in one place:
  8. * - SEARCH_PROVIDER=qsirch | fs
  9. *
  10. * This allows:
  11. * - local dev: fs fallback
  12. * - production: qsirch (fast, indexed)
  13. */
  14. let cachedProvider = null;
  15. function normalizeProviderName(value) {
  16. return String(value || "")
  17. .trim()
  18. .toLowerCase();
  19. }
  20. export function getSearchProvider() {
  21. if (cachedProvider) return cachedProvider;
  22. const providerName = normalizeProviderName(
  23. process.env.SEARCH_PROVIDER || "fs"
  24. );
  25. if (providerName === "fs") {
  26. cachedProvider = createFsProvider();
  27. return cachedProvider;
  28. }
  29. if (providerName === "qsirch") {
  30. cachedProvider = createQsirchProvider({
  31. baseUrl: process.env.QSIRCH_BASE_URL,
  32. account: process.env.QSIRCH_ACCOUNT,
  33. password: process.env.QSIRCH_PASSWORD,
  34. pathPrefix: process.env.QSIRCH_PATH_PREFIX || "/Niederlassungen",
  35. dateField: (process.env.QSIRCH_DATE_FIELD || "modified").trim(),
  36. mode: (process.env.QSIRCH_MODE || "sync").trim(),
  37. });
  38. return cachedProvider;
  39. }
  40. throw new ApiError({
  41. status: 500,
  42. code: "SEARCH_BACKEND_UNAVAILABLE",
  43. message: "Internal server error",
  44. });
  45. }
  46. /**
  47. * Unified search entrypoint used by route handlers.
  48. *
  49. * @param {{
  50. * mode: "branch"|"multi"|"all",
  51. * branches: string[]|null,
  52. * q: string|null,
  53. * from: string|null,
  54. * to: string|null,
  55. * limit: number,
  56. * cursor: string|null
  57. * }} input
  58. */
  59. export async function search(input) {
  60. const provider = getSearchProvider();
  61. return provider.search(input);
  62. }