mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
feat(r2): clean up the superseded object when a video's URL is replaced on edit
Editing a video with a newly-uploaded file produced a new content-addressed object and orphaned the old one. editModalController.handleSubmit now removes the old object (best-effort) when the hosted URL was genuinely replaced — guarded so it only fires when both old and new URLs are present and different (so clearing the URL, which may still be referenced by a magnet web-seed, never deletes it), and it deliberately leaves thumbnails alone (the new note may still point at them). Reuses R2Service.deleteVideoStorage (owned-objects-only, never throws). Documented the cleanup contract in AGENTS.md §4a. Test: tests/ui/edit-modal-storage-cleanup.test.mjs (3). Full suite green. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
95b51b6e61
commit
33c701aae8
3 files changed
+108
No files matched your search
@@ -1,4 +1,5 @@
|
||||
import { devLogger } from "../utils/logger.js";
|
||||
import r2Service from "../services/r2Service.js";
|
||||
|
||||
export default class EditModalController {
|
||||
constructor({ services, state, ui, callbacks, helpers }) {
|
||||
@@ -90,6 +91,34 @@ export default class EditModalController {
|
||||
updatedData,
|
||||
pubkey,
|
||||
});
|
||||
|
||||
// Best-effort: if the hosted video URL was genuinely replaced, the old
|
||||
// R2/S3 object (and its .torrent) is now orphaned — remove it. We require
|
||||
// both URLs to be non-empty and different so we never delete an object
|
||||
// that's still referenced (e.g. via a magnet web-seed when the URL was
|
||||
// merely cleared). Thumbnails are intentionally left alone here to avoid
|
||||
// deleting one the new note still points at. Never blocks the edit.
|
||||
try {
|
||||
const oldUrl = detail.video?.url || "";
|
||||
const newUrl = updatedData?.url || "";
|
||||
if (updatedData?.urlEdited && oldUrl && newUrl && oldUrl !== newUrl) {
|
||||
const cleanup = await r2Service.deleteVideoStorage({
|
||||
videos: [{ url: oldUrl }],
|
||||
pubkey,
|
||||
});
|
||||
if (cleanup?.deleted?.length) {
|
||||
devLogger.log(
|
||||
`[edit] Removed ${cleanup.deleted.length} superseded storage object(s).`
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (cleanupErr) {
|
||||
devLogger.warn(
|
||||
"[edit] Storage cleanup failed (edit still succeeded):",
|
||||
cleanupErr
|
||||
);
|
||||
}
|
||||
|
||||
await this.callbacks.loadVideos();
|
||||
|
||||
const videosMap = this.state.getVideosMap();
|
||||
|
||||
Reference in new issue
Block a user