mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-15 14:17:40 +08:00
Filter soft-deleted and missing refs from visibility queries
list_references_by_asset_id and list_tags_with_usage were not filtering out deleted_at/is_missing refs, allowing /view?filename=blake3:... to serve files through hidden references and inflating tag usage counts. Add list_all_file_paths_by_asset_id for orphan cleanup which intentionally needs unfiltered access. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
0c4f1e349b
commit
a8b7a714d4
@ -31,6 +31,7 @@ from app.assets.database.queries.asset_reference import (
|
|||||||
get_unenriched_references,
|
get_unenriched_references,
|
||||||
get_unreferenced_unhashed_asset_ids,
|
get_unreferenced_unhashed_asset_ids,
|
||||||
insert_reference,
|
insert_reference,
|
||||||
|
list_all_file_paths_by_asset_id,
|
||||||
list_references_by_asset_id,
|
list_references_by_asset_id,
|
||||||
list_references_page,
|
list_references_page,
|
||||||
mark_references_missing_outside_prefixes,
|
mark_references_missing_outside_prefixes,
|
||||||
@ -99,6 +100,7 @@ __all__ = [
|
|||||||
"get_unenriched_references",
|
"get_unenriched_references",
|
||||||
"get_unreferenced_unhashed_asset_ids",
|
"get_unreferenced_unhashed_asset_ids",
|
||||||
"insert_reference",
|
"insert_reference",
|
||||||
|
"list_all_file_paths_by_asset_id",
|
||||||
"list_references_by_asset_id",
|
"list_references_by_asset_id",
|
||||||
"list_references_page",
|
"list_references_page",
|
||||||
"list_tag_counts_for_filtered_assets",
|
"list_tag_counts_for_filtered_assets",
|
||||||
|
|||||||
@ -549,6 +549,8 @@ def list_references_by_asset_id(
|
|||||||
session.execute(
|
session.execute(
|
||||||
select(AssetReference)
|
select(AssetReference)
|
||||||
.where(AssetReference.asset_id == asset_id)
|
.where(AssetReference.asset_id == asset_id)
|
||||||
|
.where(AssetReference.is_missing == False) # noqa: E712
|
||||||
|
.where(AssetReference.deleted_at.is_(None))
|
||||||
.order_by(AssetReference.id.asc())
|
.order_by(AssetReference.id.asc())
|
||||||
)
|
)
|
||||||
.scalars()
|
.scalars()
|
||||||
@ -556,6 +558,25 @@ def list_references_by_asset_id(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def list_all_file_paths_by_asset_id(
|
||||||
|
session: Session,
|
||||||
|
asset_id: str,
|
||||||
|
) -> list[str]:
|
||||||
|
"""Return every file_path for an asset, including soft-deleted/missing refs.
|
||||||
|
|
||||||
|
Used for orphan cleanup where all on-disk files must be removed.
|
||||||
|
"""
|
||||||
|
return list(
|
||||||
|
session.execute(
|
||||||
|
select(AssetReference.file_path)
|
||||||
|
.where(AssetReference.asset_id == asset_id)
|
||||||
|
.where(AssetReference.file_path.isnot(None))
|
||||||
|
)
|
||||||
|
.scalars()
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def upsert_reference(
|
def upsert_reference(
|
||||||
session: Session,
|
session: Session,
|
||||||
asset_id: str,
|
asset_id: str,
|
||||||
|
|||||||
@ -275,6 +275,7 @@ def list_tags_with_usage(
|
|||||||
.select_from(AssetReferenceTag)
|
.select_from(AssetReferenceTag)
|
||||||
.join(AssetReference, AssetReference.id == AssetReferenceTag.asset_reference_id)
|
.join(AssetReference, AssetReference.id == AssetReferenceTag.asset_reference_id)
|
||||||
.where(build_visible_owner_clause(owner_id))
|
.where(build_visible_owner_clause(owner_id))
|
||||||
|
.where(AssetReference.is_missing == False) # noqa: E712
|
||||||
.where(AssetReference.deleted_at.is_(None))
|
.where(AssetReference.deleted_at.is_(None))
|
||||||
.group_by(AssetReferenceTag.tag_name)
|
.group_by(AssetReferenceTag.tag_name)
|
||||||
.subquery()
|
.subquery()
|
||||||
@ -311,6 +312,7 @@ def list_tags_with_usage(
|
|||||||
select(AssetReferenceTag.tag_name)
|
select(AssetReferenceTag.tag_name)
|
||||||
.join(AssetReference, AssetReference.id == AssetReferenceTag.asset_reference_id)
|
.join(AssetReference, AssetReference.id == AssetReferenceTag.asset_reference_id)
|
||||||
.where(build_visible_owner_clause(owner_id))
|
.where(build_visible_owner_clause(owner_id))
|
||||||
|
.where(AssetReference.is_missing == False) # noqa: E712
|
||||||
.where(AssetReference.deleted_at.is_(None))
|
.where(AssetReference.deleted_at.is_(None))
|
||||||
.group_by(AssetReferenceTag.tag_name)
|
.group_by(AssetReferenceTag.tag_name)
|
||||||
)
|
)
|
||||||
|
|||||||
@ -16,6 +16,7 @@ from app.assets.database.queries import (
|
|||||||
get_reference_by_id,
|
get_reference_by_id,
|
||||||
get_reference_with_owner_check,
|
get_reference_with_owner_check,
|
||||||
list_references_page,
|
list_references_page,
|
||||||
|
list_all_file_paths_by_asset_id,
|
||||||
list_references_by_asset_id,
|
list_references_by_asset_id,
|
||||||
set_reference_metadata,
|
set_reference_metadata,
|
||||||
set_reference_preview,
|
set_reference_preview,
|
||||||
@ -176,11 +177,9 @@ def delete_asset_reference(
|
|||||||
session.commit()
|
session.commit()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# Orphaned asset - delete it and its files
|
# Orphaned asset - gather ALL file paths (including
|
||||||
refs = list_references_by_asset_id(session, asset_id=asset_id)
|
# soft-deleted / missing refs) so their on-disk files get cleaned up.
|
||||||
file_paths = [
|
file_paths = list_all_file_paths_by_asset_id(session, asset_id=asset_id)
|
||||||
r.file_path for r in (refs or []) if getattr(r, "file_path", None)
|
|
||||||
]
|
|
||||||
# Also include the just-deleted file path
|
# Also include the just-deleted file path
|
||||||
if file_path:
|
if file_path:
|
||||||
file_paths.append(file_path)
|
file_paths.append(file_path)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user