public async Task <Optional <UserDTO> > CreateAsync(UserDTO userDTO) { Expression <Func <User, bool> > filter = user => user.Email.ToLower() == userDTO.Email.ToLower(); var userExists = await _userRepository.GetAsync(filter); if (userExists != null) { await _mediator.PublishDomainNotificationAsync(new DomainNotification( ErrorMessages.UserAlreadyExists, DomainNotificationType.UserAlreadyExists)); return(new Optional <UserDTO>()); } var user = _mapper.Map <User>(userDTO); user.Validate(); if (!user.IsValid) { await _mediator.PublishDomainNotificationAsync(new DomainNotification( ErrorMessages.UserInvalid(user.ErrorsToString()), DomainNotificationType.UserInvalid)); return(new Optional <UserDTO>()); } user.SetPassword(_argon2IdHasher.Hash(user.Password)); var userCreated = await _userRepository.CreateAsync(user); return(_mapper.Map <UserDTO>(userCreated)); }