// ===================================================== // 競賽詳細操作 API // ===================================================== import { NextRequest, NextResponse } from 'next/server'; import { CompetitionService } from '@/lib/services/database-service'; // 獲取單一競賽 export async function GET(request: NextRequest, { params }: { params: { id: string } }) { try { const { id } = await params; const competition = await CompetitionService.getCompetitionWithDetails(id); if (!competition) { return NextResponse.json({ success: false, message: '競賽不存在', error: '找不到指定的競賽' }, { status: 404 }); } return NextResponse.json({ success: true, message: '競賽獲取成功', data: competition }); } catch (error) { console.error('獲取競賽失敗:', error); return NextResponse.json({ success: false, message: '獲取競賽失敗', error: error instanceof Error ? error.message : '未知錯誤' }, { status: 500 }); } } // 更新競賽 export async function PUT(request: NextRequest, { params }: { params: { id: string } }) { try { const { id } = await params; const body = await request.json(); // 檢查競賽是否存在 const existingCompetition = await CompetitionService.getCompetitionById(id); if (!existingCompetition) { return NextResponse.json({ success: false, message: '競賽不存在', error: '找不到指定的競賽' }, { status: 404 }); } // 驗證日期(如果提供) if (body.startDate && body.endDate) { const startDateObj = new Date(body.startDate); const endDateObj = new Date(body.endDate); if (isNaN(startDateObj.getTime()) || isNaN(endDateObj.getTime())) { return NextResponse.json({ success: false, message: '日期格式無效', error: 'startDate 和 endDate 必須是有效的日期格式' }, { status: 400 }); } if (endDateObj <= startDateObj) { return NextResponse.json({ success: false, message: '結束日期不能早於或等於開始日期', error: 'endDate 必須晚於 startDate' }, { status: 400 }); } } // 驗證競賽類型(如果提供) if (body.type) { const validTypes = ['individual', 'team', 'mixed', 'proposal']; if (!validTypes.includes(body.type)) { return NextResponse.json({ success: false, message: '無效的競賽類型', error: `type 必須是以下之一: ${validTypes.join(', ')}` }, { status: 400 }); } } // 驗證狀態(如果提供) if (body.status) { const validStatuses = ['upcoming', 'ongoing', 'active', 'judging', 'completed']; if (!validStatuses.includes(body.status)) { return NextResponse.json({ success: false, message: '無效的競賽狀態', error: `status 必須是以下之一: ${validStatuses.join(', ')}` }, { status: 400 }); } } // 準備更新資料 const updateData: any = {}; if (body.name !== undefined) updateData.name = body.name; if (body.year !== undefined) updateData.year = parseInt(body.year); if (body.month !== undefined) updateData.month = parseInt(body.month); if (body.startDate !== undefined) updateData.start_date = body.startDate; if (body.endDate !== undefined) updateData.end_date = body.endDate; if (body.status !== undefined) updateData.status = body.status; if (body.description !== undefined) updateData.description = body.description; if (body.type !== undefined) updateData.type = body.type; if (body.evaluationFocus !== undefined) updateData.evaluation_focus = body.evaluationFocus; if (body.maxTeamSize !== undefined) updateData.max_team_size = body.maxTeamSize ? parseInt(body.maxTeamSize) : null; if (body.isActive !== undefined) updateData.is_active = body.isActive; // 執行更新 const success = await CompetitionService.updateCompetition(id, updateData); if (!success) { return NextResponse.json({ success: false, message: '更新競賽失敗', error: '無法更新競賽資料' }, { status: 500 }); } // 更新關聯數據 if (body.judges !== undefined) { await CompetitionService.addCompetitionJudges(id, body.judges || []); } if (body.teams !== undefined) { await CompetitionService.addCompetitionTeams(id, body.teams || []); } if (body.participatingApps !== undefined) { await CompetitionService.addCompetitionApps(id, body.participatingApps || []); } if (body.awardTypes !== undefined) { await CompetitionService.addCompetitionAwardTypes(id, body.awardTypes || []); } if (body.rules !== undefined) { await CompetitionService.addCompetitionRules(id, body.rules || []); } // 獲取更新後的完整競賽資料(包含關聯數據) const updatedCompetition = await CompetitionService.getCompetitionWithDetails(id); return NextResponse.json({ success: true, message: '競賽更新成功', data: updatedCompetition }); } catch (error) { console.error('更新競賽失敗:', error); return NextResponse.json({ success: false, message: '更新競賽失敗', error: error instanceof Error ? error.message : '未知錯誤' }, { status: 500 }); } } // 刪除競賽 export async function DELETE(request: NextRequest, { params }: { params: { id: string } }) { try { const { id } = await params; // 檢查競賽是否存在 const existingCompetition = await CompetitionService.getCompetitionById(id); if (!existingCompetition) { return NextResponse.json({ success: false, message: '競賽不存在', error: '找不到指定的競賽' }, { status: 404 }); } // 使用雙寫功能刪除競賽 const success = await CompetitionService.deleteCompetition(id); if (!success) { return NextResponse.json({ success: false, message: '刪除競賽失敗', error: '無法刪除競賽' }, { status: 500 }); } return NextResponse.json({ success: true, message: '競賽刪除成功' }); } catch (error) { console.error('刪除競賽失敗:', error); return NextResponse.json({ success: false, message: '刪除競賽失敗', error: error instanceof Error ? error.message : '未知錯誤' }, { status: 500 }); } }