Spaces:
Sleeping
Sleeping
| import { txasupabase } from '../../../lib/txasupabase.js'; | |
| export const POST = async ({ request, cookies }) => { | |
| const token = cookies.get('auth_token')?.value; | |
| if (!token) return new Response(JSON.stringify({ error: 'Bạn cần đăng nhập để đánh giá!' }), { status: 401 }); | |
| // Lấy địa chỉ IP của người dùng | |
| const ip = request.headers.get('x-forwarded-for') || request.headers.get('cf-connecting-ip') || '127.0.0.1'; | |
| try { | |
| const { movieSlug, score } = await request.json(); | |
| const userData = JSON.parse(Buffer.from(token, 'base64').toString('utf-8')); | |
| if (score < 1 || score > 10) return new Response(JSON.stringify({ error: 'Điểm không hợp lệ!' }), { status: 400 }); | |
| const ratingObj = await txasupabase.getRatingBySlug(movieSlug); | |
| let totalScore = ratingObj ? Number(ratingObj.total_score) : 0; | |
| let count = ratingObj ? ratingObj.count : 0; | |
| let userRatings = ratingObj ? ratingObj.user_ratings : {}; | |
| let ipRatings = ratingObj ? ratingObj.ip_ratings : {}; | |
| // Giới hạn 1 người / 1 phim duy nhất | |
| if (userRatings[userData.username]) { | |
| return new Response(JSON.stringify({ error: 'Bạn đã đánh giá bộ phim này rồi! Mỗi thành viên chỉ được đánh giá một lần.' }), { status: 403 }); | |
| } | |
| // Kiểm tra xem IP đã được đánh giá chưa | |
| if (ipRatings[ip]) { | |
| return new Response(JSON.stringify({ error: 'Mỗi địa chỉ IP chỉ được đánh giá phim này một lần!' }), { status: 403 }); | |
| } | |
| totalScore += score; | |
| count += 1; | |
| userRatings[userData.username] = score; | |
| ipRatings[ip] = score; | |
| await txasupabase.saveRating(movieSlug, count, totalScore, userRatings, ipRatings); | |
| return new Response(JSON.stringify({ | |
| message: 'Cảm ơn bạn đã đánh giá!', | |
| average: totalScore / count, | |
| count: count | |
| }), { status: 200 }); | |
| } catch (err) { | |
| console.error('[Rate POST Error]:', err); | |
| return new Response(JSON.stringify({ error: 'Lỗi hệ thống!' }), { status: 500 }); | |
| } | |
| }; | |
| export const GET = async ({ url }) => { | |
| const movieSlug = new URL(url).searchParams.get('slug'); | |
| if (!movieSlug) return new Response(JSON.stringify({ average: 0, count: 0 }), { status: 200 }); | |
| try { | |
| const ratingObj = await txasupabase.getRatingBySlug(movieSlug); | |
| if (!ratingObj || ratingObj.count === 0) return new Response(JSON.stringify({ average: 0, count: 0 }), { status: 200 }); | |
| return new Response(JSON.stringify({ | |
| average: ratingObj.total_score / ratingObj.count, | |
| count: ratingObj.count | |
| }), { status: 200 }); | |
| } catch (err) { | |
| console.error('[Rate GET Error]:', err); | |
| return new Response(JSON.stringify({ average: 0, count: 0 }), { status: 200 }); | |
| } | |
| }; | |