From 3fa9b6834ed5f9fde7238f5a2deda0da24007c3e Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 17 Nov 2023 17:59:56 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Migrate=20ping=20to=20datb?= =?UTF-8?q?ase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Board/Items/App/AppPing.tsx | 10 ++++---- src/server/api/routers/app.ts | 27 +++++++++++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/components/Board/Items/App/AppPing.tsx b/src/components/Board/Items/App/AppPing.tsx index 46f2f325a..388f14d48 100644 --- a/src/components/Board/Items/App/AppPing.tsx +++ b/src/components/Board/Items/App/AppPing.tsx @@ -4,8 +4,7 @@ import Consola from 'consola'; import { TargetAndTransition, Transition, motion } from 'framer-motion'; import { useSession } from 'next-auth/react'; import { useTranslation } from 'next-i18next'; -import { AppItem } from '~/components/Board/context'; -import { useConfigContext } from '~/config/provider'; +import { AppItem, useRequiredBoard } from '~/components/Board/context'; import { RouterOutputs, api } from '~/utils/api'; interface AppPingProps { @@ -90,14 +89,13 @@ const useTooltipLabel = ({ isFetching, isError, data, errorMessage }: TooltipLab }; const usePing = (app: AppItem) => { - const { config, name } = useConfigContext(); - const isActive = - (config?.settings.customization.layout.enabledPing && app.isPingEnabled) ?? false; + const board = useRequiredBoard(); + const isActive = board.isPingEnabled! && app.isPingEnabled; const queryResult = api.app.ping.useQuery( { id: app.id, - configName: name ?? '', + boardId: board.id, }, { retry: false, diff --git a/src/server/api/routers/app.ts b/src/server/api/routers/app.ts index 3c9fb67bd..2f4d419b8 100644 --- a/src/server/api/routers/app.ts +++ b/src/server/api/routers/app.ts @@ -3,7 +3,7 @@ import axios, { AxiosError } from 'axios'; import Consola from 'consola'; import https from 'https'; import { z } from 'zod'; -import { getConfig } from '~/tools/config/getConfig'; +import { getAppAsync } from '~/server/db/queries/app'; import { createTRPCRouter, publicProcedure } from '../trpc'; @@ -12,15 +12,14 @@ export const appRouter = createTRPCRouter({ .input( z.object({ id: z.string(), - configName: z.string(), + boardId: z.string(), }) ) - .query(async ({ input }) => { + .query(async ({ input, ctx }) => { const agent = new https.Agent({ rejectUnauthorized: false }); - const config = getConfig(input.configName); - const app = config.apps.find((app) => app.id === input.id); + const appItem = await getAppAsync(input.boardId, input.id, ctx.session?.user); - if (!app?.url) { + if (!appItem?.app) { Consola.error(`App ${input} not found`); throw new TRPCError({ code: 'NOT_FOUND', @@ -29,20 +28,16 @@ export const appRouter = createTRPCRouter({ }); } const res = await axios - .get(app.url, { httpsAgent: agent, timeout: 10000 }) + .get(appItem.app.internalUrl, { httpsAgent: agent, timeout: 10000 }) .then((response) => ({ status: response.status, statusText: response.statusText, - state: app.network.statusCodes?.includes(response.status.toString()) - ? 'online' - : 'offline', + state: getNetworkState(appItem.app!.statusCodes, response.status), })) .catch((error: AxiosError) => { if (error.response) { return { - state: app.network.statusCodes?.includes(error.response.status.toString()) - ? 'online' - : 'offline', + state: getNetworkState(appItem.app!.statusCodes, error.response.status), status: error.response.status, statusText: error.response.statusText, }; @@ -50,7 +45,7 @@ export const appRouter = createTRPCRouter({ if (error.code === 'ECONNABORTED') { Consola.error( - `Ping timed out for app with id '${input.id}' in config '${input.configName}' -> url: ${app.url})` + `Ping timed out for app with id '${input.id}' in config '${input.boardId}' -> url: ${appItem.app?.internalUrl})` ); throw new TRPCError({ code: 'TIMEOUT', @@ -69,3 +64,7 @@ export const appRouter = createTRPCRouter({ return res; }), }); + +function getNetworkState(statusCodes: { code: number }[], responseStatus: number) { + return statusCodes.some((s) => s.code === responseStatus) ? 'online' : 'offline'; +}