115 lines
3.7 KiB
TypeScript
115 lines
3.7 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { EvaluationService, ProjectService, ProjectFileService, ProjectWebsiteService } from '@/lib/services/database';
|
|
import { unlink } from 'fs/promises';
|
|
import { join } from 'path';
|
|
|
|
export async function DELETE(
|
|
request: NextRequest,
|
|
{ params }: { params: { id: string } }
|
|
) {
|
|
try {
|
|
const evaluationId = parseInt(params.id);
|
|
|
|
if (isNaN(evaluationId)) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '無效的評審ID' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
console.log(`🗑️ 開始刪除評審記錄: ID=${evaluationId}`);
|
|
|
|
// 獲取評審記錄以找到對應的專案
|
|
const evaluation = await EvaluationService.findById(evaluationId);
|
|
if (!evaluation) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '找不到指定的評審記錄' },
|
|
{ status: 404 }
|
|
);
|
|
}
|
|
|
|
const projectId = evaluation.project_id;
|
|
console.log(`📋 找到對應專案: ID=${projectId}`);
|
|
|
|
// 獲取專案信息
|
|
const project = await ProjectService.findById(projectId);
|
|
if (!project) {
|
|
return NextResponse.json(
|
|
{ success: false, error: '找不到對應的專案' },
|
|
{ status: 404 }
|
|
);
|
|
}
|
|
|
|
// 獲取專案文件列表
|
|
const projectFiles = await ProjectFileService.findByProjectId(projectId);
|
|
console.log(`📁 找到 ${projectFiles.length} 個專案文件`);
|
|
|
|
// 開始事務性刪除
|
|
try {
|
|
// 1. 刪除評審相關數據(這些會因為外鍵約束自動刪除)
|
|
// - evaluation_scores (CASCADE)
|
|
// - evaluation_feedback (CASCADE)
|
|
await EvaluationService.delete(evaluationId);
|
|
console.log(`✅ 已刪除評審記錄: ID=${evaluationId}`);
|
|
|
|
// 2. 刪除專案網站記錄
|
|
const projectWebsites = await ProjectWebsiteService.findByProjectId(projectId);
|
|
for (const website of projectWebsites) {
|
|
await ProjectWebsiteService.delete(website.id);
|
|
}
|
|
console.log(`✅ 已刪除 ${projectWebsites.length} 個專案網站記錄`);
|
|
|
|
// 3. 刪除專案文件記錄和實際文件
|
|
for (const file of projectFiles) {
|
|
try {
|
|
// 刪除實際文件
|
|
const filePath = join(process.cwd(), file.file_path);
|
|
await unlink(filePath);
|
|
console.log(`🗑️ 已刪除文件: ${file.original_name}`);
|
|
} catch (fileError) {
|
|
console.warn(`⚠️ 刪除文件失敗: ${file.original_name}`, fileError);
|
|
// 繼續刪除其他文件,不中斷整個流程
|
|
}
|
|
|
|
// 刪除文件記錄
|
|
await ProjectFileService.delete(file.id);
|
|
}
|
|
console.log(`✅ 已刪除 ${projectFiles.length} 個專案文件記錄`);
|
|
|
|
// 4. 刪除專案記錄
|
|
await ProjectService.delete(projectId);
|
|
console.log(`✅ 已刪除專案記錄: ID=${projectId}`);
|
|
|
|
console.log(`🎉 成功刪除評審報告: 專案=${project.title}`);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: '評審報告已成功刪除',
|
|
data: {
|
|
projectId: projectId,
|
|
projectTitle: project.title,
|
|
deletedFiles: projectFiles.length,
|
|
deletedWebsites: projectWebsites.length
|
|
}
|
|
});
|
|
|
|
} catch (deleteError) {
|
|
console.error('❌ 刪除過程中發生錯誤:', deleteError);
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: '刪除過程中發生錯誤,請稍後再試'
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ 刪除評審記錄失敗:', error);
|
|
return NextResponse.json(
|
|
{ success: false, error: '刪除評審記錄失敗' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|