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,