Browse Source

Send email when new event is created

pull/18/head
Berkan 6 years ago
parent
commit
e246247405
  1. 9
      src/EventHub.Application/Emailing/EmailTemplateDefinitionProvider.cs
  2. 2
      src/EventHub.Application/Emailing/EmailTemplates.cs
  3. 157
      src/EventHub.Application/Emailing/Templates/NewEventCreated.tpl
  4. 19
      src/EventHub.Application/Events/EventAppService.cs
  5. 71
      src/EventHub.Application/Events/NewEventNotifier.cs
  6. 2
      src/EventHub.Domain/Events/Event.cs
  7. 2502
      src/EventHub.EntityFrameworkCore.DbMigrations/Migrations/20210203124302_Added_IsEmailSentToMembers_To_Event.Designer.cs
  8. 24
      src/EventHub.EntityFrameworkCore.DbMigrations/Migrations/20210203124302_Added_IsEmailSentToMembers_To_Event.cs
  9. 3
      src/EventHub.EntityFrameworkCore.DbMigrations/Migrations/EventHubMigrationsDbContextModelSnapshot.cs

9
src/EventHub.Application/Emailing/EmailTemplateDefinitionProvider.cs

@ -23,6 +23,15 @@ namespace EventHub.Emailing
isInlineLocalized: true isInlineLocalized: true
) )
); );
context.Add(
new TemplateDefinition(
EmailTemplates.NewEventCreated
).WithVirtualFilePath(
"/Emailing/Templates/NewEventCreated.tpl",
isInlineLocalized: true
)
);
} }
} }
} }

2
src/EventHub.Application/Emailing/EmailTemplates.cs

@ -5,5 +5,7 @@ namespace EventHub.Emailing
public const string EventRegistration = "EventHub.Event.Registration"; public const string EventRegistration = "EventHub.Event.Registration";
public const string EventReminder = "EventHub.Event.Reminder"; public const string EventReminder = "EventHub.Event.Reminder";
public const string NewEventCreated = "EventHub.Event.NewEventCreated";
} }
} }

157
src/EventHub.Application/Emailing/Templates/NewEventCreated.tpl

@ -0,0 +1,157 @@
<html>
<head>
<meta name="viewport" content="width=device-width">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Eventhub</title>
<style>
@media only screen and (max-width: 620px) {
table[class=mail-body] h1{
font-size: 36px !important;
margin-bottom: 10px !important;
}
table[class=mail-body] .content {
padding: 0 !important;
}
table[class=mail-body] .container {
padding: 0 !important;
width: 100% !important;
}
table[class=mail-body] .main {
border-left-width: 0 !important;
border-radius: 0 !important;
border-right-width: 0 !important;
}
table[class=mail-body] td {
width: 100% !important;
float: left!important;
}
table[class=mail-body] td a.btn {
display: block !important;
text-align: center;
}
table[class=mail-body] td h2 {
margin: 10px 0 !important;
}
table[class=mail-body] td .cont {
padding: 30px !important;
}
}
</style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" class="mail-body" style="background-color: #ffffff;width: 100%; font-size: 16px;line-height: 1.4;font-family: Arial, sans-serif;">
<tbody>
<tr>
<td class="container" width="800" style="display: block;margin: 0 auto !important; max-width: 800px;padding: 10px;width: 800px;">
<div class="content" style="box-sizing: border-box;display: block;margin: 0 auto;max-width: 800px;padding: 0px;">
<div style="display: flex; padding-top: 1.5rem">
<h1 style="justify-content: center;margin-left: auto;margin-right: auto;align-content: center;">EventHub</h1>
</div>
<!-- START CENTERED WHITE CONTAINER -->
<div style="display: flex;">
<h1 style="justify-content: center;margin-left: auto;margin-right: auto;align-content: center;">There is a new event that may interest you</h1>
</div>
<table class="main" style="background: #ffffff;border-radius: 3px; width: 100%;">
<!-- START MAIN CONTENT AREA -->
<tbody>
<tr>
<td class="wrapper" width="800">
<table class="main" style="background: #ffffff;border-radius: 3px;width: 100%;">
<tbody>
<tr>
<td class="wrapper" width="800">
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; vertical-align: top;mso-table-lspace: 0pt;mso-table-rspace: 0pt;width: 100%; ">
<tbody>
<tr>
<td style="vertical-align: top;" width="100%">
<div class="cont" style="background: #eeeeee; border-radius: 10px; padding: 40px; margin-top: 20px;">
<table style="border-collapse: separate; vertical-align: top;mso-table-lspace: 0pt;mso-table-rspace: 0pt;width: 100%; ">
<tbody>
<tr>
<td width="100%" style="vertical-align: top; font-size: 16px; font-family: Arial, sans-serif; color: #444; margin-top: 20px; margin-bottom: 20px; line-height: 1.75">
<p>
Hi {{model.user_name}},
</p>
<p>
A new event was created by "{{model.organization_name}}" under the title of "{{model.title}}".
</p>
<div>
<table border="0" cellpadding="0" cellspacing="0" style=" border-collapse: separate; vertical-align: top; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;">
<tbody>
<tr style="text-align: center">
<td style="vertical-align: top;">
<p style="font-size: 13px; font-family: Arial, sans-serif; color: #777777; margin: 0; margin-top: 30px;">Start Time</p>
<p style="font-size: 21px; font-family: Arial, sans-serif; color: #444444; margin-bottom: 30px; margin-top: 6px;">{{model.start_time}}</p>
</td>
<td style="vertical-align: top;">
<p style="font-size: 13px; font-family: Arial, sans-serif; color: #777777; margin: 0; margin-top: 30px;">End Time</p>
<p style="font-size: 21px; font-family: Arial, sans-serif; color: #444444; margin-bottom: 30px; margin-top: 6px;">{{model.end_time}}</p>
</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 20px; margin-top: 20px; text-align: center;">
<a href="/events/{{model.url}}" class="btn" target="_blank" style="padding: 15px; background: #e90052; border-radius: 40px; text-align: center; color: white; font-weight: bold; text-decoration: none; font-size: 18px; padding-left: 45px; padding-right: 45px;">Event Details</a>
</p>
</div>
<p style="font-size: 16px; font-family: Arial, sans-serif; color: #444; margin-top: 20px; margin-bottom: 0px;">
Thank you,<br> EventHub
</p>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<!-- START FOOTER -->
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; vertical-align: top;mso-table-lspace: 0pt;mso-table-rspace: 0pt;width: 100%;">
<tbody>
<tr>
<td class="content-block" style="vertical-align: top;" width="800">
<div class="cont" style="background: #ffffff;border-top: 2px solid #eee; padding: 35px 40px 5px; margin-top: 0px; text-align: center;">
<a href="https://eventhub.abp.io/" style="font-size: 16px; font-family: Arial, sans-serif; color: #777; font-weight: bold; margin-right: 30px; text-decoration: none;">Home</a>
</div>
</td>
</tr>
<tr>
<td class="content-block powered-by" style="vertical-align: top;" width="100%">
<div class="cont" style="background: #ffffff; border-radius: 10px; padding: 5px 40px; margin-top: 10px; margin-bottom: 50px; text-align: center;">
<a href="mailto:info@eventhub.abp.io" style="font-size: 16px; font-family: Arial, sans-serif; color: #777; font-weight: bold; margin-right: 30px; text-decoration: none;"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAARCAYAAADHeGwwAAABMElEQVQ4je3TvyvFYRQG8M+9LEwWiV0xyeAi2ZTUFQuZDAqTxUCJzY9BFotS/gAySAZFEgYlySzFLosfs169w6XL/V6uzbO973vO85z3OeekstlsGRYxrrTYw1g56jGNO6yivAQyS5hFdRpHGMQauvDwC+IXDGAGnTgJApXYxAJO0YLrH5Dfog3bmMAhatI5AUF1B4/oiIFJcYAMbrCRa3X6E0EvzlEbbZtLILCMHlQESzCS+/hZIKARF7Ef8+jDc564VwxhCq24jL/4gHwCAVXYxyR2o7e3Oe/30cbQuzEcB7/zEX03kkF8BU2RJFS3hVS07wnrGP2GI9HMD6MB/eiOd9Wx6vZCyUmXKhM9Hojn8JO6JInFbG2YrLMi4t/xVZNLhn+BgghNvkLzn7Bz9QbIADMmEt9imAAAAABJRU5ErkJggg==" width="16"> info@eventhub.abp.io</a>
<span style="font-size: 16px; font-family: Arial, sans-serif; color: #777; margin-right: 0px; text-decoration: none;"><strong>EventHub</strong> - Powered by Volosoft</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- END FOOTER -->
<!-- END CENTERED WHITE CONTAINER -->
</td>
</tr>
</tbody>
</table>
</body>
</html>

19
src/EventHub.Application/Events/EventAppService.cs

@ -3,6 +3,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using EventHub.Organizations; using EventHub.Organizations;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
@ -15,15 +16,18 @@ namespace EventHub.Events
private readonly EventManager _eventManager; private readonly EventManager _eventManager;
private readonly IRepository<Organization, Guid> _organizationRepository; private readonly IRepository<Organization, Guid> _organizationRepository;
private readonly IRepository<Event, Guid> _eventRepository; private readonly IRepository<Event, Guid> _eventRepository;
private readonly NewEventNotifier _newEventNotifier;
public EventAppService( public EventAppService(
EventManager eventManager, EventManager eventManager,
IRepository<Organization, Guid> organizationRepository, IRepository<Organization, Guid> organizationRepository,
IRepository<Event, Guid> eventRepository) IRepository<Event, Guid> eventRepository,
NewEventNotifier newEventNotifier)
{ {
_eventManager = eventManager; _eventManager = eventManager;
_organizationRepository = organizationRepository; _organizationRepository = organizationRepository;
_eventRepository = eventRepository; _eventRepository = eventRepository;
_newEventNotifier = newEventNotifier;
} }
[Authorize] [Authorize]
@ -47,9 +51,20 @@ namespace EventHub.Events
@event.IsOnline = input.IsOnline; @event.IsOnline = input.IsOnline;
@event.Capacity = input.Capacity; @event.Capacity = input.Capacity;
@event.IsEmailSentToMembers = true;
await _eventRepository.InsertAsync(@event); await _eventRepository.InsertAsync(@event);
try
{
await _newEventNotifier.NotifyAsync(organization, @event);
}
catch (Exception e)
{
@event.IsEmailSentToMembers = false;
Logger.LogError($"An error occurred while sending an email to the members of the {organization.Name} organization after the new event was created. Error message: {e.Message}");
}
return ObjectMapper.Map<Event, EventDto>(@event); return ObjectMapper.Map<Event, EventDto>(@event);
} }

71
src/EventHub.Application/Events/NewEventNotifier.cs

@ -0,0 +1,71 @@
using System;
using System.Threading.Tasks;
using EventHub.Emailing;
using EventHub.Organizations;
using EventHub.Organizations.Memberships;
using EventHub.Users;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Emailing;
using Volo.Abp.TextTemplating;
namespace EventHub.Events
{
public class NewEventNotifier : ITransientDependency
{
private readonly IEmailSender _emailSender;
private readonly ITemplateRenderer _templateRenderer;
private readonly IRepository<OrganizationMembership, Guid> _organizationMembershipsRepository;
private readonly IRepository<AppUser, Guid> _userRepository;
public NewEventNotifier(
IEmailSender emailSender,
ITemplateRenderer templateRenderer,
IRepository<OrganizationMembership, Guid> organizationMembershipsRepository,
IRepository<AppUser, Guid> userRepository)
{
_emailSender = emailSender;
_templateRenderer = templateRenderer;
_organizationMembershipsRepository = organizationMembershipsRepository;
_userRepository = userRepository;
}
public async Task NotifyAsync(
Organization organization,
Event @event)
{
if (organization is null || @event is null)
{
return;
}
var organizationMembers = await _organizationMembershipsRepository.GetListAsync();
foreach (var member in organizationMembers)
{
var user = await _userRepository.FindAsync(member.UserId);
if (user is null)
{
continue;
}
var model = new
{
UserName = user.GetFullNameOrUsername(),
OrganizationName = organization.Name,
Title = @event.Title,
StartTime = @event.StartTime,
EndTime = @event.EndTime,
Url = @event.Url
};
await _emailSender.QueueAsync(
user.Email,
$"Do you attend the {@event.Title} event?",
await _templateRenderer.RenderAsync(EmailTemplates.NewEventCreated, model)
);
}
}
}
}

2
src/EventHub.Domain/Events/Event.cs

@ -26,6 +26,8 @@ namespace EventHub.Events
public bool IsRemindingEmailSent { get; set; } public bool IsRemindingEmailSent { get; set; }
public bool IsEmailSentToMembers { get; set; }
private Event() private Event()
{ {

2502
src/EventHub.EntityFrameworkCore.DbMigrations/Migrations/20210203124302_Added_IsEmailSentToMembers_To_Event.Designer.cs

File diff suppressed because it is too large

24
src/EventHub.EntityFrameworkCore.DbMigrations/Migrations/20210203124302_Added_IsEmailSentToMembers_To_Event.cs

@ -0,0 +1,24 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace EventHub.Migrations
{
public partial class Added_IsEmailSentToMembers_To_Event : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsEmailSentToMembers",
table: "AppEvents",
type: "bit",
nullable: false,
defaultValue: false);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsEmailSentToMembers",
table: "AppEvents");
}
}
}

3
src/EventHub.EntityFrameworkCore.DbMigrations/Migrations/EventHubMigrationsDbContextModelSnapshot.cs

@ -70,6 +70,9 @@ namespace EventHub.Migrations
.HasDefaultValue(false) .HasDefaultValue(false)
.HasColumnName("IsDeleted"); .HasColumnName("IsDeleted");
b.Property<bool>("IsEmailSentToMembers")
.HasColumnType("bit");
b.Property<bool>("IsOnline") b.Property<bool>("IsOnline")
.HasColumnType("bit"); .HasColumnType("bit");

Loading…
Cancel
Save