master/usecase/user.py
2026-03-20 12:53:26 +03:00

41 lines
1.2 KiB
Python

from dataclasses import dataclass
from domain.error import UserNotFoundError
from domain.user import User
from usecase.interface import Logger, Tracer, UserRepository
@dataclass(frozen=True, slots=True)
class GetUserQuery:
user_id: str
class GetUser:
def __init__(
self,
repository: UserRepository,
logger: Logger,
tracer: Tracer,
) -> None:
self._repository = repository
self._logger = logger
self._tracer = tracer
def execute(self, query: GetUserQuery) -> User:
with self._tracer.start_span(
'usecase.get_user',
attrs={'user.id': query.user_id},
) as span:
user = self._repository.get(query.user_id)
if user is None:
error = UserNotFoundError(query.user_id)
span.record_error(error)
self._logger.warning(
'user_not_found',
attrs={'user_id': query.user_id},
)
raise error
span.set_attribute('user.email', user.email)
self._logger.info('user_loaded', attrs={'user_id': user.id})
return user