Files
ai-scoring-application/app/api/evaluate/route.ts

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 }
);
}
}