dptxa-proxy / src /pages /api /movie /rate.js
TXAVLOG
Deploy DPTXA to Hugging Face Spaces
4bea261
Raw
History Blame Contribute Delete
2.81 kB
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 });
}
};