using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Reflection; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.Extensions.DependencyInjection; using OpenHarbor.CQRS.Abstractions.Discovery; using OpenHarbor.CQRS.AspNetCore.Abstractions.Attributes; using OpenHarbor.CQRS.DynamicQuery.Discover; namespace OpenHarbor.CQRS.DynamicQuery.AspNetCore.Mvc; public class DynamicQueryControllerFeatureProvider(ServiceProvider serviceProvider) : IApplicationFeatureProvider { /** * public void PopulateFeature(IEnumerable parts, ControllerFeature feature) { var queryDiscovery = this.serviceProvider.GetRequiredService(); foreach (var f in queryDiscovery.GetQueries()) { var ignoreAttribute = f.QueryType.GetCustomAttribute(); if (ignoreAttribute != null) continue; if (f.Category != "DynamicQuery") continue; if (f is DynamicQueryMeta dynamicQueryMeta) { if (dynamicQueryMeta.ParamsType == null) { var controllerType = typeof(DynamicQueryController<,,>).MakeGenericType(f.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType); var controllerTypeInfo = controllerType.GetTypeInfo(); feature.Controllers.Add(controllerTypeInfo); } else { var controllerType = typeof(DynamicQueryController<,,,>).MakeGenericType(f.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType, dynamicQueryMeta.ParamsType); var controllerTypeInfo = controllerType.GetTypeInfo(); feature.Controllers.Add(controllerTypeInfo); } } } */ public void PopulateFeature(IEnumerable parts, ControllerFeature feature) { var queryDiscovery = serviceProvider.GetRequiredService(); foreach (var queryMeta in queryDiscovery.GetQueries()) { var ignoreAttribute = queryMeta.QueryType.GetCustomAttribute(); if (ignoreAttribute != null) continue; if (queryMeta.Category != "DynamicQuery") continue; if (queryMeta is DynamicQueryMeta dynamicQueryMeta) { // todo: add better error output for the user if (dynamicQueryMeta.ParamsType == null) { // todo: not aot friendly var controllerType = typeof(DynamicQueryController<,,>).MakeGenericType(queryMeta.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType); var controllerTypeInfo = controllerType.GetTypeInfo(); feature.Controllers.Add(controllerTypeInfo); } else { // todo: not aot friendly var controllerType = typeof(DynamicQueryController<,,,>).MakeGenericType(queryMeta.QueryType, dynamicQueryMeta.SourceType, dynamicQueryMeta.DestinationType, dynamicQueryMeta.ParamsType); var controllerTypeInfo = controllerType.GetTypeInfo(); feature.Controllers.Add(controllerTypeInfo); } } } } }