Files

162 lines
4.6 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { createTestResult, getTestResultsByUserId } from '@/lib/database/models/test_result'
import { createCreativeTestAnswers } from '@/lib/database/models/creative_test_answer'
import { getAllCreativeQuestions } from '@/lib/database/models/creative_question'
export async function POST(request: NextRequest) {
let body: any
try {
body = await request.json()
const {
userId,
answers,
completedAt
} = body
// 驗證必要欄位
if (!userId || !answers || !completedAt) {
return NextResponse.json(
{ success: false, error: '缺少必要欄位' },
{ status: 400 }
)
}
// 獲取創意題目
const questions = await getAllCreativeQuestions()
if (questions.length === 0) {
return NextResponse.json(
{ success: false, error: '無法獲取題目' },
{ status: 500 }
)
}
// 計算分數(包含反向題處理)
let totalScore = 0
const answerRecords = []
for (let i = 0; i < questions.length; i++) {
const question = questions[i]
const userAnswer = answers[i] || 1 // 預設為1
// 處理反向題:如果是反向題,分數要反轉
let score = userAnswer
if (question.is_reverse) {
score = 6 - userAnswer // 5->1, 4->2, 3->3, 2->4, 1->5
}
totalScore += score
answerRecords.push({
test_result_id: '', // 稍後填入
question_id: question.id,
user_answer: userAnswer,
score: score
})
}
// 計算百分比分數
const maxPossibleScore = questions.length * 5 // 每題最高5分
const scorePercentage = Math.round((totalScore / maxPossibleScore) * 100)
// 建立測試結果
console.log('🔄 開始建立創意測驗結果...')
console.log('測試結果數據:', {
user_id: userId,
test_type: 'creative',
score: scorePercentage,
total_questions: questions.length,
correct_answers: totalScore, // 創意測驗用總分數代替正確答案數
completed_at: completedAt
})
// 統一使用台灣時間格式
// 將 UTC 時間轉換為台灣時間,然後轉換為 MySQL 格式
const utcDate = new Date(completedAt)
const taiwanTime = new Date(utcDate.getTime() + (8 * 60 * 60 * 1000)) // UTC + 8 小時
const mysqlCompletedAt = taiwanTime.toISOString().replace('Z', '').replace('T', ' ')
const testResult = await createTestResult({
user_id: userId,
test_type: 'creative',
score: scorePercentage,
total_questions: questions.length,
correct_answers: totalScore,
completed_at: mysqlCompletedAt
})
console.log('測試結果建立結果:', testResult)
if (!testResult) {
console.error('❌ 建立測試結果失敗')
return NextResponse.json(
{ success: false, error: '建立測試結果失敗' },
{ status: 500 }
)
}
console.log('✅ 測試結果建立成功:', testResult.id)
// 更新答案記錄的 test_result_id
answerRecords.forEach(record => {
record.test_result_id = testResult.id
})
// 建立答案記錄
const answerResults = await createCreativeTestAnswers(answerRecords)
return NextResponse.json({
success: true,
data: {
testResult,
answerCount: answerResults.length
}
})
} catch (error) {
console.error('上傳創意測驗結果失敗:', error)
console.error('錯誤詳情:', {
message: error instanceof Error ? error.message : '未知錯誤',
stack: error instanceof Error ? error.stack : undefined,
body: body
})
return NextResponse.json(
{
success: false,
error: '伺服器錯誤',
details: error instanceof Error ? error.message : '未知錯誤'
},
{ status: 500 }
)
}
}
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url)
const userId = searchParams.get('userId')
if (!userId) {
return NextResponse.json(
{ success: false, error: '缺少用戶ID' },
{ status: 400 }
)
}
// 獲取用戶的創意測驗結果
const results = await getTestResultsByUserId(userId)
const creativeResults = results.filter(r => r.test_type === 'creative')
return NextResponse.json({
success: true,
data: creativeResults
})
} catch (error) {
console.error('獲取創意測驗結果失敗:', error)
return NextResponse.json(
{ success: false, error: '伺服器錯誤' },
{ status: 500 }
)
}
}