From 5571508e61240f5de05a4f793f35174a89d7a20a Mon Sep 17 00:00:00 2001 From: Luke Mino-Altherr Date: Tue, 3 Feb 2026 18:44:23 -0800 Subject: [PATCH] refactor: use query functions instead of direct ORM modifications in service layer Add update_asset_info_name and update_asset_info_updated_at query functions and update asset_management.py to use them instead of modifying ORM objects directly. This ensures the service layer only uses explicit operations from the queries package. Co-Authored-By: Claude Opus 4.5 --- app/assets/database/queries/__init__.py | 4 ++++ app/assets/database/queries/asset_info.py | 28 +++++++++++++++++++++++ app/assets/services/asset_management.py | 7 +++--- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/app/assets/database/queries/__init__.py b/app/assets/database/queries/__init__.py index 74e644955..628a2ee53 100644 --- a/app/assets/database/queries/__init__.py +++ b/app/assets/database/queries/__init__.py @@ -18,6 +18,8 @@ from app.assets.database.queries.asset_info import ( fetch_asset_info_asset_and_tags, fetch_asset_info_and_asset, update_asset_info_access_time, + update_asset_info_name, + update_asset_info_updated_at, set_asset_info_metadata, delete_asset_info_by_id, set_asset_info_preview, @@ -68,6 +70,8 @@ __all__ = [ "fetch_asset_info_asset_and_tags", "fetch_asset_info_and_asset", "update_asset_info_access_time", + "update_asset_info_name", + "update_asset_info_updated_at", "set_asset_info_metadata", "delete_asset_info_by_id", "set_asset_info_preview", diff --git a/app/assets/database/queries/asset_info.py b/app/assets/database/queries/asset_info.py index 03d6153d1..3769cc185 100644 --- a/app/assets/database/queries/asset_info.py +++ b/app/assets/database/queries/asset_info.py @@ -400,6 +400,34 @@ def update_asset_info_access_time( session.execute(stmt.values(last_access_time=ts)) +def update_asset_info_name( + session: Session, + asset_info_id: str, + name: str, +) -> None: + """Update the name of an AssetInfo.""" + now = get_utc_now() + session.execute( + sa.update(AssetInfo) + .where(AssetInfo.id == asset_info_id) + .values(name=name, updated_at=now) + ) + + +def update_asset_info_updated_at( + session: Session, + asset_info_id: str, + ts: datetime | None = None, +) -> None: + """Update the updated_at timestamp of an AssetInfo.""" + ts = ts or get_utc_now() + session.execute( + sa.update(AssetInfo) + .where(AssetInfo.id == asset_info_id) + .values(updated_at=ts) + ) + + def set_asset_info_metadata( session: Session, asset_info_id: str, diff --git a/app/assets/services/asset_management.py b/app/assets/services/asset_management.py index 041eee25f..9882b0b77 100644 --- a/app/assets/services/asset_management.py +++ b/app/assets/services/asset_management.py @@ -29,6 +29,8 @@ from app.assets.database.queries import ( set_asset_info_metadata, set_asset_info_preview, set_asset_info_tags, + update_asset_info_name, + update_asset_info_updated_at, ) @@ -78,7 +80,7 @@ def update_asset_metadata( touched = False if name is not None and name != info.name: - info.name = name + update_asset_info_name(session, asset_info_id=asset_info_id, name=name) touched = True # Compute filename from best live path @@ -111,8 +113,7 @@ def update_asset_metadata( touched = True if touched and user_metadata is None: - info.updated_at = get_utc_now() - session.flush() + update_asset_info_updated_at(session, asset_info_id=asset_info_id) # Fetch updated info with tags result = fetch_asset_info_asset_and_tags(