public async Task Create(UserRegisterRequestDTO userDto) { // Generate verification code string code = Guid.NewGuid().ToString("n").Substring(0, 8); while (_context.UnverifiedUser.Any(x => x.VerificationCode == code)) { code = Guid.NewGuid().ToString("n").Substring(0, 8); } User user = new User { UserName = userDto.Username, Email = userDto.Email, FirstName = userDto.FirstName, LastName = userDto.LastName, PhoneNumber = userDto.PhoneNumber, NumberOfBooks = 0, Points = 0, EmailConfirmed = false, Role = "Member" }; var resultCreate = await _userManager.CreateAsync(user, userDto.Password); var resultRole = await _userManager.AddToRoleAsync(user, user.Role); // Unverified user if (resultCreate.Succeeded && resultRole.Succeeded) { UnverifiedUser unverifiedUser = new UnverifiedUser { UserId = user.Id, VerificationCode = code }; await _context.UnverifiedUser.AddAsync(unverifiedUser); await _context.SaveChangesAsync(); _logger.LogInformation("User created a new account with password."); await _signInManager.SignInAsync(user, isPersistent : false); // Send email SendVerificationEmail(user, code); } else { throw new EntityInvalidationException(string.Join(", ", resultCreate.Errors.Select(x => "Code " + x.Code + " Description" + x.Description))); } }
public async Task VerifyAccount(string verificationCode) { UnverifiedUser unverifiedUser = await _context.UnverifiedUser.SingleOrDefaultAsync(u => u.VerificationCode == verificationCode); if (unverifiedUser == null) { throw new EntityInvalidationException("The code entered is not correct"); } User user = await _context.User.SingleOrDefaultAsync(u => u.Id == unverifiedUser.UserId); user.EmailConfirmed = true; // Remove unverified user _context.UnverifiedUser.Remove(unverifiedUser); await _context.SaveChangesAsync(); }