39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
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
|