예제 #1
0
        public async Task <DriverAccount> CreateNewUserAsync(SignUpDriverViewModel model)
        {
            var user = Mapper.Map <AppUser>(model);

            user.EmailConfirmed = true;
            // Need to wrap this in transaction since UserManager is not working properly
            // when AutoSaveChanges=false and called two times (AppUser and Role)
            // => results in foreign key constraint error for Account
            using (var transaction = UnitOfWork.DbContext.Database.BeginTransaction())
            {
                // TODO create random password
                var result = await UserManager.CreateAsync(user, "RANDOMINITIALPASSWORD");

                await UnitOfWork.CompleteAsync();

                if (result.Succeeded)
                {
                    var driverAccount = await UnitOfWork.Repository <DriverAccount>().AddAsync(new DriverAccount {
                        AppUserId = user.Id
                    });

                    result = await UserManager.AddToRoleAsync(user, AccessRoles.DriverUser);

                    await UnitOfWork.CompleteAsync();

                    if (result.Succeeded)
                    {
                        try
                        {
                            // TODO Send email with token to driver
                            await AccountEmailService.SendDriverSignUpMailAsync(driverAccount);

                            await UnitOfWork.CompleteAsync();

                            await transaction.CommitAsync();

                            return(driverAccount);
                        }
                        catch
                        {
                            throw new CreateNewUserException();
                        }
                    }
                }
                if (result.Errors.FirstOrDefault(err => err.Code == IdentityErrorCodes.DuplicateUserName || err.Code == IdentityErrorCodes.DuplicateEmail) != null)
                {
                    throw new UserNameAlreadyTakenException();
                }
                else
                {
                    throw new CreateNewUserException(result.Errors.FirstOrDefault()?.Description);
                }
            }
        }
예제 #2
0
        public virtual async Task <IActionResult> NewUser([FromBody] SignUpDriverViewModel model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var account = await DriverAccountService.CreateNewUserAsync(model);

                    return(Ok());
                }
                catch (HttpStatusCodeException)
                {
                    throw;
                }
                catch (Exception e)
                {
                    throw new InternalServerErrorHttpException(e);
                }
            }
            return(BadRequest(ModelState));
        }