From ae7cdf0f496b10ad769f4bccf6a2cd3fb53edb62 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Tue, 9 Apr 2024 00:12:27 +0200 Subject: [PATCH] [backend/swagger] Mark all non-nullable schema properties as required --- .../Core/Extensions/ServiceExtensions.cs | 2 +- .../Extensions/SwaggerGenOptionsExtensions.cs | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs index 0dcbbe42..038edccb 100644 --- a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs @@ -179,7 +179,7 @@ public static class ServiceExtensions Scheme = "bearer" }); - options.AddOperationFilters(); + options.AddFilters(); }); } diff --git a/Iceshrimp.Backend/Core/Extensions/SwaggerGenOptionsExtensions.cs b/Iceshrimp.Backend/Core/Extensions/SwaggerGenOptionsExtensions.cs index e70125ad..bf10b554 100644 --- a/Iceshrimp.Backend/Core/Extensions/SwaggerGenOptionsExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/SwaggerGenOptionsExtensions.cs @@ -12,13 +12,30 @@ namespace Iceshrimp.Backend.Core.Extensions; public static class SwaggerGenOptionsExtensions { - public static void AddOperationFilters(this SwaggerGenOptions options) + public static void AddFilters(this SwaggerGenOptions options) { + options.SchemaFilter(); options.OperationFilter(); options.OperationFilter(); options.DocInclusionPredicate(DocInclusionPredicate); } + [SuppressMessage("ReSharper", "ClassNeverInstantiated.Local", + Justification = "SwaggerGenOptions.SchemaFilter instantiates this class at runtime")] + private class RequireNonNullablePropertiesSchemaFilter : ISchemaFilter + { + public void Apply(OpenApiSchema model, SchemaFilterContext context) + { + var additionalRequiredProps = model.Properties + .Where(x => !x.Value.Nullable && !model.Required.Contains(x.Key)) + .Select(x => x.Key); + foreach (var propKey in additionalRequiredProps) + { + model.Required.Add(propKey); + } + } + } + private static bool DocInclusionPredicate(string docName, ApiDescription apiDesc) { if (!apiDesc.TryGetMethodInfo(out var methodInfo)) return false;