Coverage for src / lexigram / admin / auth / entity.py: 0%

25 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-11 02:25 +0800

1"""Database entity for admin users. 

2 

3Provides the AdminUserEntity for database-backed user storage. 

4""" 

5 

6from __future__ import annotations 

7 

8from dataclasses import dataclass, field 

9from datetime import UTC, datetime 

10from typing import Any 

11from uuid import uuid4 

12 

13from lexigram.admin.auth.user import AdminUserRecord 

14 

15 

16def _utc_now() -> datetime: 

17 """Return current UTC time.""" 

18 return datetime.now(UTC) 

19 

20 

21@dataclass 

22class AdminUserEntity: 

23 """Database entity for admin users. 

24 

25 Maps to the `admin_users` table. 

26 """ 

27 

28 id: str = field(default_factory=lambda: str(uuid4())) 

29 username: str = "" 

30 email: str = "" 

31 hashed_password: str = "" 

32 roles: list[str] = field(default_factory=list) 

33 permissions: list[str] = field(default_factory=list) 

34 is_active: bool = True 

35 is_verified: bool = False 

36 created_at: datetime = field(default_factory=_utc_now) 

37 updated_at: datetime | None = None 

38 

39 def to_user(self) -> AdminUserRecord: 

40 """Convert entity to AdminUserRecord satisfying AuthenticatedUserProtocol protocol.""" 

41 return AdminUserRecord( 

42 user_id=self.id, 

43 name=self.username, 

44 email=self.email, 

45 hashed_password=self.hashed_password, 

46 roles=self.roles, 

47 permissions=self.permissions, 

48 is_active=self.is_active, 

49 is_verified=self.is_verified, 

50 ) 

51 

52 @classmethod 

53 def from_user(cls, user: Any) -> AdminUserEntity: 

54 """Create entity from User dataclass.""" 

55 return cls( 

56 id=user.user_id, 

57 username=user.name, 

58 email=user.email, 

59 hashed_password=user.hashed_password, 

60 roles=list(user.roles) if user.roles else [], 

61 permissions=list(user.permissions) if user.permissions else [], 

62 is_active=user.is_active, 

63 is_verified=user.is_verified, 

64 )