fixed injection watcher

This commit is contained in:
2026-06-11 08:11:51 +03:00
parent 06e09cd728
commit 481b93e84a
5 changed files with 131 additions and 37 deletions
+55 -31
View File
@@ -4,45 +4,69 @@ import httpx
from app.config import get_settings
# wger language ids (https://wger.de/api/v2/language/)
_LANG_RU = 5
_LANG_EN = 2
class WgerClient:
def __init__(self) -> None:
settings = get_settings()
self.base_url = settings.wger_base_url.rstrip("/")
@staticmethod
def _pick_name(item: dict[str, Any]) -> str:
translations = item.get("translations") or []
for lang_id in (_LANG_RU, _LANG_EN):
for tr in translations:
if tr.get("language") == lang_id and tr.get("name"):
return str(tr["name"])
for tr in translations:
if tr.get("name"):
return str(tr["name"])
return f"#{item.get('id')}"
def _fetch_exerciseinfo(
self,
client: httpx.Client,
*,
query: str,
languagecode: str,
limit: int,
) -> list[dict[str, Any]]:
response = client.get(
f"{self.base_url}/exerciseinfo/",
params={
"name__search": query,
"languagecode": languagecode,
"limit": limit,
},
)
response.raise_for_status()
return response.json().get("results") or []
def search_exercises(self, query: str, limit: int = 8) -> list[dict[str, Any]]:
query = query.strip()
if not query:
return []
with httpx.Client(timeout=20.0) as client:
response = client.get(
f"{self.base_url}/exercise/search/",
params={"term": query, "language": "ru"},
results = self._fetch_exerciseinfo(
client, query=query, languagecode="ru", limit=limit
)
response.raise_for_status()
data = response.json()
sug = data.get("suggestions", data) if isinstance(data, dict) else []
if isinstance(sug, dict):
results = sug.get("results", [])
elif isinstance(sug, list):
results = sug
else:
results = []
if not results:
results = self._fetch_exerciseinfo(
client, query=query, languagecode="en", limit=limit
)
out: list[dict[str, Any]] = []
for item in results[:limit]:
if isinstance(item, dict):
name = item.get("value") or item.get("name") or str(item)
out.append({"name": name, "data": item})
elif isinstance(item, str):
out.append({"name": item})
if out:
return out
response2 = client.get(
f"{self.base_url}/exerciseinfo/",
params={"language": 2, "limit": limit},
out: list[dict[str, Any]] = []
for item in results[:limit]:
category = item.get("category") or {}
out.append(
{
"id": item.get("id"),
"name": self._pick_name(item),
"category": category.get("name") if isinstance(category, dict) else category,
}
)
response2.raise_for_status()
for item in (response2.json().get("results") or [])[:limit]:
name = item.get("name") or f"#{item.get('id')}"
if query.lower() in name.lower():
out.append({"id": item.get("id"), "name": name, "category": item.get("category")})
return out[:limit]
return out