Files
dockhand/routes/api/stacks/[name]/compose/+server.ts
Jarek Krochmalski 62e3c6439e Initial commit
2025-12-28 21:16:03 +01:00

73 lines
2.2 KiB
TypeScript

import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { getStackComposeFile, deployStack, saveStackComposeFile } from '$lib/server/stacks';
import { authorize } from '$lib/server/authorize';
// GET /api/stacks/[name]/compose - Get compose file content
export const GET: RequestHandler = async ({ params, cookies }) => {
const auth = await authorize(cookies);
if (auth.authEnabled && !(await auth.can('stacks', 'view'))) {
return json({ error: 'Permission denied' }, { status: 403 });
}
const { name } = params;
try {
const result = await getStackComposeFile(name);
if (!result.success) {
return json({ error: result.error }, { status: 404 });
}
return json({ content: result.content });
} catch (error: any) {
console.error(`Error getting compose file for stack ${name}:`, error);
return json({ error: error.message || 'Failed to get compose file' }, { status: 500 });
}
};
// PUT /api/stacks/[name]/compose - Update compose file content
export const PUT: RequestHandler = async ({ params, request, url, cookies }) => {
const auth = await authorize(cookies);
const { name } = params;
const envId = url.searchParams.get('env');
const envIdNum = envId ? parseInt(envId) : undefined;
// Permission check with environment context
if (auth.authEnabled && !(await auth.can('stacks', 'edit', envIdNum))) {
return json({ error: 'Permission denied' }, { status: 403 });
}
try {
const body = await request.json();
const { content, restart = false } = body;
if (!content || typeof content !== 'string') {
return json({ error: 'Compose file content is required' }, { status: 400 });
}
let result;
if (restart) {
// Deploy with docker compose up -d (only recreates changed services)
result = await deployStack({
name,
compose: content,
envId: envIdNum
});
} else {
// Just save the file without restarting
result = await saveStackComposeFile(name, content);
}
if (!result.success) {
return json({ error: result.error }, { status: 500 });
}
return json({ success: true });
} catch (error: any) {
console.error(`Error updating compose file for stack ${name}:`, error);
return json({ error: error.message || 'Failed to update compose file' }, { status: 500 });
}
};