92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
||
import { PrismaClient } from '@prisma/client'
|
||
|
||
const prisma = new PrismaClient()
|
||
|
||
// 生成固定的用戶會話 ID
|
||
function getUserSession(request: NextRequest): string {
|
||
// 從請求頭中獲取用戶會話 ID(由前端設置)
|
||
const userSession = request.headers.get('x-user-session')
|
||
|
||
if (userSession) {
|
||
return userSession
|
||
}
|
||
|
||
// 如果沒有會話 ID,生成一個新的
|
||
return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
||
}
|
||
|
||
export async function POST(request: NextRequest) {
|
||
try {
|
||
const body = await request.json()
|
||
const { wishId } = body
|
||
|
||
if (!wishId) {
|
||
return NextResponse.json(
|
||
{ success: false, error: 'Wish ID is required' },
|
||
{ status: 400 }
|
||
)
|
||
}
|
||
|
||
// 獲取用戶會話 ID
|
||
const userSession = getUserSession(request)
|
||
|
||
try {
|
||
await prisma.wishLike.create({
|
||
data: {
|
||
wishId: Number(wishId),
|
||
userSession: userSession,
|
||
}
|
||
})
|
||
|
||
return NextResponse.json({ success: true, data: { liked: true } })
|
||
} catch (error: any) {
|
||
if (error.code === 'P2002') {
|
||
// 重複點讚
|
||
return NextResponse.json({ success: true, data: { liked: false } })
|
||
}
|
||
throw error
|
||
}
|
||
} catch (error) {
|
||
console.error('API Error:', error)
|
||
return NextResponse.json(
|
||
{ success: false, error: 'Failed to like wish' },
|
||
{ status: 500 }
|
||
)
|
||
}
|
||
}
|
||
|
||
export async function GET(request: NextRequest) {
|
||
try {
|
||
const { searchParams } = new URL(request.url)
|
||
const wishId = searchParams.get('wishId')
|
||
|
||
if (!wishId) {
|
||
return NextResponse.json(
|
||
{ success: false, error: 'Wish ID is required' },
|
||
{ status: 400 }
|
||
)
|
||
}
|
||
|
||
// 獲取用戶會話 ID
|
||
const userSession = getUserSession(request)
|
||
|
||
const like = await prisma.wishLike.findFirst({
|
||
where: {
|
||
wishId: Number(wishId),
|
||
userSession: userSession
|
||
}
|
||
})
|
||
|
||
const liked = !!like
|
||
|
||
return NextResponse.json({ success: true, data: { liked } })
|
||
} catch (error) {
|
||
console.error('API Error:', error)
|
||
return NextResponse.json(
|
||
{ success: false, error: 'Failed to check like status' },
|
||
{ status: 500 }
|
||
)
|
||
}
|
||
}
|