fix(api): guard dataset delete when File2Document row is missing (#15533)

## Summary
Fixes #15532 — `delete_datasets()` crashes with `IndexError` when a
document has no `File2Document` row.
`delete_datasets()` in `dataset_api_service.py` called
`File2DocumentService.get_by_document_id()` and immediately accessed
`f2d[0].file_id` without checking whether the lookup returned any rows.
Documents created via API ingestion or connector sync may exist without
a linked file record, causing dataset deletion to abort with HTTP 500.
This PR mirrors the existing guard already used in `file_service.py` and
`document_api_service.py`.
This commit is contained in:
bohdansolovie
2026-06-11 15:18:08 +08:00
committed by GitHub
parent 9871a7e0b6
commit 47fb462e46
2 changed files with 197 additions and 6 deletions

View File

@@ -143,12 +143,23 @@ async def delete_datasets(tenant_id: str, ids: list = None, delete_all: bool = F
errors.append(f"Remove document '{doc.id}' error for dataset '{kb_id}'")
continue
f2d = File2DocumentService.get_by_document_id(doc.id)
FileService.filter_delete(
[
File.source_type == FileSource.KNOWLEDGEBASE,
File.id == f2d[0].file_id,
]
)
if f2d:
FileService.filter_delete(
[
File.source_type == FileSource.KNOWLEDGEBASE,
File.id == f2d[0].file_id,
]
)
else:
# Normal uploads create a File2Document row via FileService.add_file_from_kb.
# A missing row usually means stale/partial data (e.g. link removed earlier,
# failed post-insert file linkage, or legacy rows). Deletion still proceeds.
logging.warning(
"delete_datasets: document %s in dataset %s has no File2Document row; "
"skipping linked file delete",
doc.id,
kb_id,
)
File2DocumentService.delete_by_document_id(doc.id)
FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.type == "folder", File.name == kb.name])