生产环境修正
This commit is contained in:
@@ -59,6 +59,8 @@ app.use('/api/health', (req: Request, res: Response, next: NextFunction): void =
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* error handler middleware
|
||||
*/
|
||||
|
||||
@@ -234,6 +234,37 @@ router.post('/refresh', async (req: Request, res: Response): Promise<void> => {
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Get Captcha
|
||||
* GET /api/auth/captcha
|
||||
*/
|
||||
router.get('/captcha', async (req: Request, res: Response): Promise<void> => {
|
||||
try {
|
||||
// 生成简单的数学验证码
|
||||
const num1 = Math.floor(Math.random() * 10) + 1;
|
||||
const num2 = Math.floor(Math.random() * 10) + 1;
|
||||
const answer = num1 + num2;
|
||||
|
||||
// 生成验证码ID
|
||||
const captchaId = Math.random().toString(36).substring(2, 15);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
captchaId,
|
||||
question: `${num1} + ${num2} = ?`,
|
||||
answer // 在实际生产环境中,这应该存储在服务器端而不是返回给客户端
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取验证码失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '服务器内部错误'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* User Logout
|
||||
* POST /api/auth/logout
|
||||
|
||||
@@ -788,112 +788,7 @@ router.post('/upload', authenticateToken, upload.single('video'), handleMulterEr
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 批量删除视频
|
||||
* DELETE /api/videos/batch
|
||||
*/
|
||||
router.delete('/batch', authenticateToken, async (req: Request, res: Response): Promise<void> => {
|
||||
try {
|
||||
const { videoIds } = req.body;
|
||||
|
||||
if (!videoIds || !Array.isArray(videoIds) || videoIds.length === 0) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: '请提供要删除的视频ID列表'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 验证所有ID都是有效数字
|
||||
const validIds = videoIds.filter(id => typeof id === 'number' && !isNaN(id));
|
||||
if (validIds.length === 0) {
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
message: '无效的视频ID列表'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查用户权限(只能删除自己上传的视频,或管理员可以删除所有视频)
|
||||
const placeholders = validIds.map(() => '?').join(',');
|
||||
const videos = await query(`
|
||||
SELECT id, file_path, cover_image, user_id FROM videos
|
||||
WHERE id IN (${placeholders})
|
||||
`, validIds);
|
||||
|
||||
if (videos.length === 0) {
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
message: '未找到要删除的视频'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查权限
|
||||
const unauthorizedVideos = videos.filter(video =>
|
||||
video.user_id !== req.user!.id && req.user!.role !== 'admin'
|
||||
);
|
||||
|
||||
if (unauthorizedVideos.length > 0) {
|
||||
res.status(403).json({
|
||||
success: false,
|
||||
message: '没有权限删除部分视频'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 删除相关文件
|
||||
for (const video of videos) {
|
||||
try {
|
||||
// 删除视频文件
|
||||
if (video.file_path) {
|
||||
const videoPath = path.join(process.cwd(), video.file_path);
|
||||
if (fs.existsSync(videoPath)) {
|
||||
fs.unlinkSync(videoPath);
|
||||
}
|
||||
}
|
||||
|
||||
// 删除封面文件
|
||||
if (video.cover_image) {
|
||||
const coverPath = path.join(process.cwd(), video.cover_image.replace(/^\//, ''));
|
||||
if (fs.existsSync(coverPath)) {
|
||||
fs.unlinkSync(coverPath);
|
||||
}
|
||||
}
|
||||
} catch (fileError) {
|
||||
// 删除文件失败
|
||||
}
|
||||
}
|
||||
|
||||
// 删除数据库记录
|
||||
const foundIds = videos.map(v => v.id);
|
||||
const foundPlaceholders = foundIds.map(() => '?').join(',');
|
||||
|
||||
// 删除相关统计数据
|
||||
await execute(`DELETE FROM video_stats WHERE video_id IN (${foundPlaceholders})`, foundIds);
|
||||
|
||||
// 删除专题关联
|
||||
await execute(`DELETE FROM video_topics WHERE video_id IN (${foundPlaceholders})`, foundIds);
|
||||
|
||||
// 删除视频记录
|
||||
await execute(`DELETE FROM videos WHERE id IN (${foundPlaceholders})`, foundIds);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: `成功删除 ${foundIds.length} 个视频`,
|
||||
data: {
|
||||
deletedCount: foundIds.length,
|
||||
deletedIds: foundIds
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
// 批量删除视频失败
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '服务器内部错误'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 批量删除视频 (POST方法)
|
||||
@@ -995,9 +890,11 @@ router.post('/batch/delete', authenticateToken, async (req: Request, res: Respon
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('批量删除视频失败:', error);
|
||||
console.error('错误堆栈:', error.stack);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '服务器内部错误'
|
||||
message: '服务器内部错误',
|
||||
error: process.env.NODE_ENV === 'development' ? error.message : undefined
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -1092,6 +989,8 @@ router.put('/batch/status', authenticateToken, async (req: Request, res: Respons
|
||||
* DELETE /api/videos/batch
|
||||
*/
|
||||
router.delete('/batch', authenticateToken, async (req: Request, res: Response): Promise<void> => {
|
||||
console.log('批量删除视频开始,请求体:', req.body);
|
||||
console.log('用户信息:', req.user);
|
||||
try {
|
||||
const { videoIds } = req.body;
|
||||
|
||||
@@ -1127,7 +1026,7 @@ router.delete('/batch', authenticateToken, async (req: Request, res: Response):
|
||||
// 获取要删除的视频信息
|
||||
const placeholders = validIds.map(() => '?').join(',');
|
||||
const videos = await query(`
|
||||
SELECT id, file_path, thumbnail
|
||||
SELECT id, file_path, cover_image
|
||||
FROM videos
|
||||
WHERE id IN (${placeholders})
|
||||
`, validIds);
|
||||
@@ -1150,8 +1049,8 @@ router.delete('/batch', authenticateToken, async (req: Request, res: Response):
|
||||
}
|
||||
|
||||
// 删除缩略图文件
|
||||
if (video.thumbnail) {
|
||||
const thumbnailPath = path.join(process.cwd(), 'public', video.thumbnail);
|
||||
if (video.cover_image) {
|
||||
const thumbnailPath = path.join(process.cwd(), 'public', video.cover_image);
|
||||
if (fs.existsSync(thumbnailPath)) {
|
||||
fs.unlinkSync(thumbnailPath);
|
||||
// 缩略图删除成功
|
||||
@@ -1185,9 +1084,11 @@ router.delete('/batch', authenticateToken, async (req: Request, res: Response):
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('批量删除视频失败:', error);
|
||||
console.error('错误堆栈:', error.stack);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '服务器内部错误'
|
||||
message: '服务器内部错误',
|
||||
error: process.env.NODE_ENV === 'development' ? error.message : undefined
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user