From 568e528cdd4884c9cfebe12f288e0ccfc5259d3c Mon Sep 17 00:00:00 2001 From: Mia Winter Date: Thu, 22 Feb 2024 14:47:23 +0100 Subject: [PATCH] Implemented Email notifications for reviewers and authors about article state updates --- Wave/Components/Pages/ArticleView.razor | 58 ++++++++++++++++++++++++- Wave/Program.cs | 1 + 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Wave/Components/Pages/ArticleView.razor b/Wave/Components/Pages/ArticleView.razor index e4b979d..e882a54 100644 --- a/Wave/Components/Pages/ArticleView.razor +++ b/Wave/Components/Pages/ArticleView.razor @@ -4,7 +4,11 @@ @using Wave.Data @using System.Security.Claims @using System.Diagnostics.CodeAnalysis +@using System.Globalization +@using Microsoft.AspNetCore.Identity @using Microsoft.Extensions.Options +@using Wave.Services +@using Wave.Utilities @inject ILogger Logger @inject IDbContextFactory ContextFactory @@ -12,6 +16,10 @@ @inject IOptions Customizations @inject IOptions Features @inject IStringLocalizer Localizer +@inject IMessageDisplay Message +@inject UserManager UserManager +@inject EmailFactory Email +@inject IEmailService EmailService @(TitlePrefix + (Article?.Title ?? Localizer["NotFound_Title"])) @@ -166,10 +174,39 @@ } private async Task SubmitForReview() { + if (Article is null) return; + await using var context = await ContextFactory.CreateDbContextAsync(); - Article!.Status = ArticleStatus.InReview; + Article.Status = ArticleStatus.InReview; context.Update(Article); await context.SaveChangesAsync(); + Message.ShowSuccess(Localizer["Submit_Review_Success"]); + + try { + List reviewers = [ + .. await UserManager.GetUsersInRoleAsync("Reviewer"), + .. await UserManager.GetUsersInRoleAsync("Admin") + ]; + if (reviewers.Count > 0) { + await EmailService.ConnectAsync(CancellationToken.None); + + foreach (var reviewer in reviewers) { + var email = await Email.CreateDefaultEmail( + reviewer.Email!, + reviewer.Name, + "Article submitted for Review", + "Article submitted for Review", + $"

The Article '{Article.Title}' by {Article.Author.Name} has been submitted for review.

"); + // TODO check if they enabled email notifications (property currently not implemented) + await EmailService.SendEmailAsync(email); + } + + await EmailService.DisconnectAsync(CancellationToken.None); + } + } catch (Exception ex) { + Logger.LogError(ex, "Failed to send mail to reviewers about article '{title}'.", Article.Title); + } + Navigation.NavigateTo("/"); } @@ -196,6 +233,25 @@ } } + try { + await EmailService.ConnectAsync(CancellationToken.None); + var author = Article.Author; + + var email = await Email.CreateDefaultEmail( + author.Email!, + author.Name, + "Article has been approved", + "Your Article is going to be published", + $"

The Article '{Article.Title}' has been checked and approved by a reviewer.

" + + $"

It is currently scheduled for {Article.PublishDate.ToString("f", CultureInfo.GetCultureInfo("en-US"))}.

"); + // TODO check if they enabled email notifications (property currently not implemented) + await EmailService.SendEmailAsync(email); + + await EmailService.DisconnectAsync(CancellationToken.None); + } catch (Exception ex) { + Logger.LogError(ex, "Failed to send mail to author about article '{title}' being published.", Article.Title); + } + Navigation.NavigateTo("/"); } diff --git a/Wave/Program.cs b/Wave/Program.cs index 133266c..36c56f5 100644 --- a/Wave/Program.cs +++ b/Wave/Program.cs @@ -147,6 +147,7 @@ } if (emailConfig.Smtp.Keys.Any(k => k.Equals("live", StringComparison.CurrentCultureIgnoreCase))) { + builder.Services.AddScoped(sp => sp.GetKeyedService("live")!); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped, SmtpEmailSender>();