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);
     });
 }
Exemplo n.º 2
0
    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));
    }
Exemplo n.º 3
0
 /// <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);
 }
Exemplo n.º 4
0
 /// <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);
 }
Exemplo n.º 5
0
 /// <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);
 }
Exemplo n.º 6
0
    /// <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);
    }
Exemplo n.º 7
0
 /// <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);
 }
Exemplo n.º 8
0
 /// <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);
 }
Exemplo n.º 9
0
 /// <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);
 }
Exemplo n.º 10
0
 /// <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);
 }
Exemplo n.º 11
0
 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>());
 }
Exemplo n.º 12
0
    /// <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);
    }
Exemplo n.º 13
0
 static void SpecificExclude(RouteHandlerBuilder builder) => builder.ExcludeFromDescription();
Exemplo n.º 14
0
 private static void SetDefaultOptions(RouteHandlerBuilder routeHandlerBuilder, string operationSummary, string tag)
 {
     routeHandlerBuilder.WithMetadata(new OperationDescriptionAttribute(operationSummary, null));
     routeHandlerBuilder.WithTags(tag);
     routeHandlerBuilder.RequireAuthorization();
 }