add Get Asset endpoint

This commit is contained in:
bigcat88
2025-08-27 09:58:12 +03:00
parent 6fade5da38
commit 7c1b0be496
4 changed files with 85 additions and 8 deletions

View File

@ -49,7 +49,7 @@ async def list_assets(request: web.Request) -> web.Response:
return web.json_response(payload.model_dump(mode="json"))
@ROUTES.get("/api/assets/{id}/content")
@ROUTES.get("/api/assets/{id:\\d+}/content")
async def download_asset_content(request: web.Request) -> web.Response:
asset_info_id_raw = request.match_info.get("id")
try:
@ -198,7 +198,24 @@ async def upload_asset(request: web.Request) -> web.Response:
return _error_response(500, "INTERNAL", "Unexpected server error.")
@ROUTES.put("/api/assets/{id}")
@ROUTES.get("/api/assets/{id:\\d+}")
async def get_asset(request: web.Request) -> web.Response:
asset_info_id_raw = request.match_info.get("id")
try:
asset_info_id = int(asset_info_id_raw)
except Exception:
return _error_response(400, "INVALID_ID", f"AssetInfo id '{asset_info_id_raw}' is not a valid integer.")
try:
result = await assets_manager.get_asset(asset_info_id=asset_info_id)
except ValueError as ve:
return _error_response(404, "ASSET_NOT_FOUND", str(ve), {"id": asset_info_id})
except Exception:
return _error_response(500, "INTERNAL", "Unexpected server error.")
return web.json_response(result.model_dump(mode="json"), status=200)
@ROUTES.put("/api/assets/{id:\\d+}")
async def update_asset(request: web.Request) -> web.Response:
asset_info_id_raw = request.match_info.get("id")
try:
@ -227,7 +244,7 @@ async def update_asset(request: web.Request) -> web.Response:
return web.json_response(result.model_dump(mode="json"), status=200)
@ROUTES.delete("/api/assets/{id}")
@ROUTES.delete("/api/assets/{id:\\d+}")
async def delete_asset(request: web.Request) -> web.Response:
asset_info_id_raw = request.match_info.get("id")
try:
@ -267,7 +284,7 @@ async def get_tags(request: web.Request) -> web.Response:
return web.json_response(result.model_dump(mode="json"))
@ROUTES.post("/api/assets/{id}/tags")
@ROUTES.post("/api/assets/{id:\\d+}/tags")
async def add_asset_tags(request: web.Request) -> web.Response:
asset_info_id_raw = request.match_info.get("id")
try:
@ -298,7 +315,7 @@ async def add_asset_tags(request: web.Request) -> web.Response:
return web.json_response(result.model_dump(mode="json"), status=200)
@ROUTES.delete("/api/assets/{id}/tags")
@ROUTES.delete("/api/assets/{id:\\d+}/tags")
async def delete_asset_tags(request: web.Request) -> web.Response:
asset_info_id_raw = request.match_info.get("id")
try:

View File

@ -43,7 +43,7 @@ class AssetUpdated(BaseModel):
return v.isoformat() if v else None
class AssetCreated(BaseModel):
class AssetDetail(BaseModel):
id: int
name: str
asset_hash: str
@ -54,7 +54,6 @@ class AssetCreated(BaseModel):
preview_hash: Optional[str] = None
created_at: Optional[datetime] = None
last_access_time: Optional[datetime] = None
created_new: bool
model_config = ConfigDict(from_attributes=True)
@ -63,6 +62,10 @@ class AssetCreated(BaseModel):
return v.isoformat() if v else None
class AssetCreated(AssetDetail):
created_new: bool
class TagUsage(BaseModel):
name: str
count: int