74 lines
2.5 KiB
JavaScript
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] 失败审核任务重试定时器已启动(每小时执行一次)')
|
|
})
|