From 76004edc90fad76a874ce4c4b51a86c5a4ec1de7 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Mon, 14 Nov 2022 09:25:02 +0700 Subject: refactor: Do swashbuckle setup of pagination props ourselves --- code/api/src/IOL.GreatOffice.Api.csproj | 1 - code/api/src/Program.cs | 2 +- .../api/src/Utilities/PaginationOperationFilter.cs | 39 ++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 code/api/src/Utilities/PaginationOperationFilter.cs (limited to 'code/api') diff --git a/code/api/src/IOL.GreatOffice.Api.csproj b/code/api/src/IOL.GreatOffice.Api.csproj index 38f0799..287aef8 100644 --- a/code/api/src/IOL.GreatOffice.Api.csproj +++ b/code/api/src/IOL.GreatOffice.Api.csproj @@ -22,7 +22,6 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/code/api/src/Program.cs b/code/api/src/Program.cs index 21c0a7d..e56c123 100644 --- a/code/api/src/Program.cs +++ b/code/api/src/Program.cs @@ -150,8 +150,8 @@ public static class Program builder.Services.AddSwaggerGen(options => { options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "IOL.GreatOffice.Api.xml")); options.UseApiEndpoints(); - options.ConfigurePagination(); options.OperationFilter(); + options.OperationFilter(); options.SwaggerDoc(ApiSpecV1.Document.VersionName, ApiSpecV1.Document.OpenApiInfo); options.AddSecurityDefinition("Basic", new OpenApiSecurityScheme { diff --git a/code/api/src/Utilities/PaginationOperationFilter.cs b/code/api/src/Utilities/PaginationOperationFilter.cs new file mode 100644 index 0000000..ad02a3d --- /dev/null +++ b/code/api/src/Utilities/PaginationOperationFilter.cs @@ -0,0 +1,39 @@ +using Microsoft.Extensions.Options; +using MR.AspNetCore.Pagination; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace IOL.GreatOffice.Api.Utilities; + +public class PaginationOperationFilter : IOperationFilter +{ + private readonly PaginationOptions _paginationOptions; + + public PaginationOperationFilter( + IOptions paginationOptions) { + _paginationOptions = paginationOptions.Value; + } + + public void Apply(OpenApiOperation operation, OperationFilterContext context) { + var boolSchema = context.SchemaGenerator.GenerateSchema(typeof(bool), context.SchemaRepository); + var intSchema = context.SchemaGenerator.GenerateSchema(typeof(int), context.SchemaRepository); + + if (PaginationActionDetector.IsKeysetPaginationResultAction(context.MethodInfo, out _)) { + CreateParameter(_paginationOptions.FirstQueryParameterName, "true if you want the first page", boolSchema); + CreateParameter(_paginationOptions.BeforeQueryParameterName, "Id of the reference entity you want results before"); + CreateParameter(_paginationOptions.AfterQueryParameterName, "Id of the reference entity you want results after"); + CreateParameter(_paginationOptions.LastQueryParameterName, "true if you want the last page", boolSchema); + } else if (PaginationActionDetector.IsOffsetPaginationResultAction(context.MethodInfo, out _)) { + CreateParameter(_paginationOptions.PageQueryParameterName, "The page", intSchema); + } + + void CreateParameter(string name, string description, OpenApiSchema schema = null) { + operation.Parameters.Add(new OpenApiParameter { + Required = false, + In = ParameterLocation.Query, + Name = name, + Description = description, + Schema = schema, + }); + } + } +} \ No newline at end of file -- cgit v1.3