Перейти к содержанию

Доменная модель пользователя

Модуль domain.model содержит ядро бизнес-логики приложения, реализуя паттерн "Богатая модель" (Rich Domain Model). Основной класс User инкапсулирует всю логику работы с пользователями.

Особенности

  • Четкое разделение ответственности
  • Инкапсуляция бизнес-правил
  • Независимость от инфраструктурного кода
  • Поддержка иммутабельности где это необходимо
  • Строгая типизация

Документация API

Класс User

Основная сущность, представляющая пользователя в системе.

Source code in src/domain/model.py
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
class User:
    def __init__(
        self,
        user_id: uuid.UUID | None,
        first_name: str,
        last_name: str,
        email: str,
        username: str,
        hashed_password: str,
        _hasher: IPasswordHasher,
        is_active: bool = True,
        is_verified: bool = False,
        created_at: datetime.datetime | None = None,
        updated_at: datetime.datetime | None = None,
        last_login_at: datetime.datetime | None = None,
    ) -> None:
        self.id = user_id or uuid.uuid4()
        self.first_name = first_name
        self.last_name = last_name
        self.username = username
        self.email = email
        self.hashed_password = hashed_password
        self.is_active = is_active
        self.is_verified = is_verified
        self._hasher = _hasher
        self.created_at = created_at or datetime.datetime.now(datetime.UTC)
        self.updated_at = updated_at or datetime.datetime.now(datetime.UTC)
        self.last_login_at = last_login_at

    def update_login_time(self) -> None:
        """Обновить время последнего входа."""
        self.last_login_at = datetime.datetime.now(datetime.UTC)

    def activate(self) -> None:
        self.is_active = True
        self.updated_at = datetime.datetime.now(datetime.UTC)

    def deactivate(self) -> None:
        self.is_active = False
        self.updated_at = datetime.datetime.now(datetime.UTC)

    def verify_email(self) -> None:
        self.is_verified = True
        self.updated_at = datetime.datetime.now(datetime.UTC)

    def verify_password(self, password: str) -> bool:
        return self._hasher.verify_password(password, self.hashed_password)

    def set_password(self, password: str) -> None:
        self.hashed_password = self._hasher.hash_password(password)

    def __str__(self) -> str:
        return f'User - {self.first_name} {self.last_name} ({self.email})'

    def __repr__(self) -> str:
        return (
            f'{self.__class__.__name__}('
            f'id={self.id!r}, '
            f'first_name={self.first_name!r}, '
            f'last_name={self.last_name!r}, '
            f'email={self.email!r}, '
            f'username={self.username!r}, '
            f'hashed_password={self.hashed_password}, '
            f'_hasher={self._hasher!r}, '
            f'is_active={self.is_active!r}, '
            f'is_verified={self.is_verified!r}, '
            f'created_at={self.created_at!r}, '
            f'updated_at={self.updated_at!r}, '
            f'last_login_at={self.last_login_at!r})'
        )

update_login_time() -> None

Обновить время последнего входа.

Source code in src/domain/model.py
36
37
38
def update_login_time(self) -> None:
    """Обновить время последнего входа."""
    self.last_login_at = datetime.datetime.now(datetime.UTC)

Примеры использования

Создание пользователя

from uuid import uuid4
from datetime import datetime, UTC
from src.adapters.hasher import BcryptPasswordHasher
from src.domain.model import User

# Инициализация зависимостей
hasher = BcryptPasswordHasher()

# Создание нового пользователя
user = User(
    user_id=uuid4(),
    first_name="Иван",
    last_name="Иванов",
    email="ivan@example.com",
    username="ivanov",
    hashed_password=hasher.hash_password("secure_password"),
    _hasher=hasher,
    is_active=True,
    created_at=datetime.now(UTC)
)

Работа с пользователем

# Активация/деактивация
user.activate()
user.deactivate()

# Верификация email
user.verify_email()

# Проверка пароля
if user.verify_password("my_password"):
    print("Пароль верный")

# Обновление пароля
user.set_password("new_secure_password")

# Обновление времени последнего входа
user.update_login_time()

Рекомендации по использованию

  1. Создание пользователей
  2. Всегда используйте фабричные методы или сервисный слой
  3. Убедитесь, что пароль хешируется до сохранения
  4. Генерируйте уникальные ID для пользователей

  5. Безопасность

  6. Никогда не храните пароли в открытом виде
  7. Используйте надежные алгоритмы хеширования
  8. Регулярно обновляйте учетные данные пользователей

  9. Валидация

  10. Проверяйте email на корректность
  11. Валидируйте сложность пароля
  12. Ограничивайте длину строковых полей

  13. Тестирование

  14. Используйте моки для зависимостей
  15. Тестируйте граничные случаи
  16. Проверяйте бизнес-правила

Интеграция

Доменная модель User может быть использована с:

  • Репозиториями для хранения данных
  • Сервисным слоем для бизнес-логики
  • API-контроллерами для обработки запросов
  • Системами аутентификации и авторизации

Ограничения

  • Требует инициализации с валидным хешером паролей
  • Не содержит валидации ввода (должна выполняться на уровне приложения)
  • Не зависит от фреймворков и внешних библиотек, кроме стандартной библиотеки Python