from __future__ import annotations import uuid from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Optional def _utcnow() -> datetime: return datetime.now(timezone.utc) def _uuid() -> str: return str(uuid.uuid4()) @dataclass class User: id: str = field(default_factory=_uuid) email: str = "" username: Optional[str] = None full_name: Optional[str] = None password_hash: str = "" is_active: bool = True is_verified: bool = False failed_login_attempts: int = 0 locked_until: Optional[datetime] = None last_login: Optional[datetime] = None password_changed_at: Optional[datetime] = None created_at: datetime = field(default_factory=_utcnow) updated_at: datetime = field(default_factory=_utcnow) deleted_at: Optional[datetime] = None roles: list[str] = field(default_factory=list) @dataclass class RefreshSession: id: str = field(default_factory=_uuid) user_id: str = "" token_key: str = "" token_hash: str = "" device_info: Optional[str] = None ip_address: Optional[str] = None expires_at: Optional[datetime] = None revoked_at: Optional[datetime] = None created_at: datetime = field(default_factory=_utcnow) updated_at: datetime = field(default_factory=_utcnow) @dataclass class Role: id: str = field(default_factory=_uuid) name: str = "" description: Optional[str] = None permissions: list[str] = field(default_factory=list) @dataclass class Permission: id: str = field(default_factory=_uuid) code: str = "" description: Optional[str] = None