コード例 #1
0
        public async Task <IActionResult> Register(RegisterViewModel model)
        {
            if (_dbContext.Users.Any(x => x.UserName == model.Input.Username))
            {
                ModelState.AddModelError("UsernameExists", "Username already exists.");
            }

            if (_dbContext.Users.Any(x => x.Email == model.Input.Email))
            {
                ModelState.AddModelError("EmailExists", "Email already exists.");
            }

            if (ModelState.IsValid)
            {
                var world = _dbContext.Worlds.Find(model.Input.SelectedWorld);
                var tribe = _dbContext.Tribes.Find(model.Input.SelectedTribe);

                var user = new User {
                    UserName = model.Input.Username, Email = model.Input.Email, Tribe = tribe, World = world
                };
                var result = await _userManager.CreateAsync(user, model.Input.Password);

                if (result.Succeeded)
                {
                    await _userManager.AddToRoleAsync(user, "Player");

                    var tile    = _tileService.DetermineCityStartingTile(world);
                    var village = _villageService.CreateVillageForUser(user, tile);
                    var rfs     = _resourceFieldService.SeedVillageWithBasicResourceFields(village, tile.Type);
                    village.ResourceFields = rfs.ToList();
                    _dbContext.Villages.Update(village);
                    _dbContext.SaveChanges();

                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { userId = user.Id, code = code },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(model.Input.Email, "Confirm your email",
                                                      $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    await _signInManager.SignInAsync(user, isPersistent : false);

                    return(RedirectToAction("Login"));
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            _dbContext.SaveChanges();

            model.Input.AvailableTribes = GenerateTribeSelectList();
            model.Input.AvailableWorlds = GenerateWorldSelectListAsync();

            return(View(model));
        }