140 lines
4.3 KiB
TypeScript
140 lines
4.3 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { GeminiService } from '@/lib/services/gemini';
|
|
import { CriteriaItemService } from '@/lib/services/database';
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const formData = await request.formData();
|
|
const projectTitle = formData.get('projectTitle') as string;
|
|
const projectDescription = formData.get('projectDescription') as string;
|
|
const file = formData.get('file') as File;
|
|
const websiteUrl = formData.get('websiteUrl') as string;
|
|
|
|
console.log('🚀 開始處理評審請求...');
|
|
console.log('📝 專案標題:', projectTitle);
|
|
console.log('📋 專案描述:', projectDescription);
|
|
console.log('📁 上傳文件:', file ? file.name : '無');
|
|
console.log('🌐 網站連結:', websiteUrl || '無');
|
|
|
|
// 驗證必填欄位
|
|
if (!projectTitle?.trim()) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '請填寫專案標題' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
if (!file && !websiteUrl?.trim()) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '請上傳文件或提供網站連結' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// 獲取評分標準
|
|
console.log('📊 載入評分標準...');
|
|
const templates = await CriteriaItemService.getAllTemplates();
|
|
console.log('📊 載入的模板:', templates);
|
|
|
|
if (!templates || templates.length === 0) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '未找到評分標準,請先設定評分標準' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const criteria = templates[0].items || [];
|
|
console.log('📊 評分項目:', criteria);
|
|
console.log('✅ 評分標準載入完成,共', criteria.length, '個項目');
|
|
|
|
let content = '';
|
|
|
|
if (file) {
|
|
// 處理文件上傳
|
|
console.log('📄 開始處理上傳文件...');
|
|
|
|
// 檢查文件類型
|
|
const allowedTypes = [
|
|
'application/vnd.ms-powerpoint',
|
|
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
'video/mp4',
|
|
'video/avi',
|
|
'video/quicktime',
|
|
'application/pdf',
|
|
'text/plain' // 添加純文字格式用於測試
|
|
];
|
|
|
|
if (!allowedTypes.includes(file.type)) {
|
|
console.log('❌ 不支援的文件格式:', file.type);
|
|
return NextResponse.json(
|
|
{ success: false, error: `不支援的文件格式: ${file.type}` },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// 檢查文件大小 (100MB)
|
|
const maxSize = 100 * 1024 * 1024;
|
|
if (file.size > maxSize) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '文件大小超過 100MB 限制' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// 提取內容
|
|
content = await GeminiService.extractPPTContent(file);
|
|
} else if (websiteUrl) {
|
|
// 處理網站連結
|
|
console.log('🌐 開始處理網站連結...');
|
|
content = `網站內容分析: ${websiteUrl}
|
|
|
|
由於目前是簡化版本,無法直接抓取網站內容。
|
|
實際應用中應該使用網頁抓取技術來獲取網站內容進行分析。
|
|
|
|
專案描述: ${projectDescription || '無'}`;
|
|
}
|
|
|
|
// 使用 Gemini AI 進行評分
|
|
console.log('🤖 開始 AI 評分...');
|
|
const evaluation = await GeminiService.analyzePresentation(
|
|
content,
|
|
projectTitle,
|
|
projectDescription || '',
|
|
criteria
|
|
);
|
|
|
|
// 儲存評審結果到資料庫(可選)
|
|
// TODO: 實作結果儲存功能
|
|
|
|
console.log('🎉 評審完成!');
|
|
console.log('📊 最終評分結果:');
|
|
console.log(' 總分:', evaluation.totalScore, '/', evaluation.maxTotalScore);
|
|
console.log(' 各項目評分:');
|
|
evaluation.results.forEach(result => {
|
|
console.log(` - ${result.criteriaName}: ${result.score}/${result.maxScore}`);
|
|
});
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: {
|
|
evaluation,
|
|
projectTitle,
|
|
projectDescription,
|
|
fileInfo: file ? {
|
|
name: file.name,
|
|
size: file.size,
|
|
type: file.type
|
|
} : null,
|
|
websiteUrl: websiteUrl || null
|
|
}
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('❌ 評審處理失敗:', error);
|
|
return NextResponse.json(
|
|
{ success: false, error: '評審處理失敗,請稍後再試' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|