using System; using System.Linq; using System.Reflection; using Microsoft.AspNetCore.Builder; using Svrnty.CQRS.Configuration; namespace Svrnty.CQRS.MinimalApi; /// /// Extension methods for CqrsBuilder to add MinimalApi support /// public static class CqrsBuilderExtensions { /// /// Adds MinimalApi support to the CQRS pipeline /// /// The CQRS builder /// Optional configuration for MinimalApi endpoints /// The CQRS builder for method chaining public static CqrsBuilder AddMinimalApi(this CqrsBuilder builder, Action? configure = null) { var options = new MinimalApiCqrsOptions(); configure?.Invoke(options); builder.Configuration.SetConfiguration(options); // Register mapping callback for automatic endpoint mapping builder.Configuration.AddMappingCallback(app => { if (app is not WebApplication webApp) return; var config = webApp.Services.GetService(typeof(CqrsConfiguration)) as CqrsConfiguration; var minimalApiOptions = config?.GetConfiguration(); if (minimalApiOptions == null) return; // Map commands if enabled if (minimalApiOptions.MapCommands) { webApp.MapSvrntyCommands(minimalApiOptions.CommandRoutePrefix); } // Map queries if enabled if (minimalApiOptions.MapQueries) { webApp.MapSvrntyQueries(minimalApiOptions.QueryRoutePrefix); } // Map dynamic queries if enabled (automatically included) if (minimalApiOptions.MapDynamicQueries) { // Try to find the DynamicQuery.MinimalApi assembly and call MapSvrntyDynamicQueries try { // Force load the assembly by looking for a known type from it var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var dynamicQueryAssembly = assemblies.FirstOrDefault(a => a.GetName().Name == "Svrnty.CQRS.DynamicQuery.MinimalApi"); if (dynamicQueryAssembly == null) { // Try to load it by finding the type var extensionType = Type.GetType("Svrnty.CQRS.DynamicQuery.MinimalApi.EndpointRouteBuilderExtensions, Svrnty.CQRS.DynamicQuery.MinimalApi"); if (extensionType != null) { dynamicQueryAssembly = extensionType.Assembly; } } if (dynamicQueryAssembly != null) { var extensionType = dynamicQueryAssembly.GetType("Svrnty.CQRS.DynamicQuery.MinimalApi.EndpointRouteBuilderExtensions"); if (extensionType != null) { var mapMethod = extensionType.GetMethod("MapSvrntyDynamicQueries", BindingFlags.Public | BindingFlags.Static); if (mapMethod != null) { mapMethod.Invoke(null, new object[] { webApp, minimalApiOptions.DynamicQueryRoutePrefix }); } } } } catch (Exception ex) { Console.WriteLine($"Warning: Could not map dynamic queries: {ex.Message}"); } } }); return builder; } }