5e1c99e227
Closes M5 / M7 / M8a / M8b. The optimized PathResolver and the read-side find_*_by_path queries disagree on what counts as 'a path that hits a row'. After the drive- refactor migration rewrote the path column to drop the "My Folder - <user>/" prefix, files PUT through the WebDAV surface stayed reachable by GET (legacy lookup) but vanished from the optimized resolver (strict path-match). MOVE/DELETE/COPY 404'd on every root-level file as a result. Introduces resolve_or_legacy: optimized resolver first, then the GET-style legacy lookups as a strict superset. Ownership is enforced in both branches. handle_delete / handle_move / handle_copy each collapsed from two near-identical resolver-only + legacy-only branches into a single match using the helper — fewer lines, identical semantics, root-level paths now resolve. handle_copy also fixes M8b: copy_file_with_perms takes no destination name, so a copy to a different filename in the same folder collided with the source. After the copy, rename the new file when dest_name differs from source name. Mirrors what handle_move already does.