Exemplo n.º 1
0
        public async Task ExecuteAsync(
            UserId userId,
            Username username,
            Email email,
            string exampleWork,
            Password password,
            DateTime timeStamp)
        {
            userId.AssertNotNull("userId");
            username.AssertNotNull("username");
            email.AssertNotNull("email");
            password.AssertNotNull("password");

            var passwordHash = this.userManager.PasswordHasher.HashPassword(password.Value);

            var user = new FifthweekUser
            {
                Id                  = userId.Value,
                UserName            = username.Value,
                Email               = email.Value,
                ExampleWork         = exampleWork,
                RegistrationDate    = timeStamp,
                LastSignInDate      = SqlDateTime.MinValue.Value,
                LastAccessTokenDate = SqlDateTime.MinValue.Value,
                SecurityStamp       = Guid.NewGuid().ToString(),
                PasswordHash        = passwordHash,
            };

            var parameters = new SqlGenerationParameters <FifthweekUser, FifthweekUser.Fields>(user)
            {
                Conditions = new[]
                {
                    WhereUsernameNotTaken,
                    WhereEmailNotTaken
                }
            };

            using (var transaction = TransactionScopeBuilder.CreateAsync())
            {
                using (var connection = this.connectionFactory.CreateConnection())
                {
                    var result = await connection.InsertAsync(parameters);

                    switch (result)
                    {
                    case 0: throw new RecoverableException("The username '" + username.Value + "' is already taken.");

                    case 1: throw new RecoverableException("The email address '" + email.Value + "' is already taken.");
                    }
                }

                await this.requestSnapshot.ExecuteAsync(userId, SnapshotType.Subscriber);

                transaction.Complete();
            }
        }
        public async Task <UserIdAndRoles> ExecuteAsync(Username username, Password password)
        {
            username.AssertNotNull("username");
            password.AssertNotNull("password");

            using (var connection = this.connectionFactory.CreateConnection())
            {
                var result = (await connection.QueryAsync <DapperResult>(
                                  Query,
                                  new { UserName = username.Value })).ToList();

                if (result.Count > 0)
                {
                    if (result.Select(v => v.Id).Distinct().Count() != 1)
                    {
                        throw new InvalidOperationException("Multiple user IDs returned.");
                    }

                    if (result.Select(v => v.PasswordHash).Distinct().Count() != 1)
                    {
                        throw new InvalidOperationException("Multiple hashed passwords returned.");
                    }

                    if (this.userManager.PasswordHasher.VerifyHashedPassword(result[0].PasswordHash, password.Value)
                        != PasswordVerificationResult.Failed)
                    {
                        var userId = result[0].Id;
                        var roles  = result.Select(v => v.Name).Where(v => v != null).ToList();

                        return(new UserIdAndRoles(userId, roles));
                    }
                }

                return(null);
            }
        }