41 lines
1.6 KiB
TypeScript
41 lines
1.6 KiB
TypeScript
import { records, saveRecord } from '../../utils/studio2/store'
|
|
import { dismissFinishedStudioJobs, dismissStudioJob, listStudioJobs } from '../../utils/studioQueue'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const { owner } = assertLibraryOwner(event)
|
|
const body = await readBody<{ id?: string }>(event).catch(() => ({} as { id?: string }))
|
|
const queue = listStudioJobs(owner)
|
|
let cleared = 0
|
|
|
|
if (body?.id) {
|
|
const row = queue.find(job => job.id === body.id)
|
|
if (!row) throw createError({ statusCode: 404, statusMessage: 'Queued job not found' })
|
|
try { assertFolderAccess(event, row.payload.folderId) } catch {
|
|
throw createError({ statusCode: 403, statusMessage: 'Folder locked' })
|
|
}
|
|
await dismissStudioJob(owner, body.id)
|
|
return { cleared: 1 }
|
|
}
|
|
|
|
for (const r of records(owner)) {
|
|
try { assertFolderAccess(event, r.request.folderId) } catch { continue }
|
|
const status = queue.find(q => q.id === r.queueId)?.status
|
|
if (['complete', 'failed', 'cancelled'].includes(r.state) || ['cancelled', 'error'].includes(status || '')) {
|
|
r.dismissed = true
|
|
saveRecord(r)
|
|
cleared++
|
|
}
|
|
}
|
|
|
|
// Caption (and other finished studio-queue) cards — hide from Queue, keep resultText on the row
|
|
const finishedIds = queue
|
|
.filter(job => !job.dismissed && ['complete', 'error', 'cancelled'].includes(job.status))
|
|
.filter(job => {
|
|
try { assertFolderAccess(event, job.payload.folderId); return true } catch { return false }
|
|
})
|
|
.map(job => job.id)
|
|
cleared += await dismissFinishedStudioJobs(owner, finishedIds)
|
|
|
|
return { cleared }
|
|
})
|