import type { Duration } from "dayjs/plugin/duration"; import type { Modify } from "@homarr/common/types"; import type { Integration, IntegrationSecret } from "@homarr/db/schema"; import type { IntegrationKind } from "@homarr/definitions"; import { createIntegrationOptionsChannel } from "@homarr/redis"; import { createCachedRequestHandler } from "./cached-request-handler"; type IntegrationOfKind = Omit & { kind: TKind; decryptedSecrets: Modify, { value: string }>[]; }; interface Options> { // Unique key for this request handler queryKey: string; requestAsync: (integration: IntegrationOfKind, input: TInput) => Promise; cacheDuration: Duration; } export const createCachedIntegrationRequestHandler = < TData, TKind extends IntegrationKind, TInput extends Record, >( options: Options, ) => { return { handler: (integration: IntegrationOfKind, itemOptions: TInput) => createCachedRequestHandler({ queryKey: options.queryKey, requestAsync: async (input: { options: TInput; integration: IntegrationOfKind }) => { return await options.requestAsync(input.integration, input.options); }, cacheDuration: options.cacheDuration, createRedisChannel(input, options) { return createIntegrationOptionsChannel(input.integration.id, options.queryKey, input.options); }, }).handler({ options: itemOptions, integration }), }; };