Coverage for src/lexigram/auth/di/sub_providers/admin_provider.py: 93%

30 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-26 00:58 +0800

1"""Admin DI provider: registers AuthAdminContributor.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING 

6 

7from lexigram.contracts.core.provider import ProviderPriority 

8from lexigram.di.provider import Provider 

9from lexigram.logging import get_logger 

10 

11if TYPE_CHECKING: 

12 from lexigram.auth.config import AuthConfig 

13 from lexigram.contracts.core.di import ( 

14 ContainerRegistrarProtocol, 

15 ContainerResolverProtocol, 

16 ) 

17 

18__all__ = ["AuthAdminProvider"] 

19 

20logger = get_logger(__name__) 

21 

22 

23class AuthAdminProvider(Provider): 

24 """Registers AuthAdminContributor for admin panel integration. 

25 

26 Args: 

27 config: Auth configuration. 

28 """ 

29 

30 def __init__(self, config: AuthConfig | None = None) -> None: 

31 super().__init__(name="auth_admin", priority=ProviderPriority.LOW) 

32 self._config = config 

33 

34 async def register(self, container: ContainerRegistrarProtocol) -> None: 

35 """Bind admin contributor singleton.""" 

36 from lexigram.auth.admin.contributor import AuthAdminContributor 

37 from lexigram.auth.admin.handlers.active_sessions import ( 

38 ActiveSessionsWidgetHandler, 

39 ) 

40 from lexigram.auth.admin.handlers.failed_logins import ( 

41 FailedLoginsWidgetHandler, 

42 ) 

43 from lexigram.auth.admin.handlers.token_refresh_rate import ( 

44 TokenRefreshRateWidgetHandler, 

45 ) 

46 from lexigram.auth.services.activity_tracker import AuthActivityTracker 

47 

48 container.singleton(AuthActivityTracker, AuthActivityTracker) 

49 container.transient( 

50 ActiveSessionsWidgetHandler, 

51 ActiveSessionsWidgetHandler, 

52 ) 

53 container.transient( 

54 FailedLoginsWidgetHandler, 

55 FailedLoginsWidgetHandler, 

56 ) 

57 container.transient( 

58 TokenRefreshRateWidgetHandler, 

59 TokenRefreshRateWidgetHandler, 

60 ) 

61 container.singleton(AuthAdminContributor, AuthAdminContributor) 

62 

63 async def boot(self, container: ContainerResolverProtocol) -> None: 

64 """Boot the auth admin contributor.""" 

65 from lexigram.auth.admin.contributor import AuthAdminContributor 

66 

67 try: 

68 contributor = await container.resolve(AuthAdminContributor) 

69 await contributor.on_admin_boot(container) 

70 logger.info("auth_admin_contributor.booted") 

71 except Exception as e: # noqa: BLE001 

72 logger.warning( 

73 "auth_admin_contributor.boot_failed", 

74 error=str(e), 

75 )