Coverage for src/lexigram/web/admin/pages/overview.py: 0%
27 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 04:37 +0800
1from __future__ import annotations
3from typing import Any
5from lexigram.contracts.admin import PageContent
6from lexigram.contracts.admin.widget_content import Stat, StatContent
7from lexigram.logging import get_logger
8from lexigram.web.routing.controller_registry import ControllerRegistry
9from lexigram.web.routing.registry import RouteRegistry
11logger = get_logger(__name__)
14class WebOverviewPage:
15 """Dashboard overview for /admin/web."""
17 def __init__(
18 self,
19 route_registry: RouteRegistry | None = None,
20 controller_registry: ControllerRegistry | None = None,
21 ) -> None:
22 self._route_registry = route_registry
23 self._controller_registry = controller_registry
25 async def handle(self, request: Any) -> PageContent:
26 total_routes = 0
27 total_controllers = 0
29 try:
30 if self._route_registry is not None:
31 routes = self._route_registry.get_all_routes()
32 total_routes = sum(len(methods) for methods in routes.values())
33 except Exception as exc:
34 logger.warning("web_overview.routes_unavailable", error=str(exc))
36 try:
37 if self._controller_registry is not None:
38 total_controllers = len(self._controller_registry.get_all_controllers())
39 except Exception as exc:
40 logger.warning("web_overview.controllers_unavailable", error=str(exc))
42 return PageContent(
43 title="Web",
44 body=StatContent(
45 stats=(
46 Stat(
47 label="Total Routes",
48 value=str(total_routes),
49 icon="map",
50 ),
51 Stat(
52 label="Total Controllers",
53 value=str(total_controllers),
54 icon="layers",
55 ),
56 )
57 ),
58 )