public async Task SendConfirmationEmail(SendConfirmationEmailRequestDto sendConfirmationEmailRequest, CancellationToken cancellationToken) { var user = await _userManager.FindByEmailAsync(sendConfirmationEmailRequest.Email); if (user is null) { throw new BadRequestException(nameof(ErrorStrings.UserNameNotFound)); } if (await _userManager.IsEmailConfirmedAsync(user)) { throw new BadRequestException(nameof(ErrorStrings.EmailAlreadyConfirmed)); } await SendConfirmationEmail(sendConfirmationEmailRequest, user, cancellationToken); }
private async Task SendConfirmationEmail(SendConfirmationEmailRequestDto sendConfirmationEmailRequest, User user, CancellationToken cancellationToken) { if ((DateTimeOffset.Now - user.ConfirmationEmailRequestedOn) < _appSettings.Value.IdentitySettings.ConfirmationEmailResendDelay) { throw new TooManyRequestsExceptions(nameof(ErrorStrings.WaitForConfirmationEmailResendDelay)); } var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); var controller = RouteData.Values["controller"] !.ToString(); var confirmationLink = Url.Action(nameof(ConfirmEmail), controller, new { user.Email, token }, HttpContext.Request.Scheme); var assembly = typeof(Program).Assembly; var result = await _fluentEmail .To(user.Email, user.DisplayName) .Subject(EmailStrings.ConfirmationEmailSubject) .UsingTemplateFromEmbedded("TodoTemplate.Api.Resources.EmailConfirmation.cshtml", new EmailConfirmationModel { ConfirmationLink = confirmationLink, HostUri = new Uri($"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}{HttpContext.Request.PathBase}") }, assembly) .SendAsync(cancellationToken); user.ConfirmationEmailRequestedOn = DateTimeOffset.Now; await _userManager.UpdateAsync(user); if (!result.Successful) { throw new ResourceValidationException(result.ErrorMessages.ToArray()); } }