diff --git a/src/VerticalSliceArchitectureTemplate/Common/Features/OpenApiConvenienceExtensions.cs b/src/VerticalSliceArchitectureTemplate/Common/Features/OpenApiConvenienceExtensions.cs deleted file mode 100644 index d0955dc..0000000 --- a/src/VerticalSliceArchitectureTemplate/Common/Features/OpenApiConvenienceExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace VerticalSliceArchitectureTemplate.Common.Features; - -public static class OpenApiConvenienceExtensions -{ - /// - /// Used for GET endpoints that return one or more items. - /// - public static RouteHandlerBuilder ProducesGet(this RouteHandlerBuilder builder) => - builder - .Produces() - .Produces(StatusCodes.Status404NotFound) - .ProducesProblem(StatusCodes.Status500InternalServerError); - - public static RouteHandlerBuilder MapGetWithOpenApi( - this IEndpointRouteBuilder endpoints, - string pattern, - Delegate handler) => - endpoints.MapGet(pattern, handler) - .ProducesGet(); - - /// - /// Used for POST endpoints that creates a single item. - /// - public static RouteHandlerBuilder ProducesPost(this RouteHandlerBuilder builder) => - builder - .ProducesValidationProblem() - .ProducesProblem(StatusCodes.Status500InternalServerError) - .Produces(StatusCodes.Status201Created); - - public static RouteHandlerBuilder MapPostWithOpenApi( - this IEndpointRouteBuilder endpoints, - string pattern, - Delegate handler) => - endpoints.MapPost(pattern, handler) - .ProducesPost(); - - /// - /// Used for PUT endpoints that updates a single item. - /// - public static RouteHandlerBuilder ProducesPut(this RouteHandlerBuilder builder) => - builder - .Produces(StatusCodes.Status204NoContent) - .Produces(StatusCodes.Status404NotFound) - .ProducesValidationProblem() - .ProducesProblem(StatusCodes.Status500InternalServerError); - - public static RouteHandlerBuilder MapPutWithOpenApi( - this IEndpointRouteBuilder endpoints, - string pattern, - Delegate handler) => - endpoints.MapPut(pattern, handler) - .ProducesPut(); - - /// - /// Used for DELETE endpoints that deletes a single item. - /// - public static RouteHandlerBuilder ProducesDelete(this RouteHandlerBuilder builder) => - builder - .Produces(StatusCodes.Status204NoContent) - .Produces(StatusCodes.Status404NotFound) - .ProducesValidationProblem() - .ProducesProblem(StatusCodes.Status500InternalServerError); - - public static RouteHandlerBuilder MapDeleteWithOpenApi( - this IEndpointRouteBuilder endpoints, - string pattern, - Delegate handler) => - endpoints.MapDelete(pattern, handler) - .ProducesDelete(); -} \ No newline at end of file diff --git a/src/VerticalSliceArchitectureTemplate/Features/Todos/WebApi/TodoEndpoints.cs b/src/VerticalSliceArchitectureTemplate/Features/Todos/WebApi/TodoEndpoints.cs index 4216de3..d9d4d17 100644 --- a/src/VerticalSliceArchitectureTemplate/Features/Todos/WebApi/TodoEndpoints.cs +++ b/src/VerticalSliceArchitectureTemplate/Features/Todos/WebApi/TodoEndpoints.cs @@ -12,42 +12,67 @@ public static void MapEndpoints(IEndpointRouteBuilder endpoints) var group = endpoints.MapGroup("/todos") .WithTags(nameof(Todo)); - group.MapPostWithOpenApi(string.Empty, - async (CreateTodoCommand command, ISender sender, CancellationToken cancellationToken) => - { - var id = await sender.Send(command, cancellationToken); - return Results.Created($"/todos/{id}", id); - }); - - group.MapPutWithOpenApi("/{id:guid}", + group.MapPost("", + async (CreateTodoCommand command, ISender sender, CancellationToken cancellationToken) => + { + var id = await sender.Send(command, cancellationToken); + return Results.Created($"/todos/{id}", id); + }) + .Produces(StatusCodes.Status201Created) + .ProducesValidationProblem() + .ProducesProblem(StatusCodes.Status500InternalServerError) + .WithTags(nameof(Todo)); + + group.MapPut("/{id:guid}", async (Guid id, UpdateTodoCommand command, ISender sender, CancellationToken cancellationToken) => { await sender.Send(command with { Id = id }, cancellationToken); return Results.NoContent(); }) + .Produces(StatusCodes.Status204NoContent) + .Produces(StatusCodes.Status404NotFound) + .ProducesValidationProblem() + .ProducesProblem(StatusCodes.Status500InternalServerError) .WithTags(nameof(Todo)); - group.MapPutWithOpenApi("/{id:guid}/complete", + group.MapPut("/{id:guid}/complete", async (Guid id, ISender sender, CancellationToken cancellationToken) => { await sender.Send(new CompleteTodoCommand(id), cancellationToken); return Results.NoContent(); }) + .Produces(StatusCodes.Status204NoContent) + .Produces(StatusCodes.Status404NotFound) + .ProducesValidationProblem() + .ProducesProblem(StatusCodes.Status500InternalServerError) .WithTags(nameof(Todo)); - group.MapDeleteWithOpenApi("/{id:guid}", - async (Guid id, ISender sender, CancellationToken cancellationToken) => - { - await sender.Send(new DeleteTodoCommand(id), cancellationToken); - return Results.NoContent(); - }); + group.MapDelete("/{id:guid}", + async (Guid id, ISender sender, CancellationToken cancellationToken) => + { + await sender.Send(new DeleteTodoCommand(id), cancellationToken); + return Results.NoContent(); + }) + .Produces(StatusCodes.Status204NoContent) + .Produces(StatusCodes.Status404NotFound) + .ProducesValidationProblem() + .ProducesProblem(StatusCodes.Status500InternalServerError) + .WithTags(nameof(Todo)); - group.MapGetWithOpenApi("/{id:guid}", - (Guid id, ISender sender, CancellationToken cancellationToken) - => sender.Send(new GetTodoQuery(id), cancellationToken)); + group.MapGet("/{id:guid}", + (Guid id, ISender sender, CancellationToken cancellationToken) + => sender.Send(new GetTodoQuery(id), cancellationToken)) + .Produces() + .Produces(StatusCodes.Status404NotFound) + .ProducesProblem(StatusCodes.Status500InternalServerError) + .WithTags(nameof(Todo)); - group.MapGetWithOpenApi>(string.Empty, - (bool? isCompleted, ISender sender, CancellationToken cancellationToken) - => sender.Send(new GetAllTodosQuery(isCompleted), cancellationToken)); + group.MapGet("", + (bool? isCompleted, ISender sender, CancellationToken cancellationToken) + => sender.Send(new GetAllTodosQuery(isCompleted), cancellationToken)) + .Produces>() + .Produces(StatusCodes.Status404NotFound) + .ProducesProblem(StatusCodes.Status500InternalServerError) + .WithTags(nameof(Todo)); } } \ No newline at end of file