import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js"; import type { MediaStorage } from "../../domain/port/MediaStorage.js"; /** * `DeleteMediaAssetUseCase` — remove a committed asset (#434). * Orchestrates the two-sided deletion the ports describe: delete every * variant's R2 object via `MediaStorage.deleteObject`, then delete the * `media_assets` row. Ordering matters — drop the objects first so a * crash or partial object failure retains the asset identity and keys * for an idempotent retry. During recovery the row may reference * already deleted objects; no cross-store atomicity is promised. * * # Reference safety (v1 decision) * * Entries reference assets by id (`x-mantle-ref: media_assets`) with no * reverse index. A full back-scan across every collection's JSON blobs * to block/anonymise a referenced asset is O(all-content) per delete — * too heavy for the admin path at this stage. v1 deletes cleanly and * unconditionally; a stale reference resolves to null at render time * (renderers already tolerate a missing asset). A cheap warn-on- * reference (or a maintained reverse index) is a follow-up, not a * blocker for shipping delete. */ export declare class DeleteMediaAssetUseCase { private readonly storage; private readonly assets; constructor(storage: MediaStorage, assets: MediaAssetRepository); execute(id: string): Promise<{ deleted: true; variantsRemoved: number; }>; } //# sourceMappingURL=DeleteMediaAssetUseCase.d.ts.map