Пример #1
0
        public async Task <CreateUserResponse> CreateAccount(CreateUserRequest request)
        {
            var user = await _applicationUserManager.FindByEmailAsync(request.Username);

            var appId = await _appService.GetApplicationByKey(request.ApplicationKey);

            if (!appId.HasData)
            {
                return(CreateUserResponse.Fail("Trying to create user from unknown source "));
            }
            if (user == null)
            {
                user = new AppUser()
                {
                    Email          = request.Username,
                    UserName       = request.Username,
                    FirstName      = request.FirstName,
                    LastName       = request.LastName,
                    PhoneNumber    = request.PhoneNumber,
                    ApplicationId  = appId.Object.Id,
                    LockoutEnabled = true,
                    EmailConfirmed = true
                };
                var identityResult = await _applicationUserManager.CreateAsync(user, request.Password);

                if (!identityResult.Succeeded)
                {
                    return(CreateUserResponse.Fail(identityResult.Errors.First().Description));
                }
            }
            else
            {
                return(CreateUserResponse.Fail("Email already exist in our system"));
            }

            if (!user.EmailConfirmed)
            {
                return(CreateUserResponse.Fail("Account already exist, email address is not confirmed yet."));
            }

            //TODO Add user to group

            var newlyCreatedUser = await _applicationUserManager.FindByEmailAsync(request.Email);

            var applicationGroups = await _groupService.GetApplicationGroups(appId.Object.Id);

            if (request.Group == null || !request.Group.Any())
            {
                if (applicationGroups != null && applicationGroups.Any())
                {
                    request.Group = new List <string>();
                    var defaultGroup = applicationGroups.First(x => x.Name.Equals(SystemDefaultGroups.DefaultUser.ToString()));
                    if (defaultGroup != null)
                    {
                        await _groupService.AddUserToGroup(newlyCreatedUser, defaultGroup);
                    }
                }
            }
            else if (request.Group != null && request.Group.Any())
            {
                var userGroups = applicationGroups.Where(x => request.Group.Contains(x.Name));
                if (userGroups.Any())
                {
                    foreach (var group in userGroups)
                    {
                        await _groupService.AddUserToGroup(newlyCreatedUser, group);
                    }
                }
            }

            if (user.EmailConfirmed)
            {
                return(CreateUserResponse.Succeed("Account created successfully"));
            }


            var token = await _applicationUserManager.GenerateEmailConfirmationTokenAsync(newlyCreatedUser);

            var url  = $"{request.ConfirmationUrl}?token={EncodeToken(token)}&username={request.Username}";
            var name = newlyCreatedUser.FullName;

            var filePath = _hostingEnvironment.ContentRootPath;

            var emailTemplate = System.IO.Path.Combine(filePath, "Template", "Emails", "CreateAccount.html");
            var emailFile     = await System.IO.File.ReadAllTextAsync(emailTemplate);

            var emailContent = ReplaceEmail(emailFile,
                                            new Dictionary <string, string> {
                ["name"] = name, ["url"] = url
            });

            var wrapperTemplate = System.IO.Path.Combine(filePath, "Template", "Emails", "_Email_Wrapper.html");
            var wrapperFile     = await System.IO.File.ReadAllTextAsync(wrapperTemplate);

            var result = ReplaceEmail(wrapperFile,
                                      new Dictionary <string, string> {
                ["emailContent"] = emailContent
            });


            var emailMessage = new EmailMessage
            {
                To          = request.Username,
                Subject     = "FindYourData.io Account Creation",
                HtmlContent = result
            };
            await _emailService.SendEmailAsync(emailMessage);

            return(CreateUserResponse.Succeed("Account confirmation email sent, please check your email"));
        }