dptxa-proxy / src /pages /api /admin /movie /edit-comment.js
TXAVLOG
Deploy DPTXA to Hugging Face Spaces
4bea261
Raw
History Blame Contribute Delete
4.35 kB
import { txasupabase } from '../../../../lib/txasupabase.js';
export async function POST({ request, cookies }) {
// Check Admin privilege
const token = cookies.get('auth_token')?.value;
let user = null;
if (token) {
try {
user = JSON.parse(Buffer.from(token, 'base64').toString('utf-8'));
} catch (e) {}
}
if (!user || user.role !== 'admin') {
return new Response(JSON.stringify({ error: 'Bạn không có quyền quản trị để thực hiện!' }), {
status: 403,
headers: { 'Content-Type': 'application/json' }
});
}
try {
const { commentId, commentIds, isSpoiler, usernames, action } = await request.json();
if (!action) {
return new Response(JSON.stringify({ error: 'Thiếu hành động!' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
// A. BẬT / TẮT SPOILER ĐƠN
if (action === 'toggle_spoiler') {
if (!commentId) {
return new Response(JSON.stringify({ error: 'Thiếu ID bình luận!' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
const { error } = await txasupabase.supabase
.from('comments')
.update({ is_spoiler: !!isSpoiler })
.eq('id', commentId);
if (error) throw error;
return new Response(JSON.stringify({ message: 'Cập nhật trạng thái Spoiler thành công!' }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
}
// B. XÓA HÀNG LOẠT BÌNH LUẬN
if (action === 'bulk_delete') {
if (!Array.isArray(commentIds) || commentIds.length === 0) {
return new Response(JSON.stringify({ error: 'Chưa chọn bình luận nào để xóa!' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
const { error } = await txasupabase.supabase
.from('comments')
.delete()
.in('id', commentIds);
if (error) throw error;
return new Response(JSON.stringify({ message: `Đã xóa thành công ${commentIds.length} bình luận!` }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
}
// C. BẬT / TẮT SPOILER HÀNG LOẠT
if (action === 'bulk_spoiler') {
if (!Array.isArray(commentIds) || commentIds.length === 0) {
return new Response(JSON.stringify({ error: 'Chưa chọn bình luận nào để cập nhật!' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
const { error } = await txasupabase.supabase
.from('comments')
.update({ is_spoiler: !!isSpoiler })
.in('id', commentIds);
if (error) throw error;
return new Response(JSON.stringify({ message: `Đã cập nhật Spoiler thành công cho ${commentIds.length} bình luận!` }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
}
// D. CHẶN HÀNG LOẠT NGƯỜI DÙNG
if (action === 'bulk_ban') {
if (!Array.isArray(usernames) || usernames.length === 0) {
return new Response(JSON.stringify({ error: 'Chưa chọn người dùng nào để chặn!' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
let bannedUsers = await txasupabase.getSetting('banned_commenters') || [];
if (!Array.isArray(bannedUsers)) bannedUsers = [];
usernames.forEach(uname => {
if (!bannedUsers.includes(uname)) {
bannedUsers.push(uname);
}
});
await txasupabase.saveSetting('banned_commenters', bannedUsers);
return new Response(JSON.stringify({ message: `Đã chặn bình luận thành công đối với ${usernames.length} tài khoản!` }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
}
return new Response(JSON.stringify({ error: 'Hành động không được hỗ trợ!' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
} catch (error) {
return new Response(JSON.stringify({ error: 'Lỗi máy chủ: ' + error.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
}