diff --git a/src/JsonApiDotNetCore/Models/ResourceDefinition.cs b/src/JsonApiDotNetCore/Models/ResourceDefinition.cs index 07a71edaf2..2f8997992f 100644 --- a/src/JsonApiDotNetCore/Models/ResourceDefinition.cs +++ b/src/JsonApiDotNetCore/Models/ResourceDefinition.cs @@ -13,7 +13,7 @@ public interface IResourceDefinition List GetAllowedAttributes(); List GetAllowedRelationships(); object GetCustomQueryFilter(string key); - List<(AttrAttribute, SortDirection)> DefaultSort(); + List<(AttrAttribute Attribute, SortDirection SortDirection)> DefaultSort(); } /// @@ -146,14 +146,16 @@ public sealed class QueryFilters : Dictionary /// public virtual PropertySortOrder GetDefaultSortOrder() => null; - public List<(AttrAttribute, SortDirection)> DefaultSort() + public List<(AttrAttribute Attribute, SortDirection SortDirection)> DefaultSort() { var defaultSortOrder = GetDefaultSortOrder(); if (defaultSortOrder != null && defaultSortOrder.Count > 0) { - var order = new List<(AttrAttribute, SortDirection)>(); + var order = new List<(AttrAttribute Attribute, SortDirection SortDirection)>(); foreach (var sortProp in defaultSortOrder) - order.Add((_resourceGraph.GetAttributes(sortProp.Item1).Single(), sortProp.Item2)); + { + order.Add((_resourceGraph.GetAttributes(sortProp.Attribute).Single(), sortProp.SortDirection)); + } return order; } @@ -166,6 +168,6 @@ public sealed class QueryFilters : Dictionary /// method signature. /// See for usage details. /// - public sealed class PropertySortOrder : List<(Expression>, SortDirection)> { } + public sealed class PropertySortOrder : List<(Expression> Attribute, SortDirection SortDirection)> { } } } diff --git a/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs b/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs index e8f6a9d837..f1df933a70 100644 --- a/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs +++ b/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs @@ -29,11 +29,11 @@ public SortService(IResourceDefinitionProvider resourceDefinitionProvider, /// public List Get() { - if (_queries == null) + if (!_queries.Any()) { var requestResourceDefinition = _resourceDefinitionProvider.Get(_requestResource.ResourceType); if (requestResourceDefinition != null) - return requestResourceDefinition.DefaultSort()?.Select(d => BuildQueryContext(new SortQuery(d.Item1.PublicAttributeName, d.Item2))).ToList(); + return requestResourceDefinition.DefaultSort()?.Select(d => BuildQueryContext(new SortQuery(d.Attribute.PublicAttributeName, d.SortDirection))).ToList(); } return _queries.ToList(); } diff --git a/test/UnitTests/Models/ResourceDefinitionTests.cs b/test/UnitTests/Models/ResourceDefinitionTests.cs index 412af3c7f5..682d9e10d5 100644 --- a/test/UnitTests/Models/ResourceDefinitionTests.cs +++ b/test/UnitTests/Models/ResourceDefinitionTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using JsonApiDotNetCore.Builders; using JsonApiDotNetCore.Internal.Query; using JsonApiDotNetCore.Models; @@ -10,6 +11,25 @@ namespace UnitTests.Models { public sealed class ResourceDefinition_Scenario_Tests { + [Fact] + public void Property_Sort_Order_Uses_NewExpression() + { + // Arrange + var resource = new RequestFilteredResource(isAdmin: false); + + // Act + var sorts = resource.DefaultSort(); + + // Assert + Assert.Equal(2, sorts.Count); + + Assert.Equal(nameof(Model.Prop), sorts[0].Attribute.PropertyInfo.Name); + Assert.Equal(SortDirection.Ascending, sorts[0].SortDirection); + + Assert.Equal(nameof(Model.Password), sorts[1].Attribute.PropertyInfo.Name); + Assert.Equal(SortDirection.Descending, sorts[1].SortDirection); + } + [Fact] public void Request_Filter_Uses_Member_Expression() { @@ -63,7 +83,8 @@ public override QueryFilters GetQueryFilters() }; public override PropertySortOrder GetDefaultSortOrder() => new PropertySortOrder { - (t => t.Prop, SortDirection.Ascending) + (t => t.Prop, SortDirection.Ascending), + (t => t.Password, SortDirection.Descending) }; } }