sofia-cloud / src /app /api /repos /[id] /route.ts
Gmagl
Add Sofia Cloud complete files
333c51a
raw
history blame
2.69 kB
import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import fs from "fs/promises";
import path from "path";
const REPOS_DIR = path.join(process.cwd(), "repos");
// GET - Obtener detalles de un repositorio específico
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const { id } = await params;
const repo = await db.repo.findUnique({
where: { id },
include: {
project: true,
analyses: true,
},
});
if (!repo) {
return NextResponse.json(
{ success: false, error: "Repositorio no encontrado" },
{ status: 404 }
);
}
// Leer estructura de archivos del repo
const repoPath = path.join(REPOS_DIR, repo.name);
let files: string[] = [];
let readme = null;
try {
const entries = await fs.readdir(repoPath, { withFileTypes: true });
files = entries.map((e) => e.name);
// Intentar leer README
try {
const readmePath = path.join(repoPath, "README.md");
readme = await fs.readFile(readmePath, "utf-8");
} catch {
// No hay README
}
} catch {
// Directorio no accesible
}
return NextResponse.json({
success: true,
repo,
files,
readme,
});
} catch (error) {
console.error("Error fetching repo:", error);
return NextResponse.json(
{ success: false, error: "Error al obtener repositorio" },
{ status: 500 }
);
}
}
// DELETE - Eliminar un repositorio
export async function DELETE(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const { id } = await params;
const repo = await db.repo.findUnique({
where: { id },
});
if (!repo) {
return NextResponse.json(
{ success: false, error: "Repositorio no encontrado" },
{ status: 404 }
);
}
// Eliminar directorio del repositorio
const repoPath = path.join(REPOS_DIR, repo.name);
try {
await fs.rm(repoPath, { recursive: true, force: true });
} catch {
// Directorio no existe
}
// Eliminar análisis relacionados
await db.analysis.deleteMany({
where: { repoId: id },
});
// Eliminar de base de datos
await db.repo.delete({
where: { id },
});
return NextResponse.json({
success: true,
message: `Repositorio ${repo.name} eliminado`,
});
} catch (error) {
console.error("Error deleting repo:", error);
return NextResponse.json(
{ success: false, error: "Error al eliminar repositorio" },
{ status: 500 }
);
}
}