159 lines
3.9 KiB
TypeScript
159 lines
3.9 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|
|
|