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
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-11 02:25 +0800
1"""Database entity for admin users.
3Provides the AdminUserEntity for database-backed user storage.
4"""
6from __future__ import annotations
8from dataclasses import dataclass, field
9from datetime import UTC, datetime
10from typing import Any
11from uuid import uuid4
13from lexigram.admin.auth.user import AdminUserRecord
16def _utc_now() -> datetime:
17 """Return current UTC time."""
18 return datetime.now(UTC)
21@dataclass
22class AdminUserEntity:
23 """Database entity for admin users.
25 Maps to the `admin_users` table.
26 """
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
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 )
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 )