Coverage for src/lexigram/auth/admin/pages/users.py: 0%
22 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 12:26 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 12:26 +0800
1"""Auth users management page — list registered users."""
3from __future__ import annotations
5from typing import Any
7from lexigram.contracts.admin import PageContent
8from lexigram.contracts.admin.widget_content import (
9 EmptyContent,
10 TableCell,
11 TableContent,
12)
13from lexigram.contracts.auth.store import UserStoreProtocol
14from lexigram.logging import get_logger
16logger = get_logger(__name__)
19class AuthUsersPage:
20 """Admin page listing registered auth users."""
22 def __init__(
23 self,
24 user_store: UserStoreProtocol | None = None,
25 ) -> None:
26 self._user_store = user_store
28 async def handle(self, request: Any) -> PageContent:
29 if self._user_store is None:
30 return PageContent(
31 title="Users",
32 body=EmptyContent(
33 title="User Store Unavailable",
34 message="No user store is configured.",
35 icon="users",
36 ),
37 )
39 try:
40 users = await self._user_store.list_users()
41 except Exception:
42 logger.warning("auth_users.list_users_failed")
43 return PageContent(
44 title="Users",
45 body=EmptyContent(
46 title="User Store Error",
47 message="Failed to retrieve users from the store.",
48 icon="alert-triangle",
49 ),
50 )
52 if not users:
53 return PageContent(
54 title="Users",
55 body=EmptyContent(
56 title="No Users Found",
57 message="There are no registered users yet.",
58 icon="users",
59 ),
60 )
62 rows = tuple(
63 (
64 TableCell(str(u.user_id)),
65 TableCell(str(getattr(u, "email", "-"))),
66 TableCell("Active" if getattr(u, "is_active", True) else "Inactive"),
67 )
68 for u in users
69 )
71 return PageContent(
72 title="Users",
73 body=TableContent(columns=("ID", "Email", "Status"), rows=rows),
74 )