♻️ Migrate ping to datbase

This commit is contained in:
Meier Lukas
2023-11-17 17:59:56 +01:00
parent a2032756e3
commit 3fa9b6834e
2 changed files with 17 additions and 20 deletions

View File

@@ -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,

View File

@@ -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';
}