Skip to content

Source Generated registrations connecting Immediate.Handlers and minimal APIs

License

Notifications You must be signed in to change notification settings

ImmediatePlatform/Immediate.Apis

Repository files navigation

Immediate.Apis

NuGet GitHub release GitHub license GitHub issues GitHub issues-closed GitHub Actions

Immediate.Apis is a source generator for minimal APIs, for Immediate.Handlers handlers. Simply add a [MapGet] to the [Handler] class and an endpoint will automatically be added.

Examples

Installing Immediate.Apis

You can install Immediate.Apis with NuGet:

Install-Package Immediate.Apis

Or via the .NET Core command line interface:

dotnet add package Immediate.Apis

Either commands, from Package Manager Console or .NET Core CLI, will download and install Immediate.Handlers.

Using Immediate.Apis

Creating an Endpoint

Create a Handler and an endpoint by adding the following code:

[Handler]
[MapGet("/users")]
public static partial class GetUsersQuery
{
    public record Query;

    private static ValueTask<IEnumerable<User>> HandleAsync(
        Query _,
        UsersService usersService,
        CancellationToken token)
    {
        return usersService.GetUsers();
    }
}

Registering the endpoints

In your Program.cs, add a call to app.MapXxxEndpoints(), where Xxx is the shortened form of the project name.

  • For a project named Web, it will be app.MapWebEndpoints()
  • For a project named Application.Web, it will be app.MapApplicationWebEndpoints()

Customizing the endpoints

Authorization

The [AllowAnonymous] and [Authorized("Policy")] attributes are supported and will be applied to the endpoint.

[Handler]
[MapGet("/users")]
[AllowAnonymous]
public static partial class GetUsersQuery
{
    public record Query;

    private static ValueTask<IEnumerable<User>> HandleAsync(
        Query _,
        UsersService usersService,
        CancellationToken token)
    {
        return usersService.GetUsers();
    }
}

Additional Customization

Additional customization of the endpoint registration can be done by adding a CustomizeEndpoint method.

[Handler]
[MapGet("/users")]
[Authorize(Policies.UserManagement)]
public static partial class GetUsersQuery
{
    internal static void CustomizeGetFeaturesEndpoint(IEndpointConventionBuilder endpoint)
        => endpoint
            .Produces<IEnumerable<User>>(StatusCodes.Status200OK)
            .ProducesValidationProblem()
            .ProducesProblem(StatusCodes.Status500InternalServerError)
            .WithTags(nameof(User));

    public record Query;

    private static ValueTask<IEnumerable<User>> HandleAsync(
        Query _,
        UsersService usersService,
        CancellationToken token)
    {
        return usersService.GetUsers();
    }
}