VIBN Frontend for Coolify deployment

This commit is contained in:
2026-02-15 19:25:52 -08:00
commit 40bf8428cd
398 changed files with 76513 additions and 0 deletions

View File

@@ -0,0 +1,158 @@
import { NextRequest, NextResponse } from 'next/server';
import { adminDb } from '@/lib/firebase/admin';
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ projectId: string }> }
) {
try {
const { projectId } = await params;
const body = await request.json();
const { title, content, type, source } = body;
if (!title || !content) {
return NextResponse.json(
{ error: 'Title and content are required' },
{ status: 400 }
);
}
// Create document
const docRef = await adminDb
.collection('projects')
.doc(projectId)
.collection('documents')
.add({
title,
content,
type: type || 'text', // text, markdown, pdf, etc.
source: source || 'manual_upload', // chatgpt, slack, manual_upload, etc.
uploadedAt: new Date().toISOString(),
wordCount: content.split(/\s+/).length,
charCount: content.length
});
console.log(`✅ Document uploaded: ${title} (${docRef.id})`);
return NextResponse.json({
success: true,
documentId: docRef.id,
message: 'Document uploaded successfully'
});
} catch (error) {
console.error('Error uploading document:', error);
return NextResponse.json(
{
error: 'Failed to upload document',
details: error instanceof Error ? error.message : String(error)
},
{ status: 500 }
);
}
}
// Batch upload multiple documents
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ projectId: string }> }
) {
try {
const { projectId } = await params;
const body = await request.json();
const { documents } = body;
if (!Array.isArray(documents) || documents.length === 0) {
return NextResponse.json(
{ error: 'Documents array is required' },
{ status: 400 }
);
}
const uploadedDocs = [];
for (const doc of documents) {
if (!doc.title || !doc.content) {
continue; // Skip invalid documents
}
const docRef = await adminDb
.collection('projects')
.doc(projectId)
.collection('documents')
.add({
title: doc.title,
content: doc.content,
type: doc.type || 'text',
source: doc.source || 'batch_upload',
uploadedAt: new Date().toISOString(),
wordCount: doc.content.split(/\s+/).length,
charCount: doc.content.length,
metadata: doc.metadata || {}
});
uploadedDocs.push({
id: docRef.id,
title: doc.title
});
}
console.log(`✅ Batch uploaded ${uploadedDocs.length} documents`);
return NextResponse.json({
success: true,
uploadedCount: uploadedDocs.length,
documents: uploadedDocs
});
} catch (error) {
console.error('Error batch uploading documents:', error);
return NextResponse.json(
{
error: 'Failed to batch upload documents',
details: error instanceof Error ? error.message : String(error)
},
{ status: 500 }
);
}
}
// Get all documents
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ projectId: string }> }
) {
try {
const { projectId } = await params;
const documentsSnapshot = await adminDb
.collection('projects')
.doc(projectId)
.collection('documents')
.orderBy('uploadedAt', 'desc')
.get();
const documents = documentsSnapshot.docs.map(doc => ({
id: doc.id,
...doc.data()
}));
return NextResponse.json({
total: documents.length,
documents
});
} catch (error) {
console.error('Error fetching documents:', error);
return NextResponse.json(
{
error: 'Failed to fetch documents',
details: error instanceof Error ? error.message : String(error)
},
{ status: 500 }
);
}
}