Skip to content

Commit 70e220a

Browse files
author
Chris Santero
committed
change pagination transformer to return rich object
This change allows the pagination transformer to communicate information about the pagination operation that was performed, in addition to the paged query itself. This paves the way for including page links at the top level.
1 parent 080cc88 commit 70e220a

6 files changed

Lines changed: 67 additions & 8 deletions

File tree

JSONAPI.Tests/ActionFilters/DefaultPaginationTransformerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private DefaultPaginationTransformer GetTransformer(int maxPageSize)
5454
private Dummy[] GetArray(string uri, int maxPageSize = 50)
5555
{
5656
var request = new HttpRequestMessage(HttpMethod.Get, uri);
57-
return GetTransformer(maxPageSize).ApplyPagination(_fixturesQuery, request).ToArray();
57+
return GetTransformer(maxPageSize).ApplyPagination(_fixturesQuery, request).PagedQuery.ToArray();
5858
}
5959

6060
[TestMethod]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Linq;
2+
3+
namespace JSONAPI.ActionFilters
4+
{
5+
/// <summary>
6+
/// Default implementation of IPaginationTransformResult`1
7+
/// </summary>
8+
/// <typeparam name="T"></typeparam>
9+
public class DefaultPaginationTransformResult<T> : IPaginationTransformResult<T>
10+
{
11+
public IQueryable<T> PagedQuery { get; set; }
12+
public bool PaginationWasApplied { get; set; }
13+
public int PageNumber { get; set; }
14+
public int PageSize { get; set; }
15+
}
16+
}

JSONAPI/ActionFilters/DefaultPaginationTransformer.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace JSONAPI.ActionFilters
88
{
99
/// <summary>
10-
/// Performs pagination a
10+
/// Performs pagination
1111
/// </summary>
1212
public class DefaultPaginationTransformer : IQueryablePaginationTransformer
1313
{
@@ -32,7 +32,7 @@ public DefaultPaginationTransformer(string pageNumberQueryParam, string pageSize
3232
_maxPageSize = maxPageSize;
3333
}
3434

35-
public IQueryable<T> ApplyPagination<T>(IQueryable<T> query, HttpRequestMessage request)
35+
public IPaginationTransformResult<T> ApplyPagination<T>(IQueryable<T> query, HttpRequestMessage request)
3636
{
3737
var hasPageNumberParam = false;
3838
var hasPageSizeParam = false;
@@ -58,7 +58,13 @@ public IQueryable<T> ApplyPagination<T>(IQueryable<T> query, HttpRequestMessage
5858
}
5959

6060
if (!hasPageNumberParam && !hasPageSizeParam)
61-
return query;
61+
{
62+
return new DefaultPaginationTransformResult<T>
63+
{
64+
PagedQuery = query,
65+
PaginationWasApplied = false
66+
};
67+
}
6268

6369
if ((hasPageNumberParam && !hasPageSizeParam) || (!hasPageNumberParam && hasPageSizeParam))
6470
throw new QueryableTransformException(
@@ -77,7 +83,13 @@ public IQueryable<T> ApplyPagination<T>(IQueryable<T> query, HttpRequestMessage
7783
pageSize = _maxPageSize.Value;
7884

7985
var skip = pageNumber * pageSize;
80-
return query.Skip(skip).Take(pageSize);
86+
return new DefaultPaginationTransformResult<T>
87+
{
88+
PageNumber = pageNumber,
89+
PageSize = pageSize,
90+
PagedQuery = query.Skip(skip).Take(pageSize),
91+
PaginationWasApplied = true
92+
};
8193
}
8294
}
8395
}

JSONAPI/ActionFilters/IQueryablePaginationTransformer.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,34 @@ public interface IQueryablePaginationTransformer
1414
/// <param name="query">The query to page</param>
1515
/// <param name="request">The request message</param>
1616
/// <typeparam name="T">The queryable element type</typeparam>
17-
/// <returns>An IQueryable configured to return a page of data</returns>
18-
IQueryable<T> ApplyPagination<T>(IQueryable<T> query, HttpRequestMessage request);
17+
/// <returns>The result of pagination</returns>
18+
IPaginationTransformResult<T> ApplyPagination<T>(IQueryable<T> query, HttpRequestMessage request);
19+
}
20+
21+
/// <summary>
22+
/// The result of a pagination transform
23+
/// </summary>
24+
/// <typeparam name="T"></typeparam>
25+
public interface IPaginationTransformResult<out T>
26+
{
27+
/// <summary>
28+
/// A query that has been paginated
29+
/// </summary>
30+
IQueryable<T> PagedQuery { get; }
31+
32+
/// <summary>
33+
/// Whether the query has been paginated or not
34+
/// </summary>
35+
bool PaginationWasApplied { get; }
36+
37+
/// <summary>
38+
/// The current page of the query
39+
/// </summary>
40+
int PageNumber { get; }
41+
42+
/// <summary>
43+
/// The size of this page of data
44+
/// </summary>
45+
int PageSize { get; }
1946
}
2047
}

JSONAPI/JSONAPI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
<ItemGroup>
6969
<Compile Include="ActionFilters\DefaultFilteringTransformer.cs" />
7070
<Compile Include="ActionFilters\DefaultPaginationTransformer.cs" />
71+
<Compile Include="ActionFilters\DefaultPaginationTransformResult.cs" />
7172
<Compile Include="ActionFilters\IQueryableEnumerationTransformer.cs" />
7273
<Compile Include="ActionFilters\IQueryableFilteringTransformer.cs" />
7374
<Compile Include="ActionFilters\IQueryablePaginationTransformer.cs" />

JSONAPI/Payload/DefaultQueryablePayloadBuilder.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ public async Task<IPayload> BuildPayload<T>(IQueryable<T> query, HttpRequestMess
4545
query = _sortingTransformer.Sort(query, request);
4646

4747
if (_paginationTransformer != null)
48-
query = _paginationTransformer.ApplyPagination(query, request);
48+
{
49+
var paginationResults = _paginationTransformer.ApplyPagination(query, request);
50+
query = paginationResults.PagedQuery;
51+
}
4952

5053
var results = await _enumerationTransformer.Enumerate(query, cancellationToken);
5154

0 commit comments

Comments
 (0)