import type { Modify } from "@homarr/common/types"; import type { Integration, IntegrationSecret } from "@homarr/db/schema"; import type { IntegrationKind } from "@homarr/definitions"; import { createRequestHandler } from "./request-handler"; type IntegrationOfKind = Omit & { kind: TKind; decryptedSecrets: Modify, { value: string }>[]; externalUrl: string | null; }; interface Options> { requestAsync: (integration: IntegrationOfKind, input: TInput) => Promise; cacheTtlMs?: number; fallbackToStaleOnError?: boolean; staleIfErrorTtlMs?: number; } export const createIntegrationRequestHandler = < TData, TKind extends IntegrationKind, TInput extends Record, >( options: Options, ) => { const inner = createRequestHandler; options: TInput }>({ requestAsync: async ({ integration, options: itemOptions }) => options.requestAsync(integration, itemOptions), getCacheKey: ({ integration, options: itemOptions }) => JSON.stringify({ integrationId: integration.id, itemOptions }), cacheTtlMs: options.cacheTtlMs, fallbackToStaleOnError: options.fallbackToStaleOnError, staleIfErrorTtlMs: options.staleIfErrorTtlMs, }); return { invalidateCache: inner.invalidateCache, handler: (integration: IntegrationOfKind, itemOptions: TInput) => inner.handler({ integration, options: itemOptions }), }; };