From 36088724d5939516cdec35e040c3a3d12afc4ee8 Mon Sep 17 00:00:00 2001
From: Berkan
Date: Fri, 5 Feb 2021 10:01:13 +0300
Subject: [PATCH] refactor: emailing for event reminder and new event
---
.../Emailing/Templates/EventReminder.tpl | 2 +-
.../Emailing/Templates/NewEventCreated.tpl | 2 +-
.../EventHub.Application.csproj | 1 -
.../EventHubApplicationModule.cs | 1 +
.../Events/EventAppService.cs | 17 +------
.../Events/EventReminderNotifier.cs | 35 ++++++++++---
.../Events/EventReminderWorker.cs | 39 ++++++---------
.../Events/NewEventDetectorWorker.cs | 50 +++++++++++++++++++
.../Events/NewEventNotifier.cs | 31 ++++++------
9 files changed, 111 insertions(+), 67 deletions(-)
create mode 100644 src/EventHub.Application/Events/NewEventDetectorWorker.cs
diff --git a/src/EventHub.Application/Emailing/Templates/EventReminder.tpl b/src/EventHub.Application/Emailing/Templates/EventReminder.tpl
index 22f3914..75f611e 100644
--- a/src/EventHub.Application/Emailing/Templates/EventReminder.tpl
+++ b/src/EventHub.Application/Emailing/Templates/EventReminder.tpl
@@ -79,7 +79,7 @@
Hi {{model.user_name}},
- See you in 30 minutes at the "{{model.title}}" event
+ The "{{model.title}}" event will start very soon.
diff --git a/src/EventHub.Application/Emailing/Templates/NewEventCreated.tpl b/src/EventHub.Application/Emailing/Templates/NewEventCreated.tpl
index fbf795c..d8bfd07 100644
--- a/src/EventHub.Application/Emailing/Templates/NewEventCreated.tpl
+++ b/src/EventHub.Application/Emailing/Templates/NewEventCreated.tpl
@@ -79,7 +79,7 @@
Hi {{model.user_name}},
- A new event was created by "{{model.organization_name}}" under the title of "{{model.title}}".
+ A new event called "{{model.title}}" has been created.
diff --git a/src/EventHub.Application/EventHub.Application.csproj b/src/EventHub.Application/EventHub.Application.csproj
index e8620c9..7515db7 100644
--- a/src/EventHub.Application/EventHub.Application.csproj
+++ b/src/EventHub.Application/EventHub.Application.csproj
@@ -13,7 +13,6 @@
-
diff --git a/src/EventHub.Application/EventHubApplicationModule.cs b/src/EventHub.Application/EventHubApplicationModule.cs
index 51728de..342d8d6 100644
--- a/src/EventHub.Application/EventHubApplicationModule.cs
+++ b/src/EventHub.Application/EventHubApplicationModule.cs
@@ -23,6 +23,7 @@ namespace EventHub
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
context.AddBackgroundWorker();
+ context.AddBackgroundWorker();
}
public override void ConfigureServices(ServiceConfigurationContext context)
diff --git a/src/EventHub.Application/Events/EventAppService.cs b/src/EventHub.Application/Events/EventAppService.cs
index d9167f5..471fc38 100644
--- a/src/EventHub.Application/Events/EventAppService.cs
+++ b/src/EventHub.Application/Events/EventAppService.cs
@@ -3,7 +3,6 @@ using System.Linq;
using System.Threading.Tasks;
using EventHub.Organizations;
using Microsoft.AspNetCore.Authorization;
-using Microsoft.Extensions.Logging;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Repositories;
@@ -16,18 +15,15 @@ namespace EventHub.Events
private readonly EventManager _eventManager;
private readonly IRepository _organizationRepository;
private readonly IRepository _eventRepository;
- private readonly NewEventNotifier _newEventNotifier;
public EventAppService(
EventManager eventManager,
IRepository organizationRepository,
- IRepository eventRepository,
- NewEventNotifier newEventNotifier)
+ IRepository eventRepository)
{
_eventManager = eventManager;
_organizationRepository = organizationRepository;
_eventRepository = eventRepository;
- _newEventNotifier = newEventNotifier;
}
[Authorize]
@@ -51,20 +47,9 @@ namespace EventHub.Events
@event.IsOnline = input.IsOnline;
@event.Capacity = input.Capacity;
- @event.IsEmailSentToMembers = true;
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);
}
diff --git a/src/EventHub.Application/Events/EventReminderNotifier.cs b/src/EventHub.Application/Events/EventReminderNotifier.cs
index 297a757..99c0d14 100644
--- a/src/EventHub.Application/Events/EventReminderNotifier.cs
+++ b/src/EventHub.Application/Events/EventReminderNotifier.cs
@@ -1,9 +1,13 @@
-using System.Collections.Generic;
+using System;
+using System.Linq;
using System.Threading.Tasks;
using EventHub.Emailing;
+using EventHub.Events.Registrations;
using EventHub.Users;
using Volo.Abp.DependencyInjection;
+using Volo.Abp.Domain.Repositories;
using Volo.Abp.Emailing;
+using Volo.Abp.Linq;
using Volo.Abp.TextTemplating;
namespace EventHub.Events
@@ -12,25 +16,42 @@ namespace EventHub.Events
{
private readonly IEmailSender _emailSender;
private readonly ITemplateRenderer _templateRenderer;
+ private readonly IRepository _userRepository;
+ private readonly IRepository _eventRegistrationRepository;
+ private readonly IAsyncQueryableExecuter _asyncExecuter;
public EventReminderNotifier(
IEmailSender emailSender,
- ITemplateRenderer templateRenderer)
+ ITemplateRenderer templateRenderer,
+ IRepository userRepository,
+ IRepository eventRegistrationRepository,
+ IAsyncQueryableExecuter asyncExecuter)
{
_emailSender = emailSender;
_templateRenderer = templateRenderer;
+ _userRepository = userRepository;
+ _eventRegistrationRepository = eventRegistrationRepository;
+ _asyncExecuter = asyncExecuter;
}
- public async Task NotifyAsync(
- Event @event,
- IEnumerable users)
+ public async Task NotifyAsync(Event @event)
{
- if (users is null || @event is null)
+ if (@event is null)
{
return;
}
+
+ var userQueryable = await _userRepository.GetQueryableAsync();
+ var eventRegistrationQueryable = await _eventRegistrationRepository.GetQueryableAsync();
+
+ var userQuery = from eventRegistration in eventRegistrationQueryable
+ join user in userQueryable on eventRegistration.UserId equals user.Id
+ where eventRegistration.EventId == @event.Id
+ select user;
- foreach (var user in users)
+ var usersToBeNotified = await _asyncExecuter.ToListAsync(userQuery);
+
+ foreach (var user in usersToBeNotified)
{
var model = new
{
diff --git a/src/EventHub.Application/Events/EventReminderWorker.cs b/src/EventHub.Application/Events/EventReminderWorker.cs
index 24b7ca3..23a1322 100644
--- a/src/EventHub.Application/Events/EventReminderWorker.cs
+++ b/src/EventHub.Application/Events/EventReminderWorker.cs
@@ -1,13 +1,11 @@
using System;
using System.Linq;
using System.Threading.Tasks;
-using EventHub.Events.Registrations;
-using EventHub.Users;
-using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Domain.Repositories;
+using Volo.Abp.Linq;
using Volo.Abp.Threading;
using Volo.Abp.Uow;
@@ -25,36 +23,27 @@ namespace EventHub.Events
protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
{
var eventReminderNotifier = workerContext.ServiceProvider.GetRequiredService();
-
var eventRepository = workerContext.ServiceProvider.GetRequiredService>();
- var userRepository = workerContext.ServiceProvider.GetRequiredService>();
- var eventRegistrationRepository = workerContext.ServiceProvider.GetRequiredService>();
-
+ var asyncExecuter = workerContext.ServiceProvider.GetRequiredService();
+
var eventQueryable = await eventRepository.GetQueryableAsync();
- var userQueryable = await userRepository.GetQueryableAsync();
- var eventRegistrationQueryable = await eventRegistrationRepository.GetQueryableAsync();
- var thirtyOneMinutesAfter = DateTime.Now.AddMinutes(31);
- var twentyNineMinutesAfter = DateTime.Now.AddMinutes(29);
+ var thirtyOneMinutesAfter = DateTime.Now.AddMinutes(30);
+ var oneMinutesAfter = DateTime.Now.AddMinutes(1);
- var eventsStartingAfterThirtyMinutes = await eventQueryable.Where(x =>
- x.IsRemindingEmailSent == false &&
- x.StartTime < thirtyOneMinutesAfter &&
- x.StartTime > twentyNineMinutesAfter)
- .ToListAsync();
+ var eventQuery = eventQueryable.Where(x =>
+ x.IsRemindingEmailSent == false &&
+ x.StartTime <= thirtyOneMinutesAfter &&
+ x.StartTime >= oneMinutesAfter);
+
+ var events = await asyncExecuter.ToListAsync(eventQuery);
- foreach (var @event in eventsStartingAfterThirtyMinutes)
+ foreach (var @event in events)
{
- var usersToBeNotified = await (from eventRegistration in eventRegistrationQueryable
- join user in userQueryable on eventRegistration.UserId equals user.Id
- where eventRegistration.EventId == @event.Id
- select user).ToListAsync();
-
- @event.IsRemindingEmailSent = true;
-
try
{
- await eventReminderNotifier.NotifyAsync(@event, usersToBeNotified);
+ await eventReminderNotifier.NotifyAsync(@event);
+ @event.IsRemindingEmailSent = true;
}
catch (Exception e)
{
diff --git a/src/EventHub.Application/Events/NewEventDetectorWorker.cs b/src/EventHub.Application/Events/NewEventDetectorWorker.cs
new file mode 100644
index 0000000..6694e9b
--- /dev/null
+++ b/src/EventHub.Application/Events/NewEventDetectorWorker.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Volo.Abp.BackgroundWorkers;
+using Volo.Abp.Domain.Repositories;
+using Volo.Abp.Linq;
+using Volo.Abp.Threading;
+using Volo.Abp.Uow;
+
+namespace EventHub.Events
+{
+ public class NewEventDetectorWorker : AsyncPeriodicBackgroundWorkerBase
+ {
+ public NewEventDetectorWorker(AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory)
+ : base(timer, serviceScopeFactory)
+ {
+ Timer.Period = 60_000;
+ }
+
+ [UnitOfWork]
+ protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
+ {
+ var newEventNotifier = workerContext.ServiceProvider.GetRequiredService();
+ var eventRepository = workerContext.ServiceProvider.GetRequiredService>();
+ var asyncExecuter = workerContext.ServiceProvider.GetRequiredService();
+
+ var eventQueryable = await eventRepository.GetQueryableAsync();
+
+ var eventQuery = eventQueryable.Where(x => x.IsEmailSentToMembers == false);
+
+ var newEvents = await asyncExecuter.ToListAsync(eventQuery);
+
+ foreach (var @event in newEvents)
+ {
+ try
+ {
+ await newEventNotifier.NotifyAsync(@event);
+ @event.IsEmailSentToMembers = true;
+ }
+ catch (Exception e)
+ {
+ @event.IsEmailSentToMembers = false;
+ Logger.LogError($"An error occurred while sending an email to the members of the organization after the new event was created. Error message: {e.Message}");
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/EventHub.Application/Events/NewEventNotifier.cs b/src/EventHub.Application/Events/NewEventNotifier.cs
index 23e76a9..2e5f082 100644
--- a/src/EventHub.Application/Events/NewEventNotifier.cs
+++ b/src/EventHub.Application/Events/NewEventNotifier.cs
@@ -1,15 +1,13 @@
using System;
using System.Linq;
-using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using EventHub.Emailing;
-using EventHub.Organizations;
using EventHub.Organizations.Memberships;
using EventHub.Users;
-using Microsoft.EntityFrameworkCore;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Emailing;
+using Volo.Abp.Linq;
using Volo.Abp.TextTemplating;
namespace EventHub.Events
@@ -20,33 +18,35 @@ namespace EventHub.Events
private readonly ITemplateRenderer _templateRenderer;
private readonly IRepository _organizationMembershipsRepository;
private readonly IRepository _userRepository;
-
+ private readonly IAsyncQueryableExecuter _asyncExecuter;
+
public NewEventNotifier(
IEmailSender emailSender,
- ITemplateRenderer templateRenderer,
+ ITemplateRenderer templateRenderer,
IRepository organizationMembershipsRepository,
- IRepository userRepository)
+ IRepository userRepository,
+ IAsyncQueryableExecuter asyncExecuter)
{
_emailSender = emailSender;
_templateRenderer = templateRenderer;
_organizationMembershipsRepository = organizationMembershipsRepository;
_userRepository = userRepository;
+ _asyncExecuter = asyncExecuter;
}
- public async Task NotifyAsync(
- Organization organization,
- Event @event)
+ public async Task NotifyAsync(Event @event)
{
- if (organization is null || @event is null)
+ if (@event is null)
{
return;
}
- var organizationMemberQueryable = await _organizationMembershipsRepository.GetQueryableAsync();
-
- var organizationMembers = await organizationMemberQueryable
- .Where(x => x.OrganizationId == organization.Id)
- .ToListAsync();
+ var organizationMembershipsQueryable = await _organizationMembershipsRepository.GetQueryableAsync();
+
+ var membershipQuery = organizationMembershipsQueryable
+ .Where(x => x.OrganizationId == @event.OrganizationId);
+
+ var organizationMembers = await _asyncExecuter.ToListAsync(membershipQuery);
foreach (var member in organizationMembers)
{
@@ -60,7 +60,6 @@ namespace EventHub.Events
var model = new
{
UserName = user.GetFullNameOrUsername(),
- OrganizationName = organization.Name,
Title = @event.Title,
StartTime = @event.StartTime,
EndTime = @event.EndTime,