implemented assets scaner

This commit is contained in:
bigcat88
2025-08-24 18:27:08 +03:00
parent a82577f64a
commit d7464e9e73
5 changed files with 393 additions and 5 deletions

View File

@@ -4,7 +4,7 @@ from typing import Optional
from aiohttp import web
from pydantic import ValidationError
from .. import assets_manager
from .. import assets_manager, assets_scanner
from . import schemas_in
@@ -225,6 +225,31 @@ async def delete_asset_tags(request: web.Request) -> web.Response:
return web.json_response(result.model_dump(mode="json"), status=200)
@ROUTES.post("/api/assets/scan/schedule")
async def schedule_asset_scan(request: web.Request) -> web.Response:
try:
payload = await request.json()
except Exception:
payload = {}
try:
body = schemas_in.ScheduleAssetScanBody.model_validate(payload)
except ValidationError as ve:
return _validation_error_response("INVALID_BODY", ve)
states = await assets_scanner.schedule_scans(body.roots)
return web.json_response(states.model_dump(mode="json"), status=202)
@ROUTES.get("/api/assets/scan")
async def get_asset_scan_status(request: web.Request) -> web.Response:
root = request.query.get("root", "").strip().lower()
states = assets_scanner.current_statuses()
if root in {"models", "input", "output"}:
states = [s for s in states.scans if s.root == root] # type: ignore
return web.json_response(states.model_dump(mode="json"), status=200)
def register_assets_routes(app: web.Application) -> None:
app.add_routes(ROUTES)

View File

@@ -146,3 +146,29 @@ class TagsAdd(BaseModel):
class TagsRemove(TagsAdd):
pass
class ScheduleAssetScanBody(BaseModel):
roots: list[Literal["models","input","output"]] = Field(default_factory=list)
@field_validator("roots", mode="before")
@classmethod
def _normalize_roots(cls, v):
if v is None:
return []
if isinstance(v, str):
items = [x.strip().lower() for x in v.split(",")]
elif isinstance(v, list):
items = []
for x in v:
if isinstance(x, str):
items.extend([p.strip().lower() for p in x.split(",")])
else:
return []
out = []
seen = set()
for r in items:
if r in {"models","input","output"} and r not in seen:
out.append(r)
seen.add(r)
return out

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Any, Optional
from typing import Any, Literal, Optional
from pydantic import BaseModel, ConfigDict, Field, field_serializer
@@ -87,3 +87,20 @@ class TagsRemove(BaseModel):
removed: list[str] = Field(default_factory=list)
not_present: list[str] = Field(default_factory=list)
total_tags: list[str] = Field(default_factory=list)
class AssetScanStatus(BaseModel):
scan_id: str
root: Literal["models","input","output"]
status: Literal["scheduled","running","completed","failed","cancelled"]
scheduled_at: Optional[str] = None
started_at: Optional[str] = None
finished_at: Optional[str] = None
discovered: int = 0
processed: int = 0
errors: int = 0
last_error: Optional[str] = None
class AssetScanStatusResponse(BaseModel):
scans: list[AssetScanStatus] = Field(default_factory=list)