diff --git a/src/EventHub.Application/Events/EventAppService.cs b/src/EventHub.Application/Events/EventAppService.cs index 9b7ac0e..4afc812 100644 --- a/src/EventHub.Application/Events/EventAppService.cs +++ b/src/EventHub.Application/Events/EventAppService.cs @@ -25,7 +25,6 @@ namespace EventHub.Events private readonly IRepository _userRepository; private readonly IRepository _countriesRepository; private readonly IBlobContainer _eventBlobContainer; - private readonly IRepository _eventRegistrationRepository; public EventAppService( EventManager eventManager, @@ -34,8 +33,7 @@ namespace EventHub.Events IRepository organizationRepository, IRepository userRepository, IRepository countriesRepository, - IBlobContainer eventBlobContainer, - IRepository eventRegistrationRepository) + IBlobContainer eventBlobContainer) { _eventManager = eventManager; _eventRegistrationManager = eventRegistrationManager; @@ -44,7 +42,6 @@ namespace EventHub.Events _userRepository = userRepository; _countriesRepository = countriesRepository; _eventBlobContainer = eventBlobContainer; - _eventRegistrationRepository = eventRegistrationRepository; } [Authorize] @@ -238,9 +235,8 @@ namespace EventHub.Events } @event.SetTime(input.StartTime, input.EndTime); - @event.TimingChangeCount = @event.TimingChangeCount + 1; - - await UpdateEventRegistrationForTimingChangeAsync(@event); + @event.TimingChangeCount++; + await _eventRepository.UpdateAsync(@event); } @@ -258,22 +254,5 @@ namespace EventHub.Events return await _eventBlobContainer.GetAllBytesOrNullAsync(blobName); } - - private async Task UpdateEventRegistrationForTimingChangeAsync(Event @event) - { - var eventRegistrationQueryable = await _eventRegistrationRepository.GetQueryableAsync(); - var query = eventRegistrationQueryable.Where(x => x.EventId == @event.Id); - var eventRegistrations = await AsyncExecuter.ToListAsync(query); - - foreach (var eventRegistration in eventRegistrations) - { - if (eventRegistration.IsTimingChangeEmailSent) - { - eventRegistration.IsTimingChangeEmailSent = false; - } - } - - await _eventRegistrationRepository.UpdateManyAsync(eventRegistrations, true); - } } } \ No newline at end of file diff --git a/src/EventHub.Domain/Events/Event.cs b/src/EventHub.Domain/Events/Event.cs index 012f53c..c64a99a 100644 --- a/src/EventHub.Domain/Events/Event.cs +++ b/src/EventHub.Domain/Events/Event.cs @@ -57,7 +57,7 @@ namespace EventHub.Events UrlCode = Check.NotNullOrWhiteSpace(urlCode, urlCode, EventConsts.UrlCodeLength, EventConsts.UrlCodeLength); SetTitle(title); SetDescription(description); - SetTime(startTime, endTime); + SetTimeInternal(startTime, endTime); } public Event SetTitle(string title) @@ -75,14 +75,8 @@ namespace EventHub.Events public Event SetTime(DateTime startTime, DateTime endTime) { - if (startTime > endTime) - { - throw new BusinessException(EventHubErrorCodes.EventEndTimeCantBeEarlierThanStartTime); - } - - StartTime = startTime; - EndTime = endTime; - return this; + AddLocalEvent(new EventTimeChangingEventData(this, StartTime, EndTime)); + return SetTimeInternal(startTime, endTime); } public Event SetLocation( @@ -108,5 +102,17 @@ namespace EventHub.Events return this; } + + private Event SetTimeInternal(DateTime startTime, DateTime endTime) + { + if (startTime > endTime) + { + throw new BusinessException(EventHubErrorCodes.EventEndTimeCantBeEarlierThanStartTime); + } + + StartTime = startTime; + EndTime = endTime; + return this; + } } } diff --git a/src/EventHub.Domain/Events/EventManager.cs b/src/EventHub.Domain/Events/EventManager.cs index 4725d57..77bdf8b 100644 --- a/src/EventHub.Domain/Events/EventManager.cs +++ b/src/EventHub.Domain/Events/EventManager.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading.Tasks; using EventHub.Events.Registrations; using EventHub.Organizations; diff --git a/src/EventHub.Domain/Events/EventTimeChangeLocalEventHandler.cs b/src/EventHub.Domain/Events/EventTimeChangeLocalEventHandler.cs new file mode 100644 index 0000000..0316386 --- /dev/null +++ b/src/EventHub.Domain/Events/EventTimeChangeLocalEventHandler.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using EventHub.Events.Registrations; +using IdentityServer4.Validation; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus; +using Volo.Abp.Linq; + +namespace EventHub.Events +{ + public class EventTimeChangeLocalEventHandler : ILocalEventHandler, ITransientDependency + { + private readonly IRepository _eventRegistrationRepository; + private readonly IAsyncQueryableExecuter _asyncExecuter; + + public EventTimeChangeLocalEventHandler( + IRepository eventRegistrationRepository, + IAsyncQueryableExecuter asyncExecuter) + { + _eventRegistrationRepository = eventRegistrationRepository; + _asyncExecuter = asyncExecuter; + } + + public async Task HandleEventAsync(EventTimeChangingEventData eventData) + { + await UpdateEventRegistrationForTimingChangeAsync(@eventData.Event); + } + + private async Task UpdateEventRegistrationForTimingChangeAsync(Event @event) + { + var eventRegistrationQueryable = await _eventRegistrationRepository.GetQueryableAsync(); + var query = eventRegistrationQueryable.Where(x => x.EventId == @event.Id); + var eventRegistrations = await _asyncExecuter.ToListAsync(query); + + foreach (var eventRegistration in eventRegistrations) + { + if (eventRegistration.IsTimingChangeEmailSent) + { + eventRegistration.IsTimingChangeEmailSent = false; + } + } + + await _eventRegistrationRepository.UpdateManyAsync(eventRegistrations, true); + } + } +} \ No newline at end of file diff --git a/src/EventHub.Domain/Events/EventTimeChangingEventData.cs b/src/EventHub.Domain/Events/EventTimeChangingEventData.cs new file mode 100644 index 0000000..cf57a1a --- /dev/null +++ b/src/EventHub.Domain/Events/EventTimeChangingEventData.cs @@ -0,0 +1,18 @@ +using System; + +namespace EventHub.Events +{ + public class EventTimeChangingEventData + { + public Event Event { get; } + public DateTime OldStartTime { get; } + public DateTime OldEndTime { get; } + + public EventTimeChangingEventData(Event @event, DateTime oldStartTime, DateTime oldEndTime) + { + Event = @event; + OldStartTime = oldStartTime; + OldEndTime = oldEndTime; + } + } +} \ No newline at end of file diff --git a/test/EventHub.Application.Tests/Events/EventAppServiceTests.cs b/test/EventHub.Application.Tests/Events/EventAppServiceTests.cs index 581708e..d001044 100644 --- a/test/EventHub.Application.Tests/Events/EventAppServiceTests.cs +++ b/test/EventHub.Application.Tests/Events/EventAppServiceTests.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using EventHub.Events.Registrations; using Shouldly; using Volo.Abp; +using Volo.Abp.Authorization; using Volo.Abp.Domain.Repositories; using Volo.Abp.Timing; using Xunit; @@ -54,7 +55,7 @@ namespace EventHub.Events [Fact] public async Task Should_Not_Create_Event_For_Not_Authorized_Organization() { - var exception = await Assert.ThrowsAsync(async () => + var exception = await Assert.ThrowsAsync(async () => { await _eventAppService.CreateAsync( new CreateEventDto