codeverse / app /api /git /route.ts
shubhjn's picture
fix ai asistance and make it per user friendly isolated enviroment
5dc2f11
import { NextRequest, NextResponse } from "next/server";
import {
getGitStatus,
getBranchList,
commitFiles,
getFileDiff,
pushBranch,
pullBranch,
checkoutBranch,
getGit
} from "@/lib/git";
import { auth } from "@/auth";
import { resolveSafePath } from "@/lib/fs/isolation";
export async function GET(req: NextRequest) {
const session = await auth();
if (!session?.user?.id) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
const { searchParams } = new URL(req.url);
const action = searchParams.get("action");
const workspaceName = searchParams.get("workspaceName");
if (!workspaceName) return NextResponse.json({ error: "workspaceName required" }, { status: 400 });
try {
const userId = session.user.id;
const baseDir = await resolveSafePath(userId, workspaceName);
switch (action) {
case "status":
return NextResponse.json(await getGitStatus(baseDir));
case "branches":
return NextResponse.json(await getBranchList(baseDir));
case "diff":
const file = searchParams.get("file");
if (!file) return NextResponse.json({ error: "File required" }, { status: 400 });
return NextResponse.json({ diff: await getFileDiff(file, baseDir) });
case "log":
const log = await getGit(baseDir).log({ maxCount: 50 });
return NextResponse.json(log.all);
case "checkConfig":
const instance = getGit(baseDir);
const name = await instance.getConfig("user.name", "local");
const email = await instance.getConfig("user.email", "local");
return NextResponse.json({
configured: !!(name.value && email.value),
name: name.value,
email: email.value
});
default:
return NextResponse.json({ error: "Invalid action" }, { status: 400 });
}
} catch (e: unknown) {
return NextResponse.json({ error: (e as Error).message }, { status: 500 });
}
}
export async function POST(req: NextRequest) {
const session = await auth();
if (!session?.user?.id) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
try {
const body = await req.json();
const { action, workspaceName } = body;
if (!workspaceName) return NextResponse.json({ error: "Workspace required" }, { status: 400 });
const baseDir = await resolveSafePath(session.user.id, workspaceName);
switch (action) {
case "commit":
if (!body.message) return NextResponse.json({ error: "Message required" }, { status: 400 });
const res = await commitFiles(body.message, body.files, baseDir);
return NextResponse.json({ success: true, commit: res.commit });
case "push":
await pushBranch(baseDir);
return NextResponse.json({ success: true });
case "pull":
await pullBranch(baseDir);
return NextResponse.json({ success: true });
case "checkout":
if (!body.branch) return NextResponse.json({ error: "Branch required" }, { status: 400 });
await checkoutBranch(body.branch, body.create, baseDir);
return NextResponse.json({ success: true });
case "setConfig":
if (!body.name || !body.email) return NextResponse.json({ error: "Name and email required" }, { status: 400 });
const instance = getGit(baseDir);
await instance.addConfig("user.name", body.name, false, "local");
await instance.addConfig("user.email", body.email, false, "local");
return NextResponse.json({ success: true });
default:
return NextResponse.json({ error: "Invalid action" }, { status: 400 });
}
} catch (e: unknown) {
return NextResponse.json({ error: (e as Error).message }, { status: 500 });
}
}