49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { observable } from "@trpc/server/observable";
|
|
|
|
import type { TracearrDashboardData } from "@homarr/integrations/types";
|
|
import { tracearrRequestHandler } from "@homarr/request-handler/tracearr";
|
|
|
|
import { createManyIntegrationMiddleware } from "../../middlewares/integration";
|
|
import { createTRPCRouter, publicProcedure } from "../../trpc";
|
|
|
|
export const tracearrRouter = createTRPCRouter({
|
|
getDashboard: publicProcedure.concat(createManyIntegrationMiddleware("query", "tracearr")).query(async ({ ctx }) => {
|
|
const results = await Promise.all(
|
|
ctx.integrations.map(async (integration) => {
|
|
const innerHandler = tracearrRequestHandler.handler(integration, {});
|
|
const { data, timestamp } = await innerHandler.getCachedOrUpdatedDataAsync({ forceUpdate: false });
|
|
|
|
return {
|
|
integrationId: integration.id,
|
|
integrationName: integration.name,
|
|
integrationUrl: integration.url,
|
|
dashboard: data,
|
|
updatedAt: timestamp,
|
|
};
|
|
}),
|
|
);
|
|
|
|
return results;
|
|
}),
|
|
subscribeToDashboard: publicProcedure
|
|
.concat(createManyIntegrationMiddleware("query", "tracearr"))
|
|
.subscription(({ ctx }) => {
|
|
return observable<{ integrationId: string; dashboard: TracearrDashboardData; timestamp: Date }>((emit) => {
|
|
const unsubscribes = ctx.integrations.map((integration) => {
|
|
const innerHandler = tracearrRequestHandler.handler(integration, {});
|
|
return innerHandler.subscribe((dashboard) => {
|
|
emit.next({
|
|
integrationId: integration.id,
|
|
dashboard,
|
|
timestamp: new Date(),
|
|
});
|
|
});
|
|
});
|
|
|
|
return () => {
|
|
unsubscribes.forEach((unsubscribe) => unsubscribe());
|
|
};
|
|
});
|
|
}),
|
|
});
|