from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime, timezone from uuid import UUID from app.domain.shared.base_entity import Entity from app.domain.users.events import UserRegistered from app.domain.users.value_objects import Email @dataclass(eq=False) class User(Entity[UUID]): email: Email full_name: str is_active: bool = True created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc)) _events: list[object] = field(default_factory=list, init=False, repr=False) @property def events(self) -> list[object]: return list(self._events) def pull_events(self) -> list[object]: ev, self._events = self._events, [] return ev @classmethod def register(cls, *, user_id: UUID, email: Email, full_name: str) -> "User": user = cls(id=user_id, email=email, full_name=full_name) user._events.append( UserRegistered( user_id=user_id, email=str(email), occurred_at=datetime.now(timezone.utc), ) ) return user