diff --git a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs index 8109698..0779f1e 100644 --- a/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs +++ b/src/EventHub.Admin.Application/EventHubApplicationAutoMapperProfile.cs @@ -6,6 +6,7 @@ using EventHub.Admin.Organizations.Memberships; using EventHub.Admin.Users; using EventHub.Countries; using EventHub.Events; +using EventHub.Events.Registrations; using EventHub.Organizations; using EventHub.Organizations.Memberships; using Volo.Abp.AutoMapper; @@ -36,6 +37,10 @@ namespace EventHub.Admin opt => opt.MapFrom(user => user.Id)); CreateMap(); + + CreateMap(); + + CreateMap(); } } } diff --git a/src/EventHub.Admin.Application/Events/EventAppService.cs b/src/EventHub.Admin.Application/Events/EventAppService.cs index 19617d6..daf2b16 100644 --- a/src/EventHub.Admin.Application/Events/EventAppService.cs +++ b/src/EventHub.Admin.Application/Events/EventAppService.cs @@ -6,8 +6,6 @@ using System.Threading.Tasks; using EventHub.Admin.Permissions; using EventHub.Countries; using EventHub.Events; -using EventHub.Events.Registrations; -using EventHub.Organizations; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.BlobStoring; @@ -18,25 +16,18 @@ namespace EventHub.Admin.Events [Authorize(EventHubPermissions.Events.Default)] public class EventAppService : EventHubAdminAppService, IEventAppService { - private readonly IRepository _eventRepository; - private readonly IRepository _eventRegistrationRepository; - private readonly IRepository _organizationRepository; + private readonly IEventRepository _eventRepository; private readonly IBlobContainer _eventBlobContainer; private readonly EventManager _eventManager; private readonly IRepository _countryRepository; - public EventAppService( - IRepository eventRepository, - IRepository eventRegistrationRepository, - IRepository organizationRepository, + IEventRepository eventRepository, IBlobContainer eventBlobContainer, - EventManager eventManager, + EventManager eventManager, IRepository countryRepository) { _eventRepository = eventRepository; - _eventRegistrationRepository = eventRegistrationRepository; - _organizationRepository = organizationRepository; _eventBlobContainer = eventBlobContainer; _eventManager = eventManager; _countryRepository = countryRepository; @@ -54,34 +45,14 @@ namespace EventHub.Admin.Events public async Task> GetListAsync(EventListFilterDto input) { - var eventQueryable = await _eventRepository.GetQueryableAsync(); - var eventRegistrationQueryable = await _eventRegistrationRepository.GetQueryableAsync(); - var organizationQueryable = await _organizationRepository.GetQueryableAsync(); - - var query = (from @event in eventQueryable - join organization in organizationQueryable on @event.OrganizationId equals organization.Id - select new EventInListDto - { - Id = @event.Id, - Title = @event.Title, - StartTime = @event.StartTime, - OrganizationDisplayName = organization.DisplayName, - AttendeeCount = (from eventRegistration in eventRegistrationQueryable - where eventRegistration.EventId == @event.Id - select @eventRegistration).Count() - }) - .WhereIf(!string.IsNullOrWhiteSpace(input.Title), x => x.Title.ToLower().Contains(input.Title.ToLower())) - .WhereIf(!string.IsNullOrWhiteSpace(input.OrganizationDisplayName), x => x.OrganizationDisplayName.ToLower().Contains(input.OrganizationDisplayName.ToLower())) - .WhereIf(input.MinStartTime.HasValue, x => x.StartTime >= input.MinStartTime) - .WhereIf(input.MaxStartTime.HasValue, x => x.StartTime <= input.MaxStartTime) - .WhereIf(input.MinAttendeeCount.HasValue, x => x.AttendeeCount >= input.MinAttendeeCount) - .WhereIf(input.MaxAttendeeCount.HasValue, x => x.AttendeeCount <= input.MaxAttendeeCount); - - var totalCount = await AsyncExecuter.CountAsync(query); - query = query.OrderBy(string.IsNullOrWhiteSpace(input.Sorting) ? EventConsts.DefaultSorting : input.Sorting); - query = query.PageBy(input); - - var events = await AsyncExecuter.ToListAsync(query); + var totalCount = await _eventRepository.GetCountAsync(input.Title, input.OrganizationDisplayName, input.MinAttendeeCount, + input.MaxAttendeeCount, input.MinStartTime, input.MaxStartTime); + + var items = await _eventRepository.GetListAsync(input.Sorting, input.SkipCount, input.MaxResultCount, + input.Title, input.OrganizationDisplayName, input.MinAttendeeCount, input.MaxAttendeeCount, + input.MinStartTime, input.MaxStartTime); + + var events = ObjectMapper.Map, List>(items); return new PagedResultDto(totalCount, events); } @@ -115,8 +86,8 @@ namespace EventHub.Admin.Events var countriesQueryable = await _countryRepository.GetQueryableAsync(); var query = from country in countriesQueryable - orderby country.Name - select country; + orderby country.Name + select country; var countries = await AsyncExecuter.ToListAsync(query); diff --git a/src/EventHub.Admin.Application/Events/Registrations/EventRegistrationAppService.cs b/src/EventHub.Admin.Application/Events/Registrations/EventRegistrationAppService.cs index d9140ea..26495c5 100644 --- a/src/EventHub.Admin.Application/Events/Registrations/EventRegistrationAppService.cs +++ b/src/EventHub.Admin.Application/Events/Registrations/EventRegistrationAppService.cs @@ -5,27 +5,25 @@ using System.Linq.Dynamic.Core; using System.Threading.Tasks; using EventHub.Admin.Permissions; using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.Identity; using EventHub.Events.Registrations; using Microsoft.AspNetCore.Authorization; using EventHub.Events; -using Volo.Abp; +using EventHub.Users; namespace EventHub.Admin.Events.Registrations { [Authorize(EventHubPermissions.Events.Registrations.Default)] public class EventRegistrationAppService : EventHubAdminAppService, IEventRegistrationAppService { - private readonly IRepository _userRepository; - private readonly IRepository _eventRegistrationRepository; - private readonly IRepository _eventRepository; + private readonly IUserRepository _userRepository; + private readonly IEventRegistrationRepository _eventRegistrationRepository; + private readonly IEventRepository _eventRepository; private readonly EventRegistrationManager _eventRegistrationManager; public EventRegistrationAppService( - IRepository userRepository, - IRepository eventRegistrationRepository, - IRepository eventRepository, + IUserRepository userRepository, + IEventRegistrationRepository eventRegistrationRepository, + IEventRepository eventRepository, EventRegistrationManager eventRegistrationManager) { _userRepository = userRepository; @@ -36,29 +34,11 @@ namespace EventHub.Admin.Events.Registrations public async Task> GetAttendeesAsync(GetEventRegistrationListInput input) { - var eventRegistrationQueryable = await _eventRegistrationRepository.GetQueryableAsync(); - var userQueryable = await _userRepository.GetQueryableAsync(); - - var query = from eventRegistration in eventRegistrationQueryable - join user in userQueryable on eventRegistration.UserId equals user.Id - where eventRegistration.EventId == input.EventId - orderby eventRegistration.CreationTime descending - select user; - - var totalCount = await AsyncExecuter.CountAsync(query); - - if (!string.IsNullOrWhiteSpace(input.Sorting)) - { - query = query.OrderBy(input.Sorting); - } - - query = query.PageBy(input); - var users = await AsyncExecuter.ToListAsync(query.Take(10)); + var totalCount = await _eventRegistrationRepository.GetCountAsync(input.EventId); + var items = await _eventRegistrationRepository.GetListAsync(input.EventId, input.Sorting, input.SkipCount, input.MaxResultCount); + var users = ObjectMapper.Map, List>(items); - return new PagedResultDto( - totalCount, - ObjectMapper.Map, List>(users) - ); + return new PagedResultDto(totalCount, users); } [Authorize(EventHubPermissions.Events.Registrations.RemoveAttendee)] diff --git a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs index b97d381..afba9ec 100644 --- a/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using EventHub.Admin.Permissions; using EventHub.Organizations.Memberships; +using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp; using Volo.Abp.Application.Dtos; @@ -17,11 +18,11 @@ namespace EventHub.Admin.Organizations.Memberships public class OrganizationMembershipAppService : ApplicationService, IOrganizationMembershipAppService { private readonly IOrganizationMembershipRepository _organizationMembershipRepository; - private readonly IRepository _userRepository; + private readonly IUserRepository _userRepository; public OrganizationMembershipAppService( - IOrganizationMembershipRepository organizationMembershipRepository, - IRepository userRepository) + IOrganizationMembershipRepository organizationMembershipRepository, + IUserRepository userRepository) { _organizationMembershipRepository = organizationMembershipRepository; _userRepository = userRepository; diff --git a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs index df3794c..4e21c4e 100644 --- a/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Admin.Application/Organizations/OrganizationAppService.cs @@ -5,6 +5,7 @@ using System.Linq.Dynamic.Core; using System.Threading.Tasks; using EventHub.Admin.Permissions; using EventHub.Organizations; +using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp; using Volo.Abp.Application.Dtos; @@ -18,12 +19,12 @@ namespace EventHub.Admin.Organizations public class OrganizationAppService : EventHubAdminAppService, IOrganizationAppService { private readonly IRepository _organizationRepository; - private readonly IRepository _identityUserRepository; + private readonly IUserRepository _identityUserRepository; private readonly IBlobContainer _organizationBlobContainer; public OrganizationAppService( IRepository organizationRepository, - IRepository identityUserRepository, + IUserRepository identityUserRepository, IBlobContainer organizationBlobContainer) { _organizationRepository = organizationRepository; diff --git a/src/EventHub.Admin.Application/Users/UserAppService.cs b/src/EventHub.Admin.Application/Users/UserAppService.cs index 0300bdb..8af8994 100644 --- a/src/EventHub.Admin.Application/Users/UserAppService.cs +++ b/src/EventHub.Admin.Application/Users/UserAppService.cs @@ -1,12 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; +using System.Collections.Generic; using System.Threading.Tasks; using EventHub.Admin.Permissions; +using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; namespace EventHub.Admin.Users @@ -14,31 +11,20 @@ namespace EventHub.Admin.Users [Authorize(EventHubPermissions.Users.Default)] public class UserAppService : EventHubAdminAppService, IUserAppService { - private readonly IRepository _identityUserRepository; + private readonly IUserRepository _userRepository; - public UserAppService(IRepository identityUserRepository) + public UserAppService(IUserRepository userRepository) { - _identityUserRepository = identityUserRepository; + _userRepository = userRepository; } public async Task> GetListAsync(GetUserListInput input) { - var identityUserQueryable = await _identityUserRepository.GetQueryableAsync(); + var totalCount = await _userRepository.GetCountAsync(input.Username); + var items = await _userRepository.GetListAsync(input.Sorting, input.SkipCount, input.MaxResultCount, input.Username); + var users = ObjectMapper.Map, List>(items); - var query = identityUserQueryable - .WhereIf(!string.IsNullOrWhiteSpace(input.Username), user => user.UserName.ToLower().Contains(input.Username.ToLower())); - - var totalCount = await AsyncExecuter.CountAsync(query); - - if (!string.IsNullOrWhiteSpace(input.Sorting)) - { - query = query.OrderBy(input.Sorting); - } - - query = query.PageBy(input); - - var users = await AsyncExecuter.ToListAsync(query); - return new PagedResultDto(totalCount, ObjectMapper.Map, List>(users)); + return new PagedResultDto(totalCount, users); } } } diff --git a/src/EventHub.Application/Events/EventAppService.cs b/src/EventHub.Application/Events/EventAppService.cs index ff14e70..a116920 100644 --- a/src/EventHub.Application/Events/EventAppService.cs +++ b/src/EventHub.Application/Events/EventAppService.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using EventHub.Countries; using EventHub.Events.Registrations; using EventHub.Organizations; +using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Authorization; @@ -19,20 +20,20 @@ namespace EventHub.Events { private readonly EventManager _eventManager; private readonly EventRegistrationManager _eventRegistrationManager; - private readonly IRepository _eventRegistrationRepository; - private readonly IRepository _eventRepository; + private readonly IEventRegistrationRepository _eventRegistrationRepository; + private readonly IEventRepository _eventRepository; private readonly IRepository _organizationRepository; - private readonly IRepository _userRepository; + private readonly IUserRepository _userRepository; private readonly IRepository _countriesRepository; private readonly IBlobContainer _eventBlobContainer; public EventAppService( EventManager eventManager, EventRegistrationManager eventRegistrationManager, - IRepository eventRegistrationRepository, - IRepository eventRepository, + IEventRegistrationRepository eventRegistrationRepository, + IEventRepository eventRepository, IRepository organizationRepository, - IRepository userRepository, + IUserRepository userRepository, IRepository countriesRepository, IBlobContainer eventBlobContainer) { diff --git a/src/EventHub.Application/Events/Registrations/EventRegistrationAppService.cs b/src/EventHub.Application/Events/Registrations/EventRegistrationAppService.cs index 1197a5a..32637ba 100644 --- a/src/EventHub.Application/Events/Registrations/EventRegistrationAppService.cs +++ b/src/EventHub.Application/Events/Registrations/EventRegistrationAppService.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; -using Volo.Abp.Domain.Repositories; using Volo.Abp.Users; using Volo.Abp.Identity; @@ -13,16 +13,16 @@ namespace EventHub.Events.Registrations public class EventRegistrationAppService : EventHubAppService, IEventRegistrationAppService { private readonly EventRegistrationManager _eventRegistrationManager; - private readonly IRepository _userRepository; - private readonly IRepository _eventRepository; - private readonly IRepository _eventRegistrationRepository; + private readonly IUserRepository _userRepository; + private readonly IEventRepository _eventRepository; + private readonly IEventRegistrationRepository _eventRegistrationRepository; private readonly EventRegistrationNotifier _eventRegistrationNotifier; public EventRegistrationAppService( EventRegistrationManager eventRegistrationManager, - IRepository userRepository, - IRepository eventRepository, - IRepository eventRegistrationRepository, + IUserRepository userRepository, + IEventRepository eventRepository, + IEventRegistrationRepository eventRegistrationRepository, EventRegistrationNotifier eventRegistrationNotifier) { _eventRegistrationManager = eventRegistrationManager; diff --git a/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs b/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs index d6a43ea..05375c9 100644 --- a/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs +++ b/src/EventHub.Application/Organizations/Memberships/OrganizationMembershipAppService.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using EventHub.Users; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Repositories; @@ -13,15 +14,15 @@ namespace EventHub.Organizations.Memberships public class OrganizationMembershipAppService : EventHubAppService, IOrganizationMembershipAppService { private readonly OrganizationMembershipManager _organizationMembershipManager; - private readonly IRepository _userRepository; + private readonly IUserRepository _userRepository; private readonly IRepository _organizationRepository; - private readonly IRepository _organizationMembershipsRepository; + private readonly IOrganizationMembershipRepository _organizationMembershipsRepository; public OrganizationMembershipAppService( - OrganizationMembershipManager organizationMembershipManager, - IRepository userRepository, - IRepository organizationRepository, - IRepository organizationMembershipsRepository) + OrganizationMembershipManager organizationMembershipManager, + IUserRepository userRepository, + IRepository organizationRepository, + IOrganizationMembershipRepository organizationMembershipsRepository) { _organizationMembershipManager = organizationMembershipManager; _userRepository = userRepository; diff --git a/src/EventHub.Application/Organizations/OrganizationAppService.cs b/src/EventHub.Application/Organizations/OrganizationAppService.cs index a53573f..7d36f4c 100644 --- a/src/EventHub.Application/Organizations/OrganizationAppService.cs +++ b/src/EventHub.Application/Organizations/OrganizationAppService.cs @@ -17,17 +17,17 @@ namespace EventHub.Organizations public class OrganizationAppService : EventHubAppService, IOrganizationAppService { private readonly IRepository _organizationRepository; - private readonly IRepository _organizationMembershipsRepository; + private readonly IOrganizationMembershipRepository _organizationMembershipsRepository; private readonly OrganizationManager _organizationManager; private readonly IBlobContainer _organizationBlobContainer; - private readonly IRepository _userRepository; + private readonly IUserRepository _userRepository; public OrganizationAppService( IRepository organizationRepository, - IRepository organizationMembershipsRepository, + IOrganizationMembershipRepository organizationMembershipsRepository, OrganizationManager organizationManager, - IBlobContainer organizationBlobContainer, - IRepository userRepository) + IBlobContainer organizationBlobContainer, + IUserRepository userRepository) { _organizationRepository = organizationRepository; _organizationMembershipsRepository = organizationMembershipsRepository; diff --git a/src/EventHub.Application/Users/UserAppService.cs b/src/EventHub.Application/Users/UserAppService.cs index 2481f18..42ed495 100644 --- a/src/EventHub.Application/Users/UserAppService.cs +++ b/src/EventHub.Application/Users/UserAppService.cs @@ -8,9 +8,9 @@ namespace EventHub.Users { public class UserAppService : EventHubAppService, IUserAppService { - private readonly IRepository _userRepository; + private readonly IUserRepository _userRepository; - public UserAppService(IRepository userRepository) + public UserAppService(IUserRepository userRepository) { _userRepository = userRepository; } diff --git a/src/EventHub.Domain/Events/EventWithDetails.cs b/src/EventHub.Domain/Events/EventWithDetails.cs new file mode 100644 index 0000000..c88055d --- /dev/null +++ b/src/EventHub.Domain/Events/EventWithDetails.cs @@ -0,0 +1,17 @@ +using System; + +namespace EventHub.Events +{ + public class EventWithDetails + { + public Guid Id { get; set; } + + public string Title { get; set; } + + public string OrganizationDisplayName { get; set; } + + public int AttendeeCount { get; set; } + + public DateTime StartTime { get; set; } + } +} diff --git a/src/EventHub.Domain/Events/IEventRepository.cs b/src/EventHub.Domain/Events/IEventRepository.cs new file mode 100644 index 0000000..4c3a528 --- /dev/null +++ b/src/EventHub.Domain/Events/IEventRepository.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace EventHub.Events +{ + public interface IEventRepository : IRepository + { + Task GetCountAsync( + string title = null, + string organizationDisplayName = null, + int? minAttendeeCount = null, + int? maxAttendeeCount = null, + DateTime? minStartTime = null, + DateTime? maxStartTime = null, + CancellationToken cancellationToken = default + ); + + Task> GetListAsync( + string sorting = null, + int skipCount = 0, + int maxResultCount = int.MaxValue, + string title = null, + string organizationDisplayName = null, + int? minAttendeeCount = null, + int? maxAttendeeCount = null, + DateTime? minStartTime = null, + DateTime? maxStartTime = null, + CancellationToken cancellationToken = default + ); + } +} diff --git a/src/EventHub.Domain/Events/Registrations/EventRegistrationWithDetails.cs b/src/EventHub.Domain/Events/Registrations/EventRegistrationWithDetails.cs new file mode 100644 index 0000000..4c59921 --- /dev/null +++ b/src/EventHub.Domain/Events/Registrations/EventRegistrationWithDetails.cs @@ -0,0 +1,20 @@ +using System; +using Volo.Abp.Auditing; + +namespace EventHub.Events.Registrations +{ + public class EventRegistrationWithDetails : IHasCreationTime + { + public Guid UserId { get; set; } + + public string UserName { get; set; } + + public string Email { get; set; } + + public string Name { get; set; } + + public string Surname { get; set; } + + public DateTime CreationTime { get; set; } + } +} diff --git a/src/EventHub.Domain/Events/Registrations/IEventRegistrationRepository.cs b/src/EventHub.Domain/Events/Registrations/IEventRegistrationRepository.cs new file mode 100644 index 0000000..6348c29 --- /dev/null +++ b/src/EventHub.Domain/Events/Registrations/IEventRegistrationRepository.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace EventHub.Events.Registrations +{ + public interface IEventRegistrationRepository : IRepository + { + Task GetCountAsync(Guid eventId, CancellationToken cancellationToken = default); + + Task> GetListAsync( + Guid eventId, + string sorting = null, + int skipCount = 0, + int maxResultCount = int.MaxValue, + CancellationToken cancellationToken = default + ); + } +} diff --git a/src/EventHub.Domain/Users/IUserRepository.cs b/src/EventHub.Domain/Users/IUserRepository.cs new file mode 100644 index 0000000..f9d07aa --- /dev/null +++ b/src/EventHub.Domain/Users/IUserRepository.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; + +namespace EventHub.Users +{ + public interface IUserRepository : IRepository + { + Task> GetListAsync( + string sorting = null, + int skipCount = 0, + int maxResultCount = int.MaxValue, + string username = null, + CancellationToken cancellationToken = default + ); + + Task GetCountAsync( + string username = null, + CancellationToken cancellationToken = default + ); + } +} diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Events/EventRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Events/EventRepository.cs new file mode 100644 index 0000000..603824c --- /dev/null +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Events/EventRepository.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using EventHub.Events; +using EventHub.Events.Registrations; +using EventHub.Organizations; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace EventHub.EntityFrameworkCore.Events +{ + public class EventRepository : EfCoreRepository, IEventRepository + { + public EventRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task GetCountAsync( + string title = null, + string organizationDisplayName = null, + int? minAttendeeCount = null, + int? maxAttendeeCount = null, + DateTime? minStartTime = null, + DateTime? maxStartTime = null, + CancellationToken cancellationToken = default + ) + { + var dbContext = await GetDbContextAsync(); + + var eventQueryable = await GetQueryableAsync(); + var eventRegistrationQueryable = dbContext.Set().AsQueryable(); + var organizationQueryable = dbContext.Set().AsQueryable(); + + var query = (from @event in eventQueryable + join organization in organizationQueryable on @event.OrganizationId equals organization.Id + select new + { + Event = @event, + Organization = organization, + AttendeeCount = (from eventRegistration in eventRegistrationQueryable + where eventRegistration.EventId == @event.Id + select @eventRegistration).Count() + }) + .WhereIf(!string.IsNullOrWhiteSpace(title), x => x.Event.Title.ToLower().Contains(title.ToLower())) + .WhereIf(!string.IsNullOrWhiteSpace(organizationDisplayName), x => x.Organization.DisplayName.ToLower().Contains(organizationDisplayName.ToLower())) + .WhereIf(minStartTime.HasValue, x => x.Event.StartTime >= minStartTime) + .WhereIf(maxStartTime.HasValue, x => x.Event.StartTime <= maxStartTime) + .WhereIf(minAttendeeCount.HasValue, x => x.AttendeeCount >= minAttendeeCount) + .WhereIf(maxAttendeeCount.HasValue, x => x.AttendeeCount <= maxAttendeeCount); + + return await query.CountAsync(GetCancellationToken(cancellationToken)); + } + + public async Task> GetListAsync( + string sorting = null, + int skipCount = 0, + int maxResultCount = int.MaxValue, + string title = null, + string organizationDisplayName = null, + int? minAttendeeCount = null, + int? maxAttendeeCount = null, + DateTime? minStartTime = null, + DateTime? maxStartTime = null, + CancellationToken cancellationToken = default + ) + { + var dbContext = await GetDbContextAsync(); + + var eventQueryable = await GetQueryableAsync(); + var eventRegistrationQueryable = dbContext.Set().AsQueryable(); + var organizationQueryable = dbContext.Set().AsQueryable(); + + var query = (from @event in eventQueryable + join organization in organizationQueryable on @event.OrganizationId equals organization.Id + select new EventWithDetails + { + Id = @event.Id, + Title = @event.Title, + StartTime = @event.StartTime, + OrganizationDisplayName = organization.DisplayName, + AttendeeCount = (from eventRegistration in eventRegistrationQueryable + where eventRegistration.EventId == @event.Id + select @eventRegistration).Count() + }) + .WhereIf(!string.IsNullOrWhiteSpace(title), x => x.Title.ToLower().Contains(title.ToLower())) + .WhereIf(!string.IsNullOrWhiteSpace(organizationDisplayName), + x => x.OrganizationDisplayName.ToLower().Contains(organizationDisplayName.ToLower())) + .WhereIf(minStartTime.HasValue, x => x.StartTime >= minStartTime) + .WhereIf(maxStartTime.HasValue, x => x.StartTime <= maxStartTime) + .WhereIf(minAttendeeCount.HasValue, x => x.AttendeeCount >= minAttendeeCount) + .WhereIf(maxAttendeeCount.HasValue, x => x.AttendeeCount <= maxAttendeeCount) + .OrderBy(string.IsNullOrWhiteSpace(sorting) ? EventConsts.DefaultSorting : sorting) + .PageBy(skipCount, maxResultCount); + + return await query.ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Events/Registrations/EventRegistrationRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Events/Registrations/EventRegistrationRepository.cs new file mode 100644 index 0000000..79807fb --- /dev/null +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Events/Registrations/EventRegistrationRepository.cs @@ -0,0 +1,61 @@ +using EventHub.Events.Registrations; +using System; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Identity; + +namespace EventHub.EntityFrameworkCore.Events.Registrations +{ + public class EventRegistrationRepository : EfCoreRepository, IEventRegistrationRepository + { + public EventRegistrationRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task GetCountAsync(Guid eventId, CancellationToken cancellationToken = default) + { + var userQueryable = (await GetDbContextAsync()).Set().AsQueryable(); + + var query = from eventRegistration in (await GetQueryableAsync()) + join user in userQueryable on eventRegistration.UserId equals user.Id + where eventRegistration.EventId == eventId + select user; + + return await query.CountAsync(GetCancellationToken(cancellationToken)); + } + + public async Task> GetListAsync( + Guid eventId, + string sorting = null, + int skipCount = 0, + int maxResultCount = int.MaxValue, + CancellationToken cancellationToken = default + ) + { + var userQueryable = (await GetDbContextAsync()).Set().AsQueryable(); + + var query = (from eventRegistration in (await GetQueryableAsync()) + join user in userQueryable on eventRegistration.UserId equals user.Id + where eventRegistration.EventId == eventId + select new EventRegistrationWithDetails + { + UserId = user.Id, + Name = user.Name, + Surname = user.Surname, + UserName = user.UserName, + Email = user.Email, + CreationTime = user.CreationTime + }) + .OrderBy(string.IsNullOrWhiteSpace(sorting) ? nameof(EventRegistrationWithDetails.CreationTime) : sorting) + .PageBy(skipCount, maxResultCount); + + return await query.ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Users/UserRepository.cs b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Users/UserRepository.cs new file mode 100644 index 0000000..0e684b3 --- /dev/null +++ b/src/EventHub.EntityFrameworkCore/EntityFrameworkCore/Users/UserRepository.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using EventHub.Users; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Identity; + +namespace EventHub.EntityFrameworkCore.Users +{ + public class UserRepository : EfCoreRepository, IUserRepository + { + public UserRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task GetCountAsync(string username = null, CancellationToken cancellationToken = default) + { + return await (await GetQueryableAsync()) + .WhereIf(!string.IsNullOrWhiteSpace(username), user => user.UserName.ToLower().Contains(username.ToLower())) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public async Task> GetListAsync( + string sorting = null, + int skipCount = 0, + int maxResultCount = int.MaxValue, + string username = null, + CancellationToken cancellationToken = default + ) + { + return await (await GetQueryableAsync()) + .WhereIf(!string.IsNullOrWhiteSpace(username), user => user.UserName.ToLower().Contains(username.ToLower())) + .OrderBy(string.IsNullOrWhiteSpace(sorting) ? nameof(IdentityUser.CreationTime) : sorting) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + } +}