Skip to content
This repository was archived by the owner on Jun 22, 2021. It is now read-only.

Commit a9518ec

Browse files
authored
fix: Fixes cursors. (#17)
1 parent a350c53 commit a9518ec

File tree

5 files changed

+33
-19
lines changed

5 files changed

+33
-19
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"check-coverage": true
2626
},
2727
"dependencies": {
28-
"@js-entity-repos/core": "^7.1.0",
28+
"@js-entity-repos/core": "^8.0.0",
2929
"knex": "^0.14.2",
3030
"lodash": "^4.17.4"
3131
},

src/factory.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ before(async () => {
3232
});
3333

3434
facadeTest(factory<TestEntity>({
35+
constructEntity: (document) => {
36+
return {
37+
...document,
38+
booleanProp: document.booleanProp === 1,
39+
};
40+
},
3541
db,
3642
entityName: 'Test Entity',
3743
tableName,

src/factory.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import replaceEntity from './functions/replaceEntity';
1414
export default <E extends Entity>(factoryConfig: FactoryConfig<E>): Facade<E> => {
1515
const facadeConfig: FacadeConfig<E> = {
1616
constructDocument: (patch) => patch,
17-
constructEntity: (document) => document,
17+
constructEntity: (document) => {
18+
/* istanbul ignore next - Had to be overriden in tests for booleans */
19+
return document;
20+
},
1821
constructFilter: (filter) => filter,
1922
constructSort: (sort) => sort,
2023
defaultPaginationLimit: 10,

src/functions/getEntities.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import GetEntities from '@js-entity-repos/core/dist/signatures/GetEntities';
2+
import { end, start } from '@js-entity-repos/core/dist/types/Cursor';
23
import Entity from '@js-entity-repos/core/dist/types/Entity';
34
import Pagination from '@js-entity-repos/core/dist/types/Pagination';
45
import { forward } from '@js-entity-repos/core/dist/types/PaginationDirection';
56
import Sort from '@js-entity-repos/core/dist/types/Sort';
67
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';
810
import createPaginationFilter from '@js-entity-repos/core/dist/utils/createPaginationFilter';
9-
import { first, last, mapValues } from 'lodash';
11+
import { mapValues } from 'lodash';
1012
import FacadeConfig from '../FacadeConfig';
1113
import filterEntities from '../utils/filterEntities';
1214

@@ -16,14 +18,17 @@ const xor = (conditionA: boolean, conditionB: boolean) => {
1618

1719
export 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

Comments
 (0)