using PoweredSoft.CQRS.DynamicQuery.Abstractions; using PoweredSoft.DynamicQuery.Core; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace PoweredSoft.CQRS.DynamicQuery { public class DynamicQueryHandler : DynamicQueryHandlerBase, PoweredSoft.CQRS.Abstractions.IQueryHandler, IQueryExecutionResult> where TSource : class where TDestination : class { public DynamicQueryHandler(IQueryHandlerAsync queryHandlerAsync, IEnumerable> queryableProviders, IEnumerable> alterQueryableServices, IServiceProvider serviceProvider) : base(queryHandlerAsync, queryableProviders, alterQueryableServices, serviceProvider) { } public Task> HandleAsync(IDynamicQuery query, CancellationToken cancellationToken = default) { return ProcessQueryAsync(query, cancellationToken); } } public class DynamicQueryHandler : DynamicQueryHandlerBase, PoweredSoft.CQRS.Abstractions.IQueryHandler, IQueryExecutionResult> where TSource : class where TDestination : class where TParams : class { private readonly IEnumerable> alterQueryableServicesWithParams; public DynamicQueryHandler(IQueryHandlerAsync queryHandlerAsync, IEnumerable> queryableProviders, IEnumerable> alterQueryableServices, IEnumerable> alterQueryableServicesWithParams, IServiceProvider serviceProvider) : base(queryHandlerAsync, queryableProviders, alterQueryableServices, serviceProvider) { this.alterQueryableServicesWithParams = alterQueryableServicesWithParams; } protected override async Task> AlterSourceAsync(IQueryable source, IDynamicQuery query, CancellationToken cancellationToken) { source = await base.AlterSourceAsync(source, query, cancellationToken); if (query is IDynamicQueryParams withParams) { foreach (var it in alterQueryableServicesWithParams) source = await it.AlterQueryableAsync(source, withParams, cancellationToken); } return source; } public Task> HandleAsync(IDynamicQuery query, CancellationToken cancellationToken = default) { return this.ProcessQueryAsync(query, cancellationToken); } } }