Files
kr-phim/server/api/comments/index.post.ts
T
ngthanhvu 320eed551e feat: enhance comment section with reply functionality and pinning feature
- Added ability to pin comments for admin users.
- Implemented nested replies with a recursive component for better organization.
- Improved comment loading with time-ago formatting for replies.
- Refactored comment fetching logic to include replies in a structured format.
- Updated UI to reflect changes in comment state (pinned, anonymous).
- Added loading indicators for comment submission and reply actions.
- Enhanced error handling for comment operations.
2026-07-24 03:39:06 -04:00

64 lines
2.1 KiB
TypeScript

import { eq } from 'drizzle-orm'
import mysql from 'mysql2/promise'
import { comments } from '../../database/schema'
import { getTokenFromEvent, verifyToken } from '../../utils/auth'
export default defineEventHandler(async (event) => {
const token = getTokenFromEvent(event)
if (!token) {
throw createError({ statusCode: 401, message: 'Chưa đăng nhập' })
}
const payload = verifyToken(token)
if (!payload) {
throw createError({ statusCode: 401, message: 'Phiên đăng nhập hết hạn' })
}
const body = await readBody(event)
const { source, slug, content, movieName, parentId, spoiler, anonymous } = body
if (!slug || !content?.trim()) {
throw createError({ statusCode: 400, message: 'Thiếu thông tin bình luận' })
}
if (parentId) {
const db = useDb()
const [parent] = await db.select().from(comments).where(eq(comments.id, Number(parentId)))
if (!parent) {
throw createError({ statusCode: 404, message: 'Không tìm thấy bình luận gốc' })
}
}
const dbUrl = process.env.DATABASE_URL || 'mysql://cinek:cinekpassword@localhost:3306/cinek'
const conn = await mysql.createConnection(dbUrl)
try {
const [result] = await conn.execute(
'INSERT INTO comments (user_id, source, slug, movie_name, content, parent_id, spoiler, anonymous) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
[payload.id, source || '', slug, movieName || null, content.trim(), parentId ? Number(parentId) : null, spoiler ? 1 : 0, anonymous ? 1 : 0]
)
const insertId = (result as any).insertId
if (!insertId) {
throw createError({ statusCode: 500, message: 'Không thể tạo bình luận' })
}
return {
id: Number(insertId),
userId: payload.id,
source: source || '',
slug,
movieName: movieName || null,
content: content.trim(),
spoiler: false,
anonymous: anonymous ? true : false,
parentId: parentId ? Number(parentId) : null,
likeCount: 0,
dislikeCount: 0,
createdAt: new Date().toISOString(),
}
} finally {
await conn.end()
}
})