From 02571093d47904d024feec8a0b7541cd9062bdb9 Mon Sep 17 00:00:00 2001 From: claudio Date: Mon, 11 May 2026 12:54:38 +0200 Subject: [PATCH] 120 mule-images: post-Phase-2 delete-roundtrip patches (A + C) - Folder delete now propagates: webhook handler detects directory deletes and runs a single UPDATE that discards every Photo under the path prefix. - PUT-overwrite of a previously-discarded file now resurrects the Photo row (is_discarded=false, re-queue extract_metadata). - Trashbin restore and folder rename remain known gaps (documented). --- containers/120-mule-images.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/containers/120-mule-images.md b/containers/120-mule-images.md index e60f568..ef4b793 100644 --- a/containers/120-mule-images.md +++ b/containers/120-mule-images.md @@ -104,6 +104,17 @@ Two big architectural shifts in one session, both aimed at killing work mule was **NC cron tightened to `*/1` so webhook delivery latency drops from up to 5 min to ~60 s** (`crontab -u www-data` on LXC 114). NC dispatches webhook calls through its background-job queue; the cron interval = the worst-case latency. `*/5` was the default; `*/1` is the upstream recommendation anyway. +**Post-Phase-2 delete-roundtrip patches (commit `9408825`).** End-to-end testing of the NC↔mule deletion paths surfaced two real gaps: + +1. *Folder delete* — NC fires one `NodeDeletedEvent` for the folder, not one per child. The webhook handler bailed with "unsupported extension" and photos under the deleted folder kept `is_discarded=false` until the 30-min reconcile sweep. Fix: `handle_directory_deletion()` does a single `UPDATE photos SET is_discarded=true WHERE filepath LIKE 'dir/%'` when the deleted path has no supported image extension. +2. *Resurrect on rewrite* — PUT-overwrite of a previously-discarded file fired `NodeWrittenEvent` → `scan_folder`, but scan_folder's "photo exists, skip" branch left `is_discarded=true`. Fix: when the existing row is discarded, flip `is_discarded=false`, clear `discarded_at`, re-queue `extract_metadata`. + +Verified end-to-end on `Photos/MuleTestFolder/{test1,test2,nested/test3}.jpg`: `DELETE Photos/MuleTestFolder/` discarded all 3 in one shot; `PUT test1.jpg` back resurrected only that one. + +**Known remaining gap — trashbin restore.** Moving a file out of `/dav/trashbin/.../trash/foo.jpg.dXXXX` back to `/files/...` via WebDAV MOVE fires **no event mule subscribes to**. NC's trashbin app emits its own internal event class that isn't in the `OCP\Files\Events\Node\*` set we registered with `webhook_listeners`. Workaround: re-upload via PUT (covered by the resurrect-on-rewrite fix above) or wait for the 30-min reconcile sweep. + +**Also known — folder rename.** Like folder delete pre-patch, a renamed directory fires one `NodeRenamedEvent` on the folder itself; the handler ignores it because the path has no supported extension. Children retain stale `filepath` rows. Fix would mirror the directory-delete approach: `UPDATE photos SET filepath = REPLACE(filepath, old_prefix, new_prefix) WHERE filepath LIKE old_prefix||'/%'`. Not yet implemented. + **Open: Phase 3.** Enable the Nextcloud Memories app (currently installed but disabled) and read `taken_at` / `lat` / `lon` / `w` / `h` from `oc_memories` instead of running mule's own `extract_metadata`. Keep pHash + file_hash for dedup. When that lands, the vision worker can also stop needing on-disk medium thumbs and the whole `/data/thumbs` pipeline retires. ### 2026-05-11 — Duplicates view shows parent folder + full-path tooltip