refactor: use PostgreSQL trigger for status sync instead of manual cache update

Core Team implemented PostgreSQL trigger (sync_video_status) that automatically
syncs videos.status when monitor_jobs.status changes. Removed frontend workaround
that manually updated filesCache/fileStatusCache.

Now ctxPause/batchPause call loadFiles() + loadPausedFiles() after success
to get the properly synced status from backend.
This commit is contained in:
2026-10-18 22:14:19 +08:00
parent a64e200ca5
commit ed15f4c3e7

View File

@@ -2279,28 +2279,20 @@ async function ctxPause(f: any) {
if (!f?.file_uuid) { console.error('[ctxPause] no file_uuid'); return } if (!f?.file_uuid) { console.error('[ctxPause] no file_uuid'); return }
try { try {
const base = getApiBase() const base = getApiBase()
const url = `${base}/api/v1/jobs/${f.file_uuid}/pause` const res = await fetch(`${base}/api/v1/jobs/${f.file_uuid}/pause`, { method: 'POST' })
console.log('[ctxPause] calling:', url)
const res = await fetch(url, { method: 'POST' })
console.log('[ctxPause] response status:', res.status)
if (res.ok) { if (res.ok) {
pausedFileUuids.value = new Set(pausedFileUuids.value).add(f.file_uuid) pausedFileUuids.value = new Set(pausedFileUuids.value).add(f.file_uuid)
// Manually update file status in cache (backend pause only updates monitor_jobs, not videos table) // Reload files to get synced status from backend (PostgreSQL trigger syncs videos.status)
const file = filesCache.value.find((x: any) => x.file_uuid === f.file_uuid) await loadFiles()
if (file) { await loadPausedFiles()
file.status = 'paused'
fileStatusCache.value[f.file_uuid] = 'paused'
}
actionMsg.value = `⏸ Paused: ${f.file_name}` actionMsg.value = `⏸ Paused: ${f.file_name}`
console.log('[ctxPause] success, status updated to paused')
} else { } else {
const err = await res.json().catch(() => ({})) const err = await res.json().catch(() => ({}))
actionMsg.value = `Pause failed: ${err.error || res.statusText}` actionMsg.value = `Pause failed: ${err.error || res.statusText}`
console.error('[ctxPause] failed:', err)
} }
} catch (e: any) { } catch (e: any) {
actionMsg.value = `Pause error: ${e.message}` actionMsg.value = `Pause error: ${e.message}`
console.error('[ctxPause] error:', e) console.error('[ctxPause]', e)
} }
setTimeout(() => { actionMsg.value = '' }, 5000) setTimeout(() => { actionMsg.value = '' }, 5000)
} }
@@ -2342,12 +2334,6 @@ async function batchPause() {
try { try {
const res = await fetch(`${base}/api/v1/jobs/${f.file_uuid}/pause`, { method: 'POST' }) const res = await fetch(`${base}/api/v1/jobs/${f.file_uuid}/pause`, { method: 'POST' })
if (res.ok) { if (res.ok) {
// Manually update status in cache
const file = filesCache.value.find((x: any) => x.file_uuid === f.file_uuid)
if (file) {
file.status = 'paused'
fileStatusCache.value[f.file_uuid] = 'paused'
}
successCount++ successCount++
} else { } else {
failCount++ failCount++
@@ -2360,10 +2346,10 @@ async function batchPause() {
await Promise.all(filesToPause.map(f => limit(() => pauseFile(f)))) await Promise.all(filesToPause.map(f => limit(() => pauseFile(f))))
// Update paused set for reactivity
pausedFileUuids.value = new Set(pausedFileUuids.value)
if (successCount > 0) { if (successCount > 0) {
// Reload files to get synced status from backend (PostgreSQL trigger syncs videos.status)
await loadFiles()
await loadPausedFiles()
actionMsg.value = `⏸ Paused ${successCount} files${failCount > 0 ? `, ${failCount} failed` : ''}` actionMsg.value = `⏸ Paused ${successCount} files${failCount > 0 ? `, ${failCount} failed` : ''}`
} else { } else {
actionMsg.value = `Failed to pause all ${failCount} files` actionMsg.value = `Failed to pause all ${failCount} files`