1
1
import GetEntities from '@js-entity-repos/core/dist/signatures/GetEntities' ;
2
+ import { end , start } from '@js-entity-repos/core/dist/types/Cursor' ;
2
3
import Entity from '@js-entity-repos/core/dist/types/Entity' ;
3
4
import Pagination from '@js-entity-repos/core/dist/types/Pagination' ;
4
5
import { forward } from '@js-entity-repos/core/dist/types/PaginationDirection' ;
5
6
import Sort from '@js-entity-repos/core/dist/types/Sort' ;
6
7
import SortOrder , { asc } from '@js-entity-repos/core/dist/types/SortOrder' ;
7
- import createCursorFromEntity from '@js-entity-repos/core/dist/utils/createCursorFromEntity' ;
8
+ import createEndCursorResult from '@js-entity-repos/core/dist/utils/createEndCursorResult' ;
9
+ import createGetEntitiesResult from '@js-entity-repos/core/dist/utils/createGetEntitiesResult' ;
8
10
import createPaginationFilter from '@js-entity-repos/core/dist/utils/createPaginationFilter' ;
9
- import { first , last , mapValues } from 'lodash' ;
11
+ import { mapValues } from 'lodash' ;
10
12
import FacadeConfig from '../FacadeConfig' ;
11
13
import filterEntities from '../utils/filterEntities' ;
12
14
@@ -16,14 +18,17 @@ const xor = (conditionA: boolean, conditionB: boolean) => {
16
18
17
19
export default < E extends Entity > ( config : FacadeConfig < E > ) : GetEntities < E > => {
18
20
const defaultPagination : Pagination = {
19
- cursor : undefined ,
21
+ cursor : start ,
20
22
direction : forward ,
21
23
limit : config . defaultPaginationLimit ,
22
24
} ;
23
25
const defaultSort = { id : asc } as Sort < E > ;
24
26
return async ( { filter = { } , sort = defaultSort , pagination = defaultPagination } ) => {
25
- const table = ( await config . db ( ) ) . table ( config . tableName ) ;
27
+ if ( pagination . cursor === end ) {
28
+ return createEndCursorResult ( pagination ) ;
29
+ }
26
30
31
+ const table = ( await config . db ( ) ) . table ( config . tableName ) ;
27
32
const paginationFilter = createPaginationFilter ( pagination , sort ) ;
28
33
const fullFilter = { $and : [ filter , paginationFilter ] } ;
29
34
const constructedFilter = config . constructFilter ( fullFilter ) ;
@@ -36,13 +41,13 @@ export default <E extends Entity>(config: FacadeConfig<E>): GetEntities<E> => {
36
41
const sortQuery = Object . keys ( knexSort ) . reduce ( ( result , sortKey ) => {
37
42
return result . orderBy ( sortKey , ( knexSort as any ) [ sortKey ] ) ;
38
43
} , filterQuery ) ;
39
- const limitQuery = sortQuery . limit ( pagination . limit ) ;
40
- const documents = await Promise . resolve ( limitQuery ) ;
44
+ const limitQuery = sortQuery . limit ( pagination . limit + 1 ) ;
45
+ const results = await Promise . resolve ( limitQuery ) ;
46
+ const documents = results . slice ( 0 , pagination . limit ) ;
41
47
42
- const entities = documents . map ( config . constructEntity ) ;
43
- const nextCursor = createCursorFromEntity ( last ( entities ) , sort ) ;
44
- const previousCursor = createCursorFromEntity ( first ( entities ) , sort ) ;
48
+ const entities : E [ ] = documents . map ( config . constructEntity ) ;
49
+ const isEnd = results . length <= pagination . limit ;
45
50
46
- return { entities, nextCursor , previousCursor } ;
51
+ return createGetEntitiesResult ( { entities, isEnd , pagination , sort } ) ;
47
52
} ;
48
53
} ;
0 commit comments