Delete job: cascade delete povsod (Nextcloud + dedup DB + S3 + lokal)

PROBLEM: '✕' gumb je do zdaj brisal samo lokalne fajle + S3, ampak
NE Nextcloud upload (rel je ostal na folxspeed/REELS/{TV}/) in NE
dedup DB zapis (zato se enaka pesem ni mogla več upload-ati).

NEW BACKEND:
- _nextcloud_delete(filename, target_subdir) helper preko WebDAV DELETE
  (404 šteje kot success — če že ne obstaja, OK)
- delete_job() razširjen:
  1. Nextcloud delete (če nextcloud_status='uploaded' ali ima nextcloud_url)
  2. Dedup DB remove (processed_videos zapis za tisto TV postajo)
  3. Lokal + S3 delete vseh workfile-ov (kot prej)
  4. Glob za yt-dlp artifacte ({job_id}_yt*) — info.json, .part, .f137.mp4
  5. Job metadata
- Response: {deleted, nextcloud_delete: 'ok'|'not_found'|'fail: msg', nextcloud_filename}

NEW FRONTEND:
- buildJobEl() doda data-nc-status atribut na kartico
- deleteJob() bere dataset.ncStatus za Nextcloud info
- Confirm dialog detail razložen seznam KAJ se zbriše + opozorilo če Nextcloud
- Če Nextcloud delete ni uspel po API klicu, alert
This commit is contained in:
Claude
2026-05-03 14:52:40 +00:00
parent 79f611ba73
commit 12e8edba93
2 changed files with 99 additions and 11 deletions
+16 -2
View File
@@ -1224,6 +1224,7 @@
el.className = "job";
el.id = `job-${job.id}`;
el.dataset.id = job.id;
if (job.nextcloud_status) el.dataset.ncStatus = job.nextcloud_status;
// Vizualni hint če je že naložen na Nextcloud
if (job.nextcloud_status === "uploaded") {
@@ -1360,8 +1361,21 @@
}
async function deleteJob(id) {
if (!confirm("Izbrišem ta job?")) return;
await fetch(`/api/jobs/${id}`, { method: "DELETE" });
// Najdi job v listu da lahko prikažem ime + Nextcloud status
const card = document.getElementById(`job-${id}`);
const title = card ? (card.querySelector(".job-title")?.textContent || id) : id;
const isUploaded = card && card.dataset.ncStatus === "uploaded";
const ncWarn = isUploaded
? "\n\n☁ POZOR: ta rel je bil naložen na Nextcloud — bo zbrisan tudi tam (in iz dedup DB)."
: "";
if (!confirm(`Izbrišem ta job?\n\n"${title}"${ncWarn}\n\nTo zbriše:\n• job iz seznama\n• video + podnapisi (lokal + S3)\n• YouTube original\n• analizo + waveform${isUploaded ? "\n• datoteko iz Nextclouda\n• zapis iz dedup DB (lahko boš ga ponovno naložil)" : ""}`)) return;
const r = await fetch(`/api/jobs/${id}`, { method: "DELETE" });
if (r.ok) {
const data = await r.json().catch(() => ({}));
if (data.nextcloud_delete && data.nextcloud_delete.startsWith("fail")) {
alert(`Job zbrisan, ampak Nextcloud delete ni uspel:\n${data.nextcloud_delete}`);
}
}
refreshJobs();
}