| "use server"; |
|
|
| import { NextResponse } from "next/server"; |
| import { listBackups, restoreBackup, deleteBackup } from "@/shared/services/backupService"; |
| import { ensureCliConfigWriteAllowed } from "@/shared/services/cliRuntime"; |
|
|
| const VALID_TOOLS = ["claude", "codex", "droid", "openclaw", "cline", "kilo"]; |
|
|
| |
| export async function GET(request) { |
| try { |
| const { searchParams } = new URL(request.url); |
| const tool = searchParams.get("tool") || searchParams.get("toolId"); |
|
|
| if (tool && !VALID_TOOLS.includes(tool)) { |
| return NextResponse.json({ error: `Invalid tool: ${tool}` }, { status: 400 }); |
| } |
|
|
| if (tool) { |
| const backups = await listBackups(tool); |
| return NextResponse.json({ tool, backups }); |
| } |
|
|
| |
| const result = {}; |
| for (const t of VALID_TOOLS) { |
| result[t] = await listBackups(t); |
| } |
| return NextResponse.json({ backups: result }); |
| } catch (error) { |
| console.log("Error listing backups:", error.message); |
| return NextResponse.json({ error: "Failed to list backups" }, { status: 500 }); |
| } |
| } |
|
|
| |
| export async function POST(request) { |
| try { |
| const writeGuard = ensureCliConfigWriteAllowed(); |
| if (writeGuard) { |
| return NextResponse.json({ error: writeGuard }, { status: 403 }); |
| } |
|
|
| const body = await request.json(); |
| const tool = body.tool || body.toolId; |
| const backupId = body.backupId; |
|
|
| if (!tool || !backupId) { |
| return NextResponse.json({ error: "tool and backupId are required" }, { status: 400 }); |
| } |
|
|
| if (!VALID_TOOLS.includes(tool)) { |
| return NextResponse.json({ error: `Invalid tool: ${tool}` }, { status: 400 }); |
| } |
|
|
| const result = await restoreBackup(tool, backupId); |
| return NextResponse.json({ |
| success: true, |
| message: `Backup restored for ${tool}`, |
| ...result, |
| }); |
| } catch (error) { |
| console.log("Error restoring backup:", error.message); |
| return NextResponse.json( |
| { error: error.message || "Failed to restore backup" }, |
| { status: 500 } |
| ); |
| } |
| } |
|
|
| |
| export async function DELETE(request) { |
| try { |
| const body = await request.json(); |
| const tool = body.tool || body.toolId; |
| const backupId = body.backupId; |
|
|
| if (!tool || !backupId) { |
| return NextResponse.json({ error: "tool and backupId are required" }, { status: 400 }); |
| } |
|
|
| if (!VALID_TOOLS.includes(tool)) { |
| return NextResponse.json({ error: `Invalid tool: ${tool}` }, { status: 400 }); |
| } |
|
|
| const result = await deleteBackup(tool, backupId); |
| return NextResponse.json({ |
| success: true, |
| message: `Backup deleted for ${tool}`, |
| ...result, |
| }); |
| } catch (error) { |
| console.log("Error deleting backup:", error.message); |
| return NextResponse.json({ error: "Failed to delete backup" }, { status: 500 }); |
| } |
| } |
|
|