diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2022-11-14 03:25:02 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2022-11-14 03:25:02 +0100 |
| commit | 76004edc90fad76a874ce4c4b51a86c5a4ec1de7 (patch) | |
| tree | 4d0e64b6152cdf4a14a1d5c3c0e369dd8a635c4c /code/api | |
| parent | 04153710828a9016feb82ebd01e8914b9bb59b4d (diff) | |
| download | greatoffice-76004edc90fad76a874ce4c4b51a86c5a4ec1de7.tar.xz greatoffice-76004edc90fad76a874ce4c4b51a86c5a4ec1de7.zip | |
refactor: Do swashbuckle setup of pagination props ourselves
Diffstat (limited to 'code/api')
| -rw-r--r-- | code/api/src/IOL.GreatOffice.Api.csproj | 1 | ||||
| -rw-r--r-- | code/api/src/Program.cs | 2 | ||||
| -rw-r--r-- | code/api/src/Utilities/PaginationOperationFilter.cs | 39 |
3 files changed, 40 insertions, 2 deletions
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 @@ <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="MR.AspNetCore.Pagination" Version="2.0.0" /> - <PackageReference Include="MR.AspNetCore.Pagination.Swashbuckle" Version="2.0.0" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.0" /> <PackageReference Include="Quartz.Extensions.Hosting" Version="3.5.0" /> <PackageReference Include="Serilog.AspNetCore" Version="6.0.1" /> 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<SwaggerDefaultValues>(); + options.OperationFilter<PaginationOperationFilter>(); 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 = 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 |
