aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-11-14 03:25:02 +0100
committerivarlovlie <git@ivarlovlie.no>2022-11-14 03:25:02 +0100
commit76004edc90fad76a874ce4c4b51a86c5a4ec1de7 (patch)
tree4d0e64b6152cdf4a14a1d5c3c0e369dd8a635c4c
parent04153710828a9016feb82ebd01e8914b9bb59b4d (diff)
downloadgreatoffice-76004edc90fad76a874ce4c4b51a86c5a4ec1de7.tar.xz
greatoffice-76004edc90fad76a874ce4c4b51a86c5a4ec1de7.zip
refactor: Do swashbuckle setup of pagination props ourselves
-rw-r--r--code/api/src/IOL.GreatOffice.Api.csproj1
-rw-r--r--code/api/src/Program.cs2
-rw-r--r--code/api/src/Utilities/PaginationOperationFilter.cs39
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