Skip to content

Commit

Permalink
Baditsa/improve email templates (#788)
Browse files Browse the repository at this point in the history
* Plain text was added

* Fix styles

* Fix links to external sites
  • Loading branch information
valerabad authored Aug 3, 2022
1 parent f75eee2 commit b28d835
Show file tree
Hide file tree
Showing 11 changed files with 39 additions and 54 deletions.
4 changes: 2 additions & 2 deletions OutOfSchool/OutOfSchool.EmailSender/DevEmailSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ public DevEmailSender(ILogger<DevEmailSender> logger)
this.logger = logger;
}

public Task SendAsync(string email, string subject, string htmlMessage)
public Task SendAsync(string email, string subject, (string html, string plain) content)
{
logger.LogDebug($"Sending mail to {email} with subject \"{subject}\" and content: {htmlMessage}");
logger.LogDebug($"Sending mail to {email} with subject \"{subject}\" and content: {content.html}");
return Task.CompletedTask;
}
}
6 changes: 3 additions & 3 deletions OutOfSchool/OutOfSchool.EmailSender/EmailSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public EmailSender(
this.logger = logger;
}

public Task SendAsync(string email, string subject, string htmlMessage)
public Task SendAsync(string email, string subject, (string html, string plain) content)
{
var message = new SendGridMessage()
{
Expand All @@ -33,8 +33,8 @@ public Task SendAsync(string email, string subject, string htmlMessage)
Name = emailOptions.Value.NameFrom,
},
Subject = subject,
//TODO: Add plaintext message fallback
HtmlContent = htmlMessage
HtmlContent = content.html,
PlainTextContent = content.plain,
};
message.AddTo(new EmailAddress(email));

Expand Down
2 changes: 1 addition & 1 deletion OutOfSchool/OutOfSchool.EmailSender/IEmailSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ namespace OutOfSchool.EmailSender;

public interface IEmailSender
{
Task SendAsync(string email, string subject, string htmlMessage);
Task SendAsync(string email, string subject, (string html, string plain) content);
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,8 @@ public async Task<IActionResult> ChangeEmail(ChangeEmailViewModel model)
LastName = user.LastName,
ActionUrl = HtmlEncoder.Default.Encode(callBackUrl),
};
var htmlMessage = await renderer.GetHtmlStringAsync(RazorTemplates.ChangeEmail, userActionViewModel);

await emailSender.SendAsync(email, subject, htmlMessage);
var content = await renderer.GetHtmlPlainStringAsync(RazorTemplates.ResetPassword, userActionViewModel);
await emailSender.SendAsync(email, subject, content);

logger.LogInformation($"{path} Confirmation message was sent for User(id) + {userId}.");

Expand Down Expand Up @@ -195,9 +194,8 @@ public async Task<IActionResult> ConfirmEmail()
LastName = user.LastName,
ActionUrl = HtmlEncoder.Default.Encode(callBackUrl),
};
var htmlMessage = await renderer.GetHtmlStringAsync(RazorTemplates.ConfirmEmail, userActionViewModel);

await emailSender.SendAsync(email, subject, htmlMessage);
var content = await renderer.GetHtmlPlainStringAsync(RazorTemplates.ResetPassword, userActionViewModel);
await emailSender.SendAsync(email, subject, content);

logger.LogInformation($"Confirmation message was sent. User(id): {userId}.");

Expand Down Expand Up @@ -276,9 +274,8 @@ public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
ActionUrl = callBackUrl,
};

var htmlMessage = await renderer.GetHtmlStringAsync(RazorTemplates.ResetPassword, userActionViewModel);

await emailSender.SendAsync(email, subject, htmlMessage);
var content = await renderer.GetHtmlPlainStringAsync(RazorTemplates.ResetPassword, userActionViewModel);
await emailSender.SendAsync(email, subject, content);

logger.LogInformation($"{path} Message to change password was sent. User(id): {user.Id}.");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ await institutionAdminRepository.Create(ministryAdmin)
Email = user.Email,
Password = password,
};
var htmlMessage = await renderer.GetHtmlStringAsync(RazorTemplates.NewAdminInvitation, adminInvitationViewModel);
var content = await renderer.GetHtmlPlainStringAsync(RazorTemplates.NewAdminInvitation, adminInvitationViewModel);

await emailSender.SendAsync(user.Email, subject, htmlMessage);
await emailSender.SendAsync(user.Email, subject, content);

// No sense to commit if the email was not sent, as user will not be able to login
// and needs to be re-created
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,9 @@ url is null
Email = user.Email,
Password = password,
};
var htmlMessage = await renderer.GetHtmlStringAsync(RazorTemplates.NewAdminInvitation, adminInvitationViewModel);
var content = await renderer.GetHtmlPlainStringAsync(RazorTemplates.NewAdminInvitation, adminInvitationViewModel);

await emailSender.SendAsync(user.Email, subject, htmlMessage);
await emailSender.SendAsync(user.Email, subject, content);

// No sense to commit if the email was not sent, as user will not be able to login
// and needs to be re-created
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,12 @@ namespace OutOfSchool.RazorTemplatesData.Services;
/// </summary>
public interface IRazorViewToStringRenderer
{
/// <summary>
/// Get rendered string from an html template.
/// </summary>
/// <param name="emailName">Email template name.</param>
/// <param name="model">Data model.</param>
/// <returns>A <see cref="Task{TResult}"/> Rendered an html string.
Task<string> GetHtmlStringAsync<TModel>(string emailName, TModel model);

/// <summary>
/// Get rendered string from an plain text template.
/// </summary>
/// <param name="emailName">Email template name.</param>
/// <param name="model">Data model.</param>
/// <returns>A <see cref="Task{TResult}"/> Rendered an plain text string.

Task<string> GetPlainTextStringAsync<TModel>(string emailName, TModel model);
/// <summary>
/// Get rendered string from an HTML and plain text template.
/// </summary>
/// <param name="emailName"></param>
/// <param name="model"></param>
/// <typeparam name="TModel"></typeparam>
/// <returns>A <see cref="Task{Tuple}"/> rendered an HTML and plain text tuple strings.</returns>
Task<(string, string)> GetHtmlPlainStringAsync<TModel>(string emailName, TModel model);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,15 @@ public RazorViewToStringRenderer(
}

/// <inheritdoc/>
public async Task<string> GetHtmlStringAsync<TModel>(string emailName, TModel model)
public async Task<(string, string)> GetHtmlPlainStringAsync<TModel>(string emailName, TModel model)
{
var viewName = RazorTemplates.GetViewName(emailName);

return await RenderViewToStringAsync(viewName, model);
}

/// <inheritdoc/>
public async Task<string> GetPlainTextStringAsync<TModel>(string emailName, TModel model)
{
var viewName = RazorTemplates.GetViewName(emailName, false);

return await RenderViewToStringAsync(viewName, model);
var viewNameHtml = RazorTemplates.GetViewName(emailName);
var viewNamePlain = RazorTemplates.GetViewName(emailName, false);
var tuple = (
html: await RenderViewToStringAsync(viewNameHtml, model),
plain: await RenderViewToStringAsync(viewNamePlain, model)
);
return tuple;
}

private async Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
@using OutOfSchool.RazorTemplatesData.Models.Shared
@model EmailButtonViewModel
<a href="@Model.Url" target="_blank"
style="display: inline-block;">
<a href="@Model.Url" target="_blank" rel="noreferrer">
<button class="btn" style="
background: #3849f9;
color: #ffffff;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
padding: 16px 34px;
bottom: 0;
justify-content: space-between;
margin-bottom: -20px;
}
.min-logo {
height: 18px;
Expand All @@ -144,17 +145,17 @@
<footer>
<div class="footer">
<div>
<a target="_blank" rel="noreferrer" href="https://mon.gov.ua/">
<a target="_blank" rel="noopener" href="https://mon.gov.ua/">
<img class="min-logo" src="@pathToImg/images/MES.png" alt="Ministry of Education and Science of Ukraine">
</a>
<a target="_blank" rel="noreferrer" href="https://mkip.gov.ua/">
<a target="_blank" rel="noopener" href="https://mkip.gov.ua/">
<img class="min-logo" src="@pathToImg/images/MinCultInfoPolicy.png" alt="Ministry of Culture and Information Policy of Ukraine">
</a>
<a target="_blank" rel="noreferrer" href="https://sport.gov.ua/">
<a target="_blank" rel="noopener" href="https://mms.gov.ua/">
<img class="min-logo" src="@pathToImg/images/MinMolodSport.png" alt="Ministry of Youth and Sports of Ukraine">
</a>
<a target="_blank" rel="noreferrer" href="https://www.softserveinc.com/uk-ua/">
<img class="company-logo" src="@pathToImg/images/Vector.png" alt="SoftServe">
<a target="_blank" rel="noopener" href="https://www.softserveinc.com/uk-ua/">
<img class="company-logo" src="@pathToImg/images/SoftServeLogo.png" alt="SoftServe">
</a>
</div>
</div>
Expand Down
Binary file not shown.

0 comments on commit b28d835

Please sign in to comment.