50e25e3ee8
Rename subdirectories for a cleaner single-repo layout: - website-monitoring-backend/ → backend/ - website-monitoring-frontend/ → frontend/ - website-monitoring-devops/ → devops/ Update all references in package.json scripts, CI workflows, docker-compose, pre-commit hooks, and documentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
87 lines
2.8 KiB
TypeScript
87 lines
2.8 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { getSupabaseAdmin } from "@/lib/admin";
|
|
|
|
export async function GET(
|
|
request: Request,
|
|
{ params }: { params: Promise<{ websiteId: string }> },
|
|
) {
|
|
try {
|
|
const { websiteId } = await params;
|
|
|
|
// Get crawl queue items
|
|
const { data: queueItems, error: queueError } = await getSupabaseAdmin()
|
|
.from("crawl_queue")
|
|
.select("*")
|
|
.eq("website_id", websiteId)
|
|
.order("created_at", { ascending: false });
|
|
|
|
if (queueError) throw queueError;
|
|
|
|
// Get crawl sessions
|
|
const { data: sessions, error: sessionsError } = await getSupabaseAdmin()
|
|
.from("crawl_sessions")
|
|
.select("*")
|
|
.eq("website_id", websiteId)
|
|
.order("created_at", { ascending: false });
|
|
|
|
if (sessionsError) throw sessionsError;
|
|
|
|
// Get pages discovered
|
|
const { data: pages, error: pagesError } = await getSupabaseAdmin()
|
|
.from("pages")
|
|
.select("id, url, title, is_active, depth, created_at, metadata")
|
|
.eq("website_id", websiteId)
|
|
.order("created_at", { ascending: false });
|
|
|
|
if (pagesError) throw pagesError;
|
|
|
|
// Get website info
|
|
const { data: website, error: websiteError } = await getSupabaseAdmin()
|
|
.from("websites")
|
|
.select("*")
|
|
.eq("id", websiteId)
|
|
.single();
|
|
|
|
if (websiteError) throw websiteError;
|
|
|
|
// Statistics
|
|
const queueStats = {
|
|
total: queueItems?.length || 0,
|
|
pending: queueItems?.filter(item => item.status === 'pending').length || 0,
|
|
processing: queueItems?.filter(item => item.status === 'processing').length || 0,
|
|
completed: queueItems?.filter(item => item.status === 'completed').length || 0,
|
|
failed: queueItems?.filter(item => item.status === 'failed').length || 0,
|
|
skipped: queueItems?.filter(item => item.status === 'skipped').length || 0,
|
|
};
|
|
|
|
const sessionStats = {
|
|
total: sessions?.length || 0,
|
|
running: sessions?.filter(s => s.status === 'running').length || 0,
|
|
completed: sessions?.filter(s => s.status === 'completed').length || 0,
|
|
failed: sessions?.filter(s => s.status === 'failed').length || 0,
|
|
};
|
|
|
|
const pageStats = {
|
|
total: pages?.length || 0,
|
|
active: pages?.filter(p => p.is_active).length || 0,
|
|
inactive: pages?.filter(p => !p.is_active).length || 0,
|
|
};
|
|
|
|
return NextResponse.json({
|
|
website,
|
|
queueStats,
|
|
sessionStats,
|
|
pageStats,
|
|
queueItems: queueItems?.slice(0, 20), // Last 20 queue items
|
|
sessions: sessions?.slice(0, 5), // Last 5 sessions
|
|
pages: pages?.slice(0, 20), // Last 20 pages
|
|
});
|
|
} catch (error) {
|
|
console.error("Error fetching crawl debug info:", error);
|
|
return NextResponse.json(
|
|
{ error: "Failed to fetch crawl debug info" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|