fix: unify delete logic and fix cascade deletion for flows (#5466)

* Fix incomplete cascade deletion for flows.

* [autofix.ci] apply automated fixes

* Remove modification.

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
dhlidongming 2024-12-29 21:52:53 +08:00 committed by GitHub
commit 9ee63109d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 6 additions and 11 deletions

View file

@ -283,6 +283,11 @@ async def cascade_delete_flow(session: AsyncSession, flow_id: uuid.UUID) -> None
try:
await session.exec(delete(TransactionTable).where(TransactionTable.flow_id == flow_id))
await session.exec(delete(VertexBuildTable).where(VertexBuildTable.flow_id == flow_id))
# TODO: Verify if deleting messages is safe in terms of session id relevance
# If we delete messages directly, rather than setting flow_id to null,
# it might cause unexpected behaviors because the session id could still be
# used elsewhere to search for these messages.
# await session.exec(delete(MessageTable).where(MessageTable.flow_id == flow_id))
await session.exec(delete(Flow).where(Flow.id == flow_id))
except Exception as e:
msg = f"Unable to cascade delete flow: ${flow_id}"

View file

@ -25,8 +25,6 @@ from langflow.services.database.models.flow.model import FlowHeader
from langflow.services.database.models.flow.utils import get_webhook_component_in_flow
from langflow.services.database.models.folder.constants import DEFAULT_FOLDER_NAME
from langflow.services.database.models.folder.model import Folder
from langflow.services.database.models.transactions.crud import get_transactions_by_flow_id
from langflow.services.database.models.vertex_builds.crud import get_vertex_builds_by_flow_id
from langflow.services.deps import get_settings_service
from langflow.services.settings.service import SettingsService
@ -423,15 +421,7 @@ async def delete_multiple_flows(
await db.exec(select(Flow).where(col(Flow.id).in_(flow_ids)).where(Flow.user_id == user.id))
).all()
for flow in flows_to_delete:
transactions_to_delete = await get_transactions_by_flow_id(db, flow.id)
for transaction in transactions_to_delete:
await db.delete(transaction)
builds_to_delete = await get_vertex_builds_by_flow_id(db, flow.id)
for build in builds_to_delete:
await db.delete(build)
await db.delete(flow)
await cascade_delete_flow(db, flow.id)
await db.commit()
return {"deleted": len(flows_to_delete)}