73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { adminDb } from '@/lib/firebase/admin';
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const projectId = request.nextUrl.searchParams.get('projectId');
|
|
|
|
if (!projectId) {
|
|
return NextResponse.json({ error: 'Missing projectId' }, { status: 400 });
|
|
}
|
|
|
|
// Get workspace metadata
|
|
const workspaceMetaDoc = await adminDb
|
|
.collection('projects')
|
|
.doc(projectId)
|
|
.collection('cursorData')
|
|
.doc('workspace-meta')
|
|
.get();
|
|
|
|
const workspaceMeta = workspaceMetaDoc.exists ? workspaceMetaDoc.data() : null;
|
|
|
|
// Get all conversations
|
|
const conversationsSnapshot = await adminDb
|
|
.collection('projects')
|
|
.doc(projectId)
|
|
.collection('cursorConversations')
|
|
.get();
|
|
|
|
// Analyze by score
|
|
const negative = conversationsSnapshot.docs
|
|
.map(doc => ({ name: doc.data().name, score: doc.data().relevanceScore || 0 }))
|
|
.filter(c => c.score < 0)
|
|
.sort((a, b) => a.score - b.score);
|
|
|
|
const positive = conversationsSnapshot.docs
|
|
.map(doc => ({ name: doc.data().name, score: doc.data().relevanceScore || 0 }))
|
|
.filter(c => c.score > 0)
|
|
.sort((a, b) => b.score - a.score);
|
|
|
|
const neutral = conversationsSnapshot.docs
|
|
.filter(doc => (doc.data().relevanceScore || 0) === 0)
|
|
.length;
|
|
|
|
return NextResponse.json({
|
|
workspacePath: workspaceMeta?.workspacePath,
|
|
githubUrl: workspaceMeta?.githubUrl,
|
|
workspaceFilesCount: workspaceMeta?.workspaceFiles?.length || 0,
|
|
workspaceFilesSample: (workspaceMeta?.workspaceFiles || []).slice(0, 20),
|
|
totalGenerations: workspaceMeta?.totalGenerations || 0,
|
|
totalConversations: conversationsSnapshot.size,
|
|
scoreBreakdown: {
|
|
negative: negative.length,
|
|
neutral,
|
|
positive: positive.length
|
|
},
|
|
negativeScoreConversations: negative,
|
|
topPositiveConversations: positive.slice(0, 10),
|
|
sampleNeutralConversations: conversationsSnapshot.docs
|
|
.filter(doc => (doc.data().relevanceScore || 0) === 0)
|
|
.slice(0, 10)
|
|
.map(doc => doc.data().name)
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error analyzing conversations:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to analyze', details: error instanceof Error ? error.message : String(error) },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|