static void WithLocalSummary(RouteHandlerBuilder builder) { builder.WithOpenApi(operation => { operation.Summary += $" | Local Summary | 200 Status Response Content-Type: {operation.Responses["200"].Content.Keys.Single()}"; return(operation); }); }
public void UsesTagsFromMultipleCallsToWithTags() { var testBuilder = new TestEndpointConventionBuilder(); var routeHandlerBuilder = new RouteHandlerBuilder(new[] { testBuilder }); routeHandlerBuilder .WithTags("A") .WithTags("B"); var operation = GetOpenApiOperation(() => { }, additionalMetadata: testBuilder.Metadata.ToArray()); Assert.Collection(operation.Tags, tag => Assert.Equal("A", tag.Name), tag => Assert.Equal("B", tag.Name)); }
/// <summary> /// Adds an OpenAPI annotation to <see cref="Endpoint.Metadata" /> associated /// with the current endpoint and modifies it with the given <paramref name="configureOperation"/>. /// </summary> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <param name="configureOperation">An <see cref="Func{T, TResult}"/> that returns a new OpenAPI annotation given a generated operation.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns> public static RouteHandlerBuilder WithOpenApi(this RouteHandlerBuilder builder, Func <OpenApiOperation, OpenApiOperation> configureOperation) { builder.Add(endpointBuilder => { if (endpointBuilder is RouteEndpointBuilder routeEndpointBuilder) { var openApiOperation = GetOperationForEndpoint(routeEndpointBuilder); if (openApiOperation != null) { routeEndpointBuilder.Metadata.Add(configureOperation(openApiOperation)); } } ; }); return(builder); }
/// <summary> /// Register a filter given a delegate representing the filter factory. /// </summary> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <param name="filterFactory">A <see cref="Delegate"/> representing the logic for constructing the filter.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, Func <RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate> filterFactory) { builder.RouteHandlerFilterFactories.Add(filterFactory); return(builder); }
/// <summary> /// Registers a filter given a delegate onto the route handler. /// </summary> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <param name="routeHandlerFilter">A <see cref="Delegate"/> representing the core logic of the filter.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, Func <RouteHandlerInvocationContext, RouteHandlerFilterDelegate, ValueTask <object?> > routeHandlerFilter) { builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) => (context) => routeHandlerFilter(context, next)); return(builder); }
/// <summary> /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler. /// </summary> /// <typeparam name="TFilterType">The type of the <see cref="IRouteHandlerFilter"/> to register.</typeparam> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter <[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteHandlerBuilder builder) where TFilterType : IRouteHandlerFilter { // We call `CreateFactory` twice here since the `CreateFactory` API does not support optional arguments. // See https://github.com/dotnet/runtime/issues/67309 for more info. ObjectFactory filterFactory; try { filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), new[] { typeof(RouteHandlerContext) }); } catch (InvalidOperationException) { filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), Type.EmptyTypes); } builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) => { var invokeArguments = new[] { routeHandlerContext }; return((context) => { var filter = (IRouteHandlerFilter)filterFactory.Invoke(context.HttpContext.RequestServices, invokeArguments); return filter.InvokeAsync(context, next); }); }); return(builder); }
/// <summary> /// Registers a filter onto the route handler. /// </summary> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <param name="filter">The <see cref="IRouteHandlerFilter"/> to register.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, IRouteHandlerFilter filter) { builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) => (context) => filter.InvokeAsync(context, next)); return(builder); }
/// <summary> /// Registers a filter given a delegate onto the route handler. /// </summary> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <param name="routeHandlerFilter">A <see cref="Delegate"/> representing the core logic of the filter.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, Func <RouteHandlerFilterContext, Func <RouteHandlerFilterContext, ValueTask <object?> >, ValueTask <object?> > routeHandlerFilter) { builder.RouteHandlerFilters.Add(new DelegateRouteHandlerFilter(routeHandlerFilter)); return(builder); }
/// <summary> /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler. /// </summary> /// <typeparam name="TFilterType">The type of the <see cref="IRouteHandlerFilter"/> to register.</typeparam> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter <[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteHandlerBuilder builder) where TFilterType : IRouteHandlerFilter, new() { builder.RouteHandlerFilters.Add(new TFilterType()); return(builder); }
/// <summary> /// Registers a filter onto the route handler. /// </summary> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <param name="filter">The <see cref="IRouteHandlerFilter"/> to register.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, IRouteHandlerFilter filter) { builder.RouteHandlerFilters.Add(filter); return(builder); }
public static RouteHandlerBuilder AddEndpointFilter <[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteHandlerBuilder builder) where TFilterType : IEndpointFilter { // We have a RouteHandlerBuiler and GroupRouteBuilder-specific AddFilter methods for convenience so you don't have to specify both arguments most the time. return(builder.AddEndpointFilter <RouteHandlerBuilder, TFilterType>()); }
/// <summary> /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler. /// </summary> /// <typeparam name="TFilterType">The type of the <see cref="IRouteHandlerFilter"/> to register.</typeparam> /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param> /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns> public static RouteHandlerBuilder AddFilter <[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteHandlerBuilder builder) where TFilterType : IRouteHandlerFilter { var filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), Type.EmptyTypes); builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) => (context) => { var filter = (IRouteHandlerFilter)filterFactory.Invoke(context.HttpContext.RequestServices, Array.Empty <object>()); return(filter.InvokeAsync(context, next)); }); return(builder); }
static void SpecificExclude(RouteHandlerBuilder builder) => builder.ExcludeFromDescription();
private static void SetDefaultOptions(RouteHandlerBuilder routeHandlerBuilder, string operationSummary, string tag) { routeHandlerBuilder.WithMetadata(new OperationDescriptionAttribute(operationSummary, null)); routeHandlerBuilder.WithTags(tag); routeHandlerBuilder.RequireAuthorization(); }