🏗️ Migrate docker containers query to tRPC

This commit is contained in:
Meier Lukas
2023-06-10 12:35:37 +02:00
parent 0d2bbce8d7
commit b0b35c0f1c
4 changed files with 45 additions and 14 deletions

View File

@@ -1,14 +1,13 @@
import { ActionIcon, Drawer, Tooltip } from '@mantine/core'; import { ActionIcon, Drawer, Tooltip } from '@mantine/core';
import { useHotkeys } from '@mantine/hooks'; import { useHotkeys } from '@mantine/hooks';
import { IconBrandDocker } from '@tabler/icons-react'; import { IconBrandDocker } from '@tabler/icons-react';
import axios from 'axios';
import Docker from 'dockerode'; import Docker from 'dockerode';
import { useTranslation } from 'next-i18next'; import { useTranslation } from 'next-i18next';
import { useEffect, useState } from 'react'; import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
import { useCardStyles } from '../../components/layout/useCardStyles'; import { useCardStyles } from '../../components/layout/useCardStyles';
import { useConfigContext } from '../../config/provider'; import { useConfigContext } from '../../config/provider';
import { api } from '~/utils/api';
import ContainerActionBar from './ContainerActionBar'; import ContainerActionBar from './ContainerActionBar';
import DockerTable from './DockerTable'; import DockerTable from './DockerTable';
@@ -20,22 +19,13 @@ export default function DockerMenuButton(props: any) {
const dockerEnabled = config?.settings.customization.layout.enabledDocker || false; const dockerEnabled = config?.settings.customization.layout.enabledDocker || false;
const { data, isLoading, refetch } = useQuery({ const { data, refetch } = api.docker.containers.useQuery(undefined, {
queryKey: ['containers'],
queryFn: async () => {
const containers = await axios.get('/api/docker/containers');
return containers.data;
},
enabled: dockerEnabled, enabled: dockerEnabled,
}); });
useHotkeys([['mod+B', () => setOpened(!opened)]]); useHotkeys([['mod+B', () => setOpened(!opened)]]);
const { t } = useTranslation('modules/docker'); const { t } = useTranslation('modules/docker');
useEffect(() => {
refetch();
}, [config?.settings]);
const reload = () => { const reload = () => {
refetch(); refetch();
setSelection([]); setSelection([]);
@@ -64,7 +54,7 @@ export default function DockerMenuButton(props: any) {
}, },
}} }}
> >
<DockerTable containers={data} selection={selection} setSelection={setSelection} /> <DockerTable containers={data ?? []} selection={selection} setSelection={setSelection} />
</Drawer> </Drawer>
<Tooltip label={t('actionIcon.tooltip')}> <Tooltip label={t('actionIcon.tooltip')}>
<ActionIcon <ActionIcon

View File

@@ -2,6 +2,7 @@ import { createTRPCRouter } from '~/server/api/trpc';
import { appRouter } from './routers/app'; import { appRouter } from './routers/app';
import { rssRouter } from './routers/rss'; import { rssRouter } from './routers/rss';
import { configRouter } from './routers/config'; import { configRouter } from './routers/config';
import { dockerRouter } from './routers/docker/router';
/** /**
* This is the primary router for your server. * This is the primary router for your server.
@@ -12,6 +13,7 @@ export const rootRouter = createTRPCRouter({
app: appRouter, app: appRouter,
rss: rssRouter, rss: rssRouter,
config: configRouter, config: configRouter,
docker: dockerRouter,
}); });
// export type definition of API // export type definition of API

View File

@@ -0,0 +1,21 @@
import Docker from 'dockerode';
export default class DockerSingleton extends Docker {
private static dockerInstance: DockerSingleton;
private constructor() {
super();
}
public static getInstance(): DockerSingleton {
if (!DockerSingleton.dockerInstance) {
DockerSingleton.dockerInstance = new Docker({
// If env variable DOCKER_HOST is not set, it will use the default socket
...(process.env.DOCKER_HOST && { host: process.env.DOCKER_HOST }),
// Same thing for docker port
...(process.env.DOCKER_PORT && { port: process.env.DOCKER_PORT }),
});
}
return DockerSingleton.dockerInstance;
}
}

View File

@@ -0,0 +1,18 @@
import { TRPCError } from '@trpc/server';
import { createTRPCRouter, publicProcedure } from '../../trpc';
import DockerSingleton from './DockerSingleton';
export const dockerRouter = createTRPCRouter({
containers: publicProcedure.query(async () => {
try {
const docker = DockerSingleton.getInstance();
const containers = await docker.listContainers({ all: true });
return containers;
} catch (err) {
throw new TRPCError({
code: 'INTERNAL_SERVER_ERROR',
message: 'Unable to get containers',
});
}
}),
});