Files

74 lines
2.5 KiB
JavaScript

import db from '../utils/db.js'
import { unlink } from 'fs/promises'
import { existsSync } from 'fs'
import { startProcessor as startModerationProcessor, retryFailedTasks } from '../utils/moderationQueue.js'
import { getUploadsDirPath, getImagePath } from '../utils/upload.js'
// 定时任务间隔(毫秒)
const RETRY_FAILED_TASKS_INTERVAL = 60 * 60 * 1000 // 1 小时
// 硬删除已软删除的图片文件
export async function hardDeleteImages() {
try {
const deletedImages = await db.images.find({ isDeleted: true })
if (deletedImages.length === 0) {
return { success: true, count: 0, message: '没有需要硬删除的图片' }
}
let deletedCount = 0
for (const image of deletedImages) {
try {
// 删除物理文件
const filePath = getImagePath(image.filename)
if (existsSync(filePath)) {
await unlink(filePath)
}
// 从数据库中彻底删除记录
await db.images.remove({ _id: image._id })
deletedCount++
} catch (err) {
console.error(`[Scheduler] 硬删除图片失败 ${image.uuid}:`, err)
}
}
console.log(`[Scheduler] 已硬删除 ${deletedCount} 张图片`)
return { success: true, count: deletedCount, message: `已硬删除 ${deletedCount} 张图片` }
} catch (error) {
console.error('[Scheduler] 硬删除图片时出错:', error)
return { success: false, count: 0, message: error.message }
}
}
// 重试失败的审核任务
async function retryFailedModerationTasks() {
try {
// 获取 error 状态的任务数量
const errorCount = await db.moderationTasks.count({ status: 'error' })
if (errorCount === 0) {
console.log('[Scheduler] 没有需要重试的失败审核任务')
return
}
console.log(`[Scheduler] 发现 ${errorCount} 个失败的审核任务,开始重试...`)
const result = await retryFailedTasks()
console.log(`[Scheduler] 已重置 ${result.count} 个失败的审核任务`)
} catch (error) {
console.error('[Scheduler] 重试失败审核任务时出错:', error)
}
}
export default defineNitroPlugin(() => {
// 启动内容审核任务处理器
startModerationProcessor()
console.log('[Scheduler] 内容审核任务处理器已启动')
// 启动定时任务:每小时重试失败的审核任务
setInterval(() => {
retryFailedModerationTasks()
}, RETRY_FAILED_TASKS_INTERVAL)
console.log('[Scheduler] 失败审核任务重试定时器已启动(每小时执行一次)')
})