diff --git a/.editorconfig b/.editorconfig index 60b15f5..767f78c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -49,8 +49,10 @@ csharp_style_expression_bodied_local_functions = true:refactoring dotnet_style_readonly_field = true:suggestion dotnet_code_quality_unused_parameters = non_public:suggestion +csharp_style_namespace_declarations = file_scoped:warning + # Naming: PascalCase for constants -dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = warning dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style dotnet_naming_symbols.constant_fields.applicable_kinds = field diff --git a/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs b/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs index 38e3141..c237f09 100644 --- a/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs +++ b/JsonApiToolkit/Extensions/ServiceCollectionExtensions.cs @@ -10,83 +10,82 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -namespace JsonApiToolkit.Extensions +namespace JsonApiToolkit.Extensions; + +/// +/// Extension methods for registering JsonApiToolkit services. +/// +public static class ServiceCollectionExtensions { /// - /// Extension methods for registering JsonApiToolkit services. + /// Registers JsonApiToolkit services with default options. + /// + public static IServiceCollection AddJsonApiToolkit(this IServiceCollection services) => + AddJsonApiToolkit(services, _ => { }); + + /// + /// Registers JsonApiToolkit services with custom options configuration. /// - public static class ServiceCollectionExtensions + /// The service collection. + /// Action to configure JsonApiOptions. + public static IServiceCollection AddJsonApiToolkit( + this IServiceCollection services, + Action configure + ) { - /// - /// Registers JsonApiToolkit services with default options. - /// - public static IServiceCollection AddJsonApiToolkit(this IServiceCollection services) => - AddJsonApiToolkit(services, _ => { }); + // Register options + services.Configure(configure); + // Configure JSON serialization options + services.Configure(options => + { + options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; + options.JsonSerializerOptions.DefaultIgnoreCondition = + JsonIgnoreCondition.WhenWritingNull; + options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; + }); - /// - /// Registers JsonApiToolkit services with custom options configuration. - /// - /// The service collection. - /// Action to configure JsonApiOptions. - public static IServiceCollection AddJsonApiToolkit( - this IServiceCollection services, - Action configure - ) + // Configure MVC formatters and filters + services.Configure(options => { - // Register options - services.Configure(configure); - // Configure JSON serialization options - services.Configure(options => - { - options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - options.JsonSerializerOptions.DefaultIgnoreCondition = - JsonIgnoreCondition.WhenWritingNull; - options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; - }); + SystemTextJsonOutputFormatter? jsonOutputFormatter = options + .OutputFormatters.OfType() + .FirstOrDefault(); - // Configure MVC formatters and filters - services.Configure(options => + if ( + jsonOutputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json") + == false + ) { - SystemTextJsonOutputFormatter? jsonOutputFormatter = options - .OutputFormatters.OfType() - .FirstOrDefault(); + jsonOutputFormatter.SupportedMediaTypes.Add("application/vnd.api+json"); + } - if ( - jsonOutputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json") - == false - ) - { - jsonOutputFormatter.SupportedMediaTypes.Add("application/vnd.api+json"); - } + SystemTextJsonInputFormatter? jsonInputFormatter = options + .InputFormatters.OfType() + .FirstOrDefault(); - SystemTextJsonInputFormatter? jsonInputFormatter = options - .InputFormatters.OfType() - .FirstOrDefault(); - - if ( - jsonInputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json") - == false - ) - { - jsonInputFormatter.SupportedMediaTypes.Add("application/vnd.api+json"); - } + if ( + jsonInputFormatter?.SupportedMediaTypes.Contains("application/vnd.api+json") + == false + ) + { + jsonInputFormatter.SupportedMediaTypes.Add("application/vnd.api+json"); + } - options.Filters.AddService(); - }); + options.Filters.AddService(); + }); - // Register filters - services.AddScoped(); - services.AddScoped(); + // Register filters + services.AddScoped(); + services.AddScoped(); - // Register query parser service - services.AddScoped(); + // Register query parser service + services.AddScoped(); - // Register include pattern validator for startup validation - services.TryAddEnumerable( - ServiceDescriptor.Transient() - ); + // Register include pattern validator for startup validation + services.TryAddEnumerable( + ServiceDescriptor.Transient() + ); - return services; - } + return services; } } diff --git a/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs b/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs index 0e7afe2..3866cd5 100644 --- a/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs +++ b/JsonApiToolkit/Filters/JsonApiContentTypeFilter.cs @@ -8,7 +8,7 @@ namespace JsonApiToolkit.Filters; /// public class JsonApiContentTypeFilter : IActionFilter { - private const string s_jsonApiMediaType = "application/vnd.api+json"; + private const string JsonApiMediaType = "application/vnd.api+json"; /// /// Called before the action executes. @@ -23,11 +23,11 @@ public void OnActionExecuted(ActionExecutedContext context) if (context.Result is ObjectResult objectResult) { objectResult.ContentTypes.Clear(); - objectResult.ContentTypes.Add(s_jsonApiMediaType); + objectResult.ContentTypes.Add(JsonApiMediaType); } else if (context.Result is StatusCodeResult) { - context.HttpContext.Response.ContentType = s_jsonApiMediaType; + context.HttpContext.Response.ContentType = JsonApiMediaType; } } } diff --git a/JsonApiToolkit/Parsing/JsonApiQueryParser.cs b/JsonApiToolkit/Parsing/JsonApiQueryParser.cs index d169b41..21351ca 100644 --- a/JsonApiToolkit/Parsing/JsonApiQueryParser.cs +++ b/JsonApiToolkit/Parsing/JsonApiQueryParser.cs @@ -13,7 +13,7 @@ namespace JsonApiToolkit.Parsing; /// public static class JsonApiQueryParser { - private const int MIN_PAGE_SIZE = 1; + private const int MinPageSize = 1; /// /// Minimum length for a valid filter key: "filter[x]" = 9 characters. @@ -97,7 +97,7 @@ public static QueryParameters Parse( hasPageNumber && int.TryParse(pageNumber, out int num) ? Math.Max(1, num) : 1, // Default to page 1 if not specified or invalid Size = hasPageSize && int.TryParse(pageSize, out int size) - ? Math.Clamp(size, MIN_PAGE_SIZE, options.MaxPageSize) + ? Math.Clamp(size, MinPageSize, options.MaxPageSize) : options.DefaultPageSize, // Use configured defaults }; }