1+ using System ;
12using System . Collections . Generic ;
23using System . Linq ;
34using System . Threading . Tasks ;
45using JsonApiDotNetCore . Data ;
56using JsonApiDotNetCore . Extensions ;
7+ using JsonApiDotNetCore . Internal . Query ;
68using JsonApiDotNetCore . Models ;
79using JsonApiDotNetCore . Services ;
810using Microsoft . AspNetCore . Mvc ;
@@ -36,6 +38,7 @@ public JsonApiController(
3638 ILoggerFactory loggerFactory )
3739 {
3840 _jsonApiContext = jsonApiContext . ApplyContext < T > ( ) ;
41+
3942 _entities = entityRepository ;
4043
4144 _logger = loggerFactory . CreateLogger < JsonApiController < T , TId > > ( ) ;
@@ -47,21 +50,25 @@ public JsonApiController(
4750 IJsonApiContext jsonApiContext ,
4851 IEntityRepository < T , TId > entityRepository )
4952 {
53+ _jsonApiContext = jsonApiContext . ApplyContext < T > ( ) ;
5054 _jsonApiContext = jsonApiContext ;
5155 _entities = entityRepository ;
5256 }
5357
5458 [ HttpGet ]
55- public virtual IActionResult Get ( )
59+ public virtual async Task < IActionResult > GetAsync ( )
5660 {
5761 var entities = _entities . Get ( ) ;
5862
5963 entities = ApplySortAndFilterQuery ( entities ) ;
6064
61- if ( _jsonApiContext . QuerySet != null )
65+ if ( _jsonApiContext . QuerySet != null && _jsonApiContext . QuerySet . IncludedRelationships != null && _jsonApiContext . QuerySet . IncludedRelationships . Count > 0 )
6266 entities = IncludeRelationships ( entities , _jsonApiContext . QuerySet . IncludedRelationships ) ;
6367
64- return Ok ( entities ) ;
68+ // pagination should be done last since it will execute the query
69+ var pagedEntities = await ApplyPageQueryAsync ( entities ) ;
70+
71+ return Ok ( pagedEntities ) ;
6572 }
6673
6774 [ HttpGet ( "{id}" ) ]
@@ -142,12 +149,6 @@ public virtual async Task<IActionResult> PatchAsync(TId id, [FromBody] T entity)
142149 return Ok ( updatedEntity ) ;
143150 }
144151
145- // [HttpPatch("{id}/{relationship}")]
146- // public virtual IActionResult PatchRelationship(int id, string relation)
147- // {
148- // return Ok("Patch Id/relationship");
149- // }
150-
151152 [ HttpDelete ( "{id}" ) ]
152153 public virtual async Task < IActionResult > DeleteAsync ( TId id )
153154 {
@@ -159,26 +160,37 @@ public virtual async Task<IActionResult> DeleteAsync(TId id)
159160 return Ok ( ) ;
160161 }
161162
162- // [HttpDelete("{id}/{relationship}")]
163- // public virtual IActionResult Delete(int id, string relation)
164- // {
165- // return Ok("Delete Id/relationship");
166- // }
167-
168163 private IQueryable < T > ApplySortAndFilterQuery ( IQueryable < T > entities )
169164 {
170165 var query = _jsonApiContext . QuerySet ;
171166
172167 if ( _jsonApiContext . QuerySet == null )
173168 return entities ;
174169
175- entities = _entities . Filter ( entities , query . Filter ) ;
170+ if ( query . Filter != null )
171+ entities = _entities . Filter ( entities , query . Filter ) ;
176172
177- entities = _entities . Sort ( entities , query . SortParameters ) ;
173+ if ( query . SortParameters != null && query . SortParameters . Count > 0 )
174+ entities = _entities . Sort ( entities , query . SortParameters ) ;
178175
179176 return entities ;
180177 }
181178
179+ private async Task < IEnumerable < T > > ApplyPageQueryAsync ( IQueryable < T > entities )
180+ {
181+ if ( _jsonApiContext . Options . DefaultPageSize == 0 && ( _jsonApiContext . QuerySet == null || _jsonApiContext . QuerySet . PageQuery . PageSize == 0 ) )
182+ return entities ;
183+
184+ var query = _jsonApiContext . QuerySet ? . PageQuery ?? new PageQuery ( ) ;
185+
186+ var pageNumber = query . PageOffset > 0 ? query . PageOffset : 1 ;
187+ var pageSize = query . PageSize > 0 ? query . PageSize : _jsonApiContext . Options . DefaultPageSize ;
188+
189+ _logger ? . LogInformation ( $ "Applying paging query. Fetching page { pageNumber } with { pageSize } entities") ;
190+
191+ return await _entities . PageAsync ( entities , pageSize , pageNumber ) ;
192+ }
193+
182194 private IQueryable < T > IncludeRelationships ( IQueryable < T > entities , List < string > relationships )
183195 {
184196 _jsonApiContext . IncludedRelationships = relationships ;
0 commit comments