from sqlalchemy.exc import IntegrityError from api.application.abstractions import UnitOfWork from api.application.contracts.auth.auth_request import UserCreateRequest from api.application.protocols.password_hasher import PasswordHasher from api.domain.user.error import UserAlreadyExistsError from api.domain.user.model import User from api.domain.user.repository import UserRepository class CreateUser: def __init__( self, uow: UnitOfWork, user_repository: UserRepository, password_hasher: PasswordHasher, ) -> None: self.uow = uow self.user_repository = user_repository self.hasher = password_hasher async def execute(self, request: UserCreateRequest) -> None: user = User.create( name=request.name, last_name=request.last_name, email=request.email, hashed_password=self.hasher.hash_password(request.password), ) try: await self.user_repository.create_user(user=user) await self.uow.commit() except IntegrityError as e: msg = e.args[0].split("\n")[-1] msg = msg.split(":")[1].strip() if "email" in msg: raise UserAlreadyExistsError(message=msg)