Implemented Email notifications for reviewers and authors about article state updates
This commit is contained in:
parent
9603edc633
commit
568e528cdd
|
@ -4,7 +4,11 @@
|
||||||
@using Wave.Data
|
@using Wave.Data
|
||||||
@using System.Security.Claims
|
@using System.Security.Claims
|
||||||
@using System.Diagnostics.CodeAnalysis
|
@using System.Diagnostics.CodeAnalysis
|
||||||
|
@using System.Globalization
|
||||||
|
@using Microsoft.AspNetCore.Identity
|
||||||
@using Microsoft.Extensions.Options
|
@using Microsoft.Extensions.Options
|
||||||
|
@using Wave.Services
|
||||||
|
@using Wave.Utilities
|
||||||
|
|
||||||
@inject ILogger<ArticleView> Logger
|
@inject ILogger<ArticleView> Logger
|
||||||
@inject IDbContextFactory<ApplicationDbContext> ContextFactory
|
@inject IDbContextFactory<ApplicationDbContext> ContextFactory
|
||||||
|
@ -12,6 +16,10 @@
|
||||||
@inject IOptions<Customization> Customizations
|
@inject IOptions<Customization> Customizations
|
||||||
@inject IOptions<Features> Features
|
@inject IOptions<Features> Features
|
||||||
@inject IStringLocalizer<ArticleView> Localizer
|
@inject IStringLocalizer<ArticleView> Localizer
|
||||||
|
@inject IMessageDisplay Message
|
||||||
|
@inject UserManager<ApplicationUser> UserManager
|
||||||
|
@inject EmailFactory Email
|
||||||
|
@inject IEmailService EmailService
|
||||||
|
|
||||||
<PageTitle>@(TitlePrefix + (Article?.Title ?? Localizer["NotFound_Title"]))</PageTitle>
|
<PageTitle>@(TitlePrefix + (Article?.Title ?? Localizer["NotFound_Title"]))</PageTitle>
|
||||||
|
|
||||||
|
@ -166,10 +174,39 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SubmitForReview() {
|
private async Task SubmitForReview() {
|
||||||
|
if (Article is null) return;
|
||||||
|
|
||||||
await using var context = await ContextFactory.CreateDbContextAsync();
|
await using var context = await ContextFactory.CreateDbContextAsync();
|
||||||
Article!.Status = ArticleStatus.InReview;
|
Article.Status = ArticleStatus.InReview;
|
||||||
context.Update(Article);
|
context.Update(Article);
|
||||||
await context.SaveChangesAsync();
|
await context.SaveChangesAsync();
|
||||||
|
Message.ShowSuccess(Localizer["Submit_Review_Success"]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
List<ApplicationUser> 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",
|
||||||
|
$"<p>The Article '{Article.Title}' by {Article.Author.Name} has been submitted for review.</p>");
|
||||||
|
// 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("/");
|
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",
|
||||||
|
$"<p>The Article '{Article.Title}' has been checked and approved by a reviewer.</p>" +
|
||||||
|
$"<p>It is currently scheduled for {Article.PublishDate.ToString("f", CultureInfo.GetCultureInfo("en-US"))}.</p>");
|
||||||
|
// 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("/");
|
Navigation.NavigateTo("/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (emailConfig.Smtp.Keys.Any(k => k.Equals("live", StringComparison.CurrentCultureIgnoreCase))) {
|
if (emailConfig.Smtp.Keys.Any(k => k.Equals("live", StringComparison.CurrentCultureIgnoreCase))) {
|
||||||
|
builder.Services.AddScoped(sp => sp.GetKeyedService<IEmailService>("live")!);
|
||||||
builder.Services.AddScoped<IEmailSender, SmtpEmailSender>();
|
builder.Services.AddScoped<IEmailSender, SmtpEmailSender>();
|
||||||
builder.Services.AddScoped<IAdvancedEmailSender, SmtpEmailSender>();
|
builder.Services.AddScoped<IAdvancedEmailSender, SmtpEmailSender>();
|
||||||
builder.Services.AddScoped<IEmailSender<ApplicationUser>, SmtpEmailSender>();
|
builder.Services.AddScoped<IEmailSender<ApplicationUser>, SmtpEmailSender>();
|
||||||
|
|
Loading…
Reference in a new issue