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