11import GetEntities from '@js-entity-repos/core/dist/signatures/GetEntities' ;
2+ import { end , start } from '@js-entity-repos/core/dist/types/Cursor' ;
23import Entity from '@js-entity-repos/core/dist/types/Entity' ;
34import Pagination from '@js-entity-repos/core/dist/types/Pagination' ;
45import { forward } from '@js-entity-repos/core/dist/types/PaginationDirection' ;
56import Sort from '@js-entity-repos/core/dist/types/Sort' ;
67import 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' ;
810import createPaginationFilter from '@js-entity-repos/core/dist/utils/createPaginationFilter' ;
9- import { first , last , mapValues } from 'lodash' ;
11+ import { mapValues } from 'lodash' ;
1012import FacadeConfig from '../FacadeConfig' ;
1113import filterEntities from '../utils/filterEntities' ;
1214
@@ -16,14 +18,17 @@ const xor = (conditionA: boolean, conditionB: boolean) => {
1618
1719export default < E extends Entity > ( config : FacadeConfig < E > ) : GetEntities < E > => {
1820 const defaultPagination : Pagination = {
19- cursor : undefined ,
21+ cursor : start ,
2022 direction : forward ,
2123 limit : config . defaultPaginationLimit ,
2224 } ;
2325 const defaultSort = { id : asc } as Sort < E > ;
2426 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+ }
2630
31+ const table = ( await config . db ( ) ) . table ( config . tableName ) ;
2732 const paginationFilter = createPaginationFilter ( pagination , sort ) ;
2833 const fullFilter = { $and : [ filter , paginationFilter ] } ;
2934 const constructedFilter = config . constructFilter ( fullFilter ) ;
@@ -36,13 +41,13 @@ export default <E extends Entity>(config: FacadeConfig<E>): GetEntities<E> => {
3641 const sortQuery = Object . keys ( knexSort ) . reduce ( ( result , sortKey ) => {
3742 return result . orderBy ( sortKey , ( knexSort as any ) [ sortKey ] ) ;
3843 } , 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 ) ;
4147
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 ;
4550
46- return { entities, nextCursor , previousCursor } ;
51+ return createGetEntitiesResult ( { entities, isEnd , pagination , sort } ) ;
4752 } ;
4853} ;
0 commit comments