Coverage for src/lexigram/web/admin/pages/middleware.py: 0%
26 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 (
7 EmptyContent,
8 TableCell,
9 TableContent,
10)
11from lexigram.logging import get_logger
12from lexigram.web.middleware.base import MiddlewareRegistry
13from lexigram.web.middleware.registry import MiddlewareAdapterRegistry
15logger = get_logger(__name__)
18class WebMiddlewarePage:
19 """Middleware overview page for /admin/web/middleware."""
21 def __init__(
22 self,
23 middleware_registry: MiddlewareRegistry | None = None,
24 adapter_registry: MiddlewareAdapterRegistry | None = None,
25 ) -> None:
26 self._middleware_registry = middleware_registry
27 self._adapter_registry = adapter_registry
29 async def handle(self, request: Any) -> PageContent:
30 if self._middleware_registry is None:
31 return PageContent(
32 title="Middleware",
33 body=EmptyContent(
34 title="Middleware Registry Unavailable",
35 message="The middleware registry could not be resolved.",
36 icon="layers",
37 ),
38 )
40 try:
41 names = self._middleware_registry.get_middleware_order()
42 stack = getattr(self._middleware_registry, "_middleware_stack", [])
43 except Exception as exc:
44 logger.warning("web_middleware.list_failed", error=str(exc))
45 names = []
46 stack = []
48 if not names:
49 return PageContent(
50 title="Middleware",
51 body=EmptyContent(
52 title="No Middleware Registered",
53 message="No middleware has been registered yet.",
54 icon="layers",
55 ),
56 )
58 rows = tuple(
59 (TableCell(name), TableCell(cls.__name__), TableCell(cls.__module__))
60 for (_, cls, _), name in zip(stack, names, strict=True)
61 )
63 return PageContent(
64 title="Middleware",
65 body=TableContent(
66 columns=("Name", "Class", "Module"),
67 rows=rows,
68 ),
69 )