* feat: add pi hole summary integration * feat: add pi hole summary widget * fix: type issues with integrations and integrationIds * feat: add middleware for integrations and improve cache redis channel * feat: add error boundary for widgets * fix: broken lock file * fix: format format issues * fix: typecheck issue * fix: deepsource issues * fix: widget sandbox without error boundary * chore: address pull request feedback * chore: remove todo comment and created issue * fix: format issues * fix: deepsource issue
33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
import { TRPCError } from "@trpc/server";
|
|
|
|
import { PiHoleIntegration } from "@homarr/integrations";
|
|
import type { DnsHoleSummary } from "@homarr/integrations/types";
|
|
import { logger } from "@homarr/log";
|
|
import { createCacheChannel } from "@homarr/redis";
|
|
|
|
import { createOneIntegrationMiddleware } from "../../middlewares/integration";
|
|
import { createTRPCRouter, publicProcedure } from "../../trpc";
|
|
|
|
export const dnsHoleRouter = createTRPCRouter({
|
|
summary: publicProcedure.unstable_concat(createOneIntegrationMiddleware("piHole")).query(async ({ ctx }) => {
|
|
const cache = createCacheChannel<DnsHoleSummary>(`dns-hole-summary:${ctx.integration.id}`);
|
|
|
|
const { data } = await cache.consumeAsync(async () => {
|
|
const client = new PiHoleIntegration(ctx.integration);
|
|
|
|
return await client.getSummaryAsync().catch((err) => {
|
|
logger.error("dns-hole router - ", err);
|
|
throw new TRPCError({
|
|
code: "INTERNAL_SERVER_ERROR",
|
|
message: `Failed to fetch DNS Hole summary for ${ctx.integration.name} (${ctx.integration.id})`,
|
|
});
|
|
});
|
|
});
|
|
|
|
return {
|
|
...data,
|
|
integrationId: ctx.integration.id,
|
|
};
|
|
}),
|
|
});
|