From ddfe4946c7e18338b80586bfa6c3123670d8700e Mon Sep 17 00:00:00 2001 From: Luke Mino-Altherr Date: Tue, 10 Mar 2026 17:59:23 -0700 Subject: [PATCH] Add preview_url to /assets API response using /api/view endpoint For input and output assets, generate a preview_url pointing to the existing /api/view endpoint using the asset's filename and tag-derived type (input/output). Handles subdirectories via subfolder param and URL-encodes filenames with spaces, unicode, and special characters. This aligns the OSS backend response with the frontend AssetCard expectation for thumbnail rendering. Amp-Thread-ID: https://ampcode.com/threads/T-019cda3f-5c2c-751a-a906-ac6c9153ac5c Co-authored-by: Amp --- app/assets/api/routes.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/app/assets/api/routes.py b/app/assets/api/routes.py index c848e4c89..d9a8babd3 100644 --- a/app/assets/api/routes.py +++ b/app/assets/api/routes.py @@ -124,11 +124,35 @@ def _validate_sort_field(requested: str | None) -> str: return "created_at" +def _build_preview_url_from_view(tags: list[str], user_metadata: dict[str, Any] | None) -> str | None: + """Build a /api/view preview URL from asset tags and user_metadata filename.""" + if not user_metadata: + return None + filename = user_metadata.get("filename") + if not filename: + return None + + if "input" in tags: + view_type = "input" + elif "output" in tags: + view_type = "output" + else: + return None + + subfolder = "" + if "/" in filename: + subfolder, filename = filename.rsplit("/", 1) + + encoded_filename = urllib.parse.quote(filename, safe="") + url = f"/api/view?type={view_type}&filename={encoded_filename}" + if subfolder: + url += f"&subfolder={urllib.parse.quote(subfolder, safe='')}" + return url + + def _build_asset_response(result: schemas.AssetDetailResult | schemas.UploadResult) -> schemas_out.Asset: """Build an Asset response from a service result.""" - preview_url = None - if result.ref.preview_id: - preview_url = f"/api/assets/{result.ref.preview_id}/content?disposition=inline" + preview_url = _build_preview_url_from_view(result.tags, result.ref.user_metadata) return schemas_out.Asset( id=result.ref.id, name=result.ref.name,