diff --git a/JsonApiBugReport/JsonApiBugReport.csproj b/JsonApiBugReport/JsonApiBugReport.csproj index b4490c0..bcf9008 100644 --- a/JsonApiBugReport/JsonApiBugReport.csproj +++ b/JsonApiBugReport/JsonApiBugReport.csproj @@ -7,7 +7,7 @@ - 5.7.2-master-01199 + 5.7.2-master-01204 diff --git a/JsonApiBugReport/JsonApiBugReport.http b/JsonApiBugReport/JsonApiBugReport.http index 4d36ac6..2e1b9ed 100644 --- a/JsonApiBugReport/JsonApiBugReport.http +++ b/JsonApiBugReport/JsonApiBugReport.http @@ -8,10 +8,40 @@ GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units GET {{HostAddress}}/PriceGroup?include=products -### Sparse fieldset on subset of derived types +### Sparse fieldset on derived type Bundle + +GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&fields[Bundle]=isTaxable + +### Sparse fieldset on derived type Addon + +GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&fields[Addon]=trialDuration,allowsCustomEndDate + +### Sparse fieldset on subset of derived types [SLOW] GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&fields[Addon]=trialDuration,allowsCustomEndDate&fields[Bundle]=isTaxable ### Non-default page size on top-level include GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&page[size]=products:5 + +### Filter on type hierarchy + +GET {{HostAddress}}/PriceGroup?include=products&filter[products]=equals(id,'FFFFFFFF-0000-0000-0000-FFFFFFFFFFFF') + +### Filter after type hierarchy [HAS NEVER WORKED] + +GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&filter[products.unitGroup.units]=equals(id,'FFFFFFFF-0000-0000-0000-FFFFFFFFFFFF') + +### ProductBase +### : CommonProduct +### : ProductBundle = "Bundle" +### : StandaloneProduct +### : Product +### : ProductAddon = "Addon" +### : ProductGroup +### +### HasOne: UnitGroup +### HasMany: Units +### +### PriceGroup +### HasMany: Products diff --git a/JsonApiBugReport/Program.cs b/JsonApiBugReport/Program.cs index d7be839..2b0faed 100644 --- a/JsonApiBugReport/Program.cs +++ b/JsonApiBugReport/Program.cs @@ -21,8 +21,6 @@ { ["Logging:LogLevel:JsonApiDotNetCore.Repositories"] = "Debug" }); - - builder.Services.AddTransient(); } else { @@ -43,4 +41,4 @@ await app.RunDbMigrations(); -await app.RunAsync(); +await app.RunAsync(); \ No newline at end of file diff --git a/JsonApiBugReport/PruningQueryableBuilder.cs b/JsonApiBugReport/PruningQueryableBuilder.cs deleted file mode 100644 index 892d11f..0000000 --- a/JsonApiBugReport/PruningQueryableBuilder.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using AgileObjects.ReadableExpressions; -using JsonApiDotNetCore.Configuration; -using JsonApiDotNetCore.Queries; -using JsonApiDotNetCore.Queries.QueryableBuilding; -using Microsoft.Extensions.Logging; - -#nullable enable - -namespace JsonApiBugReport; - -public class PruningQueryableBuilder( - IIncludeClauseBuilder includeClauseBuilder, - IWhereClauseBuilder whereClauseBuilder, - IOrderClauseBuilder orderClauseBuilder, - ISkipTakeClauseBuilder skipTakeClauseBuilder, - ISelectClauseBuilder selectClauseBuilder, - IJsonApiOptions options, - ILogger logger) - : QueryableBuilder(includeClauseBuilder, whereClauseBuilder, orderClauseBuilder, skipTakeClauseBuilder, - selectClauseBuilder) -{ - public override Expression ApplyQuery(QueryLayer layer, QueryableBuilderContext context) - { - ArgumentNullException.ThrowIfNull(layer); - - Prune(layer); - - var expression = base.ApplyQuery(layer, context); - var text = expression.ToReadableString(); - - if (text.StartsWith("[Microsoft.EntityFrameworkCore.Query.EntityQueryRootExpression]")) - { - logger.LogInformation("Expression (after prune): {Expression}", text); - } - - return expression; - } - - private void Prune(QueryLayer queryLayer) - { - if (queryLayer.Selection != null) - { - foreach (var resourceType in queryLayer.Selection.GetResourceTypes().ToArray()) - { - var selectors = queryLayer.Selection.GetOrCreateSelectors(resourceType); - - foreach (var (field, subLayer) in selectors) - { - if (subLayer != null) - { - Prune(subLayer); - - if (IsDefault(subLayer)) - { - selectors.Remove(field); - } - } - } - } - - if (queryLayer.Selection.IsEmpty) - { - queryLayer.Selection = null; - } - } - } - - private bool IsDefault(QueryLayer queryLayer) - { - bool hasDefaultSort = queryLayer.Sort != null && queryLayer.Sort.ToString() == "id"; - - bool hasDefaultPagination = queryLayer.Pagination != null && - Equals(queryLayer.Pagination.PageNumber, PageNumber.ValueOne) && - Equals(queryLayer.Pagination.PageSize, options.DefaultPageSize); - - var isDefault = queryLayer.Include == null && queryLayer.Filter == null && - (queryLayer.Sort == null || hasDefaultSort) && - (queryLayer.Pagination == null || hasDefaultPagination) && queryLayer.Selection == null; - - return isDefault; - } -} \ No newline at end of file diff --git a/JsonApiBugReport/ResourceDefinitions/UnitDefinition.cs b/JsonApiBugReport/ResourceDefinitions/UnitDefinition.cs new file mode 100644 index 0000000..8e406ef --- /dev/null +++ b/JsonApiBugReport/ResourceDefinitions/UnitDefinition.cs @@ -0,0 +1,19 @@ +#nullable enable +using System; +using JsonApiBugReport.Data; +using JsonApiDotNetCore.Configuration; +using JsonApiDotNetCore.Queries.Expressions; +using JsonApiDotNetCore.Resources; + +namespace JsonApiBugReport.ResourceDefinitions; + +public sealed class UnitDefinition(IResourceGraph resourceGraph) + : JsonApiResourceDefinition(resourceGraph) +{ + private static readonly PaginationExpression NoPagination = new(PageNumber.ValueOne, null); + + public override PaginationExpression OnApplyPagination(PaginationExpression? existingPagination) + { + return NoPagination; + } +} \ No newline at end of file diff --git a/JsonApiBugReport/ResourceDefinitions/UnitGroupDefinition.cs b/JsonApiBugReport/ResourceDefinitions/UnitGroupDefinition.cs new file mode 100644 index 0000000..79c5c10 --- /dev/null +++ b/JsonApiBugReport/ResourceDefinitions/UnitGroupDefinition.cs @@ -0,0 +1,19 @@ +using JsonApiBugReport.Data; +using JsonApiDotNetCore.Configuration; +using JsonApiDotNetCore.Queries.Expressions; +using JsonApiDotNetCore.Resources; + +#nullable enable + +namespace JsonApiBugReport.ResourceDefinitions; + +public sealed class UnitGroupDefinition(IResourceGraph resourceGraph) + : JsonApiResourceDefinition(resourceGraph) +{ + private static readonly PaginationExpression NoPagination = new(PageNumber.ValueOne, null); + + public override PaginationExpression OnApplyPagination(PaginationExpression? existingPagination) + { + return NoPagination; + } +} \ No newline at end of file