"""Base entity for DDD domain layer.""" from abc import ABC, abstractmethod from dataclasses import dataclass, field from datetime import UTC, datetime from typing import Any from uuid import UUID, uuid4 @dataclass(kw_only=True) class BaseEntity(ABC): """Base class for all domain entities.""" id: UUID = field(default_factory=uuid4) created_at: datetime = field(default_factory=lambda: datetime.now(UTC)) updated_at: datetime = field(default_factory=lambda: datetime.now(UTC)) def __eq__(self, other: object) -> bool: if not isinstance(other, BaseEntity): return NotImplemented return self.id == other.id def __hash__(self) -> int: return hash(self.id) def touch(self) -> None: """Update the updated_at timestamp.""" self.updated_at = datetime.now(UTC) @abstractmethod def to_dict(self) -> dict[str, Any]: """Convert entity to dictionary.""" ...