Files
BYW-VoiceHub/server/api/open/backup/auto.post.ts
T

27 lines
1.1 KiB
TypeScript

import { defineEventHandler } from 'h3'
import { prepareBackup, executeUploads, acquireBackupLock, releaseBackupLock } from '~~/server/services/autoBackupService'
import { createApiError } from '~~/server/utils/apiError'
import { SERVER_ERROR_CODES } from '~~/server/config/constants'
export default defineEventHandler(async () => {
acquireBackupLock()
try {
const prepared = await prepareBackup()
// 必须等待上传完成再返回响应:
// Vercel Serverless 在响应返回后会冻结/回收函数实例,
// 若以 fire-and-forget 后台执行,上传会被中途掐断(socket closed)。
const result = await executeUploads(prepared)
return {
success: result.success,
message: result.success ? '备份完成' : '备份部分或全部失败',
backupId: prepared.historyId,
results: result.results
}
} catch (error: any) {
if (error.statusCode) throw error
throw createApiError(500, SERVER_ERROR_CODES.BACKUP_FAILED, error.message || '备份执行失败')
} finally {
releaseBackupLock()
}
})