Skip to content

Commit b2a5213

Browse files
author
Chris Santero
committed
allow specifying includes and metadata for queryable builder
1 parent 2e54d6a commit b2a5213

4 files changed

Lines changed: 28 additions & 18 deletions

File tree

JSONAPI.Tests/Documents/Builders/FallbackDocumentBuilderTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ public async Task Creates_resource_collection_document_for_queryables()
7575

7676
var mockQueryableDocumentBuilder = new Mock<IQueryableResourceCollectionDocumentBuilder>(MockBehavior.Strict);
7777
mockQueryableDocumentBuilder
78-
.Setup(b => b.BuildDocument(items, request, cancellationTokenSource.Token))
79-
.Returns(() => Task.FromResult(mockDocument.Object));
78+
.Setup(b => b.BuildDocument(items, request, cancellationTokenSource.Token, null))
79+
.Returns(Task.FromResult(mockDocument.Object));
8080

8181
var mockResourceCollectionDocumentBuilder = new Mock<IResourceCollectionDocumentBuilder>(MockBehavior.Strict);
8282

JSONAPI/Documents/Builders/DefaultQueryableResourceCollectionDocumentBuilder.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
23
using System.Net.Http;
34
using System.Threading;
45
using System.Threading.Tasks;
56
using JSONAPI.ActionFilters;
67
using JSONAPI.Http;
8+
using JSONAPI.Json;
79
using JSONAPI.QueryableTransformers;
810

911
namespace JSONAPI.Documents.Builders
@@ -39,24 +41,29 @@ public DefaultQueryableResourceCollectionDocumentBuilder(
3941
_baseUrlService = baseUrlService;
4042
}
4143

42-
public async Task<IResourceCollectionDocument> BuildDocument<T>(IQueryable<T> query, HttpRequestMessage request, CancellationToken cancellationToken)
44+
public async Task<IResourceCollectionDocument> BuildDocument<T>(IQueryable<T> query, HttpRequestMessage request, CancellationToken cancellationToken,
45+
string[] includes = null)
4346
{
44-
if (_filteringTransformer != null)
45-
query = _filteringTransformer.Filter(query, request);
47+
var filteredQuery = _filteringTransformer.Filter(query, request);
48+
var sortedQuery = _sortingTransformer.Sort(filteredQuery, request);
4649

47-
if (_sortingTransformer != null)
48-
query = _sortingTransformer.Sort(query, request);
49-
50-
if (_paginationTransformer != null)
51-
{
52-
var paginationResults = _paginationTransformer.ApplyPagination(query, request);
53-
query = paginationResults.PagedQuery;
54-
}
50+
var paginationResults = _paginationTransformer.ApplyPagination(sortedQuery, request);
51+
query = paginationResults.PagedQuery;
5552

5653
var linkBaseUrl = _baseUrlService.GetBaseUrl(request);
5754

5855
var results = await _enumerationTransformer.Enumerate(query, cancellationToken);
59-
return _resourceCollectionDocumentBuilder.BuildDocument(results, linkBaseUrl, null, null);
56+
var metadata = await GetDocumentMetadata(query, filteredQuery, sortedQuery, paginationResults, cancellationToken);
57+
return _resourceCollectionDocumentBuilder.BuildDocument(results, linkBaseUrl, includes, metadata);
58+
}
59+
60+
/// <summary>
61+
/// Returns the metadata that should be sent with this document.
62+
/// </summary>
63+
protected virtual Task<IMetadata> GetDocumentMetadata<T>(IQueryable<T> originalQuery, IQueryable<T> filteredQuery, IOrderedQueryable<T> sortedQuery,
64+
IPaginationTransformResult<T> paginationResult, CancellationToken cancellationToken)
65+
{
66+
return Task.FromResult((IMetadata)null);
6067
}
6168
}
6269
}

JSONAPI/Documents/Builders/FallbackDocumentBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public async Task<IJsonApiDocument> BuildDocument(object obj, HttpRequestMessage
6161
_openBuildDocumentFromQueryableMethod.Value.MakeGenericMethod(queryableElementType);
6262

6363
dynamic materializedQueryTask = buildDocumentMethod.Invoke(_queryableResourceCollectionDocumentBuilder,
64-
new[] {obj, requestMessage, cancellationToken});
64+
new[] { obj, requestMessage, cancellationToken, null });
6565

6666
return await materializedQueryTask;
6767
}

JSONAPI/Documents/Builders/IQueryableResourceCollectionDocumentBuilder.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
23
using System.Net.Http;
34
using System.Threading;
45
using System.Threading.Tasks;
@@ -16,8 +17,10 @@ public interface IQueryableResourceCollectionDocumentBuilder
1617
/// <param name="query">The query to materialize to build the response document</param>
1718
/// <param name="request">The request containing parameters to determine how to sort/filter/paginate the query</param>
1819
/// <param name="cancellationToken"></param>
20+
/// <param name="includePaths">The set of paths to include in the compound document</param>
1921
/// <typeparam name="T"></typeparam>
2022
/// <returns></returns>
21-
Task<IResourceCollectionDocument> BuildDocument<T>(IQueryable<T> query, HttpRequestMessage request, CancellationToken cancellationToken);
23+
Task<IResourceCollectionDocument> BuildDocument<T>(IQueryable<T> query, HttpRequestMessage request, CancellationToken cancellationToken,
24+
string[] includePaths = null);
2225
}
2326
}

0 commit comments

Comments
 (0)