private static OpenApiOperation?GetOperationForEndpoint(RouteEndpointBuilder routeEndpointBuilder) { var pattern = routeEndpointBuilder.RoutePattern; var metadata = new EndpointMetadataCollection(routeEndpointBuilder.Metadata); var methodInfo = metadata.OfType <MethodInfo>().SingleOrDefault(); var serviceProvider = routeEndpointBuilder.ServiceProvider; if (methodInfo == null || serviceProvider == null) { return(null); } var hostEnvironment = serviceProvider.GetService <IHostEnvironment>(); var serviceProviderIsService = serviceProvider.GetService <IServiceProviderIsService>(); var generator = new OpenApiGenerator(hostEnvironment, serviceProviderIsService); return(generator.GetOpenApiOperation(methodInfo, metadata, pattern)); }
private static void AddAndConfigureOperationForEndpoint(EndpointBuilder endpointBuilder, Func<OpenApiOperation, OpenApiOperation>? configure = null) { foreach (var item in endpointBuilder.Metadata) { if (item is OpenApiOperation existingOperation) { if (configure is not null) { var configuredOperation = configure(existingOperation); if (!ReferenceEquals(configuredOperation, existingOperation)) { endpointBuilder.Metadata.Remove(existingOperation); // The only way configureOperation could be null here is if configureOperation violated it's signature and returned null. // We could throw or something, removing the previous metadata seems fine. if (configuredOperation is not null) { endpointBuilder.Metadata.Add(configuredOperation); } } } return; } } // We cannot generate an OpenApiOperation without routeEndpointBuilder.RoutePattern. if (endpointBuilder is not RouteEndpointBuilder routeEndpointBuilder) { return; } var pattern = routeEndpointBuilder.RoutePattern; var metadata = new EndpointMetadataCollection(routeEndpointBuilder.Metadata); var methodInfo = metadata.OfType<MethodInfo>().SingleOrDefault(); if (methodInfo is null) { return; } var applicationServices = routeEndpointBuilder.ApplicationServices; var hostEnvironment = applicationServices.GetService<IHostEnvironment>(); var serviceProviderIsService = applicationServices.GetService<IServiceProviderIsService>(); var generator = new OpenApiGenerator(hostEnvironment, serviceProviderIsService); var newOperation = generator.GetOpenApiOperation(methodInfo, metadata, pattern); if (newOperation is not null) { if (configure is not null) { newOperation = configure(newOperation); } if (newOperation is not null) { routeEndpointBuilder.Metadata.Add(newOperation); } } }