public async Task <User> Handle(VerifyCodeCommand request, CancellationToken cancellationToken = default) { User result = null; var identity = await _identityDbContext.Identities.FirstOrDefaultAsync(x => x.Code.Equals(request.Code) && x.Phone.Equals(request.Phone), cancellationToken); if (identity == null) { throw new ConstraintException(); } var user = await _identityDbContext.Users.FirstOrDefaultAsync(x => x.CommunicationChannelsData.PhoneNumber.Equals(identity.Phone), cancellationToken); var salt = _utils.GenerateSalt(identity.Phone.Length); if (isLoginAttempt(user)) { _identityDbContext.Identities.Remove(identity); user.Password = _utils.HashedPassword(user.CommunicationChannelsData.PhoneNumber, salt, _options.Pepper); user.Salt = salt; await _identityDbContext.SaveChangesAsync(cancellationToken); result = user; } else { var newUser = new User { Id = identity.Id, Password = _utils.HashedPassword(identity.Phone, salt, _options.Pepper), PreferredCommunicationChannel = CommunicationChannelId.Phone, CommunicationChannelsData = new CommunicationChannelsData { PhoneNumber = identity.Phone }, Salt = salt }; await _identityDbContext.Users.AddAsync(newUser, cancellationToken); _identityDbContext.Identities.Remove(identity); await _identityDbContext.SaveChangesAsync(cancellationToken); _messageProducer.Enqueue( new UserRegistratedEvent { UserId = newUser.Id }, new Dictionary <string, string>() ); result = newUser; } return(result); }