import { NextRequest, NextResponse } from "next/server"; import { readdirSync, statSync, unlinkSync, existsSync } from "fs"; import { join } from "path"; import { execSync, exec } from "child_process"; import { auth } from "@/lib/auth"; export const dynamic = "force-dynamic"; const BACKUP_DIR = "/home/minecraft/server/backups"; const BACKUP_SCRIPT = "/home/minecraft/dashboard/scripts/backup-world.sh"; export async function GET() { const session = await auth(); if (!session) { return NextResponse.json({ error: "Unauthorized" }, { status: 403 }); } if (!existsSync(BACKUP_DIR)) { return NextResponse.json([]); } const files = readdirSync(BACKUP_DIR) .filter((f) => f.endsWith(".tar.gz")) .map((f) => { const stat = statSync(join(BACKUP_DIR, f)); return { name: f, size: (stat.size / 1024 / 1024).toFixed(1) + " MB", sizeBytes: stat.size, createdAt: stat.mtime.toISOString(), }; }) .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); return NextResponse.json(files); } // Create backup now export async function POST() { const session = await auth(); if (!session) { return NextResponse.json({ error: "Unauthorized" }, { status: 403 }); } try { execSync(`bash ${BACKUP_SCRIPT}`, { encoding: "utf8", timeout: 60000 }); return NextResponse.json({ ok: true, message: "Backup created" }); } catch (e) { return NextResponse.json( { error: (e as Error).message }, { status: 500 } ); } } // Delete backup export async function DELETE(req: NextRequest) { const session = await auth(); if (!session) { return NextResponse.json({ error: "Unauthorized" }, { status: 403 }); } const { name } = await req.json(); if (!name || !name.endsWith(".tar.gz") || name.includes("/") || name.includes("..")) { return NextResponse.json({ error: "Invalid name" }, { status: 400 }); } const filePath = join(BACKUP_DIR, name); if (!existsSync(filePath)) { return NextResponse.json({ error: "Backup not found" }, { status: 404 }); } unlinkSync(filePath); return NextResponse.json({ ok: true }); }