mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-09 23:15:46 +01:00
🏗️ Migrate docker container actions to tRPC
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
import { TRPCError } from '@trpc/server';
|
||||
import { z } from 'zod';
|
||||
import Dockerode from 'dockerode';
|
||||
import { createTRPCRouter, publicProcedure } from '../../trpc';
|
||||
import DockerSingleton from './DockerSingleton';
|
||||
|
||||
const dockerActionSchema = z.enum(['remove', 'start', 'stop', 'restart']);
|
||||
|
||||
export const dockerRouter = createTRPCRouter({
|
||||
containers: publicProcedure.query(async () => {
|
||||
try {
|
||||
@@ -15,4 +19,54 @@ export const dockerRouter = createTRPCRouter({
|
||||
});
|
||||
}
|
||||
}),
|
||||
action: publicProcedure
|
||||
.input(
|
||||
z.object({
|
||||
id: z.string(),
|
||||
action: dockerActionSchema,
|
||||
})
|
||||
)
|
||||
.mutation(async ({ input }) => {
|
||||
const docker = DockerSingleton.getInstance();
|
||||
// Get the container with the ID
|
||||
const container = docker.getContainer(input.id);
|
||||
if (!container) {
|
||||
throw new TRPCError({
|
||||
code: 'NOT_FOUND',
|
||||
message: 'Container not found',
|
||||
});
|
||||
}
|
||||
|
||||
// Perform the action
|
||||
try {
|
||||
await startAction(container, input.action);
|
||||
return {
|
||||
statusCode: 200,
|
||||
message: `Container ${input.id} ${input.action}ed`,
|
||||
};
|
||||
} catch (err) {
|
||||
throw new TRPCError({
|
||||
code: 'INTERNAL_SERVER_ERROR',
|
||||
message: `Unable to ${input.action} container ${input.id}`,
|
||||
});
|
||||
}
|
||||
}),
|
||||
});
|
||||
|
||||
const startAction = async (
|
||||
container: Dockerode.Container,
|
||||
action: z.infer<typeof dockerActionSchema>
|
||||
) => {
|
||||
switch (action) {
|
||||
case 'remove':
|
||||
return container.remove();
|
||||
case 'start':
|
||||
return container.start();
|
||||
case 'stop':
|
||||
return container.stop();
|
||||
case 'restart':
|
||||
return container.restart();
|
||||
default:
|
||||
return Promise;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user