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

Commit 59b278d

Browse files
authored
feat: Improves constructFilter. (#6)
BREAKING CHANGE: Changes the signature of the `constructFilter` property in the `factory`.
1 parent 7ff6569 commit 59b278d

12 files changed

+34
-13
lines changed

readme.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import factory from '@js-entity-repos/express/dist/factory';
2828

2929
const todosFacade = factory<TodoEntity>({
3030
// Optional property that modifies a filter for the service.
31-
constructFilter: (filter) => {
31+
constructFilter: ({ filter, req, res }) => {
32+
// This is a great place to put authentication and authorisation logic.
3233
return filter;
3334
},
3435
// Optional property. Defaults to 10.

src/FacadeConfig.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import Facade from '@js-entity-repos/core/dist/Facade';
22
import Entity from '@js-entity-repos/core/dist/types/Entity';
3-
import Filter from '@js-entity-repos/core/dist/types/Filter';
3+
import FilterConstructor from './utils/FilterConstructor';
44
import TransactionHandler from './utils/TransactionHandler';
55

66
export default interface FacadeConfig<E extends Entity> {
7-
readonly constructFilter: (filter: Filter<E>) => any;
7+
readonly constructFilter: FilterConstructor<E>;
88
readonly service: Facade<E>;
99
readonly handleTransaction: TransactionHandler;
1010
readonly defaultPaginationLimit: number;

src/FactoryConfig.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import Facade from '@js-entity-repos/core/dist/Facade';
22
import Entity from '@js-entity-repos/core/dist/types/Entity';
3-
import { Filter } from '@js-entity-repos/core/dist/types/Filter';
3+
import FilterConstructor from './utils/FilterConstructor';
44
import TransactionHandler from './utils/TransactionHandler';
55

66
export default interface FactoryConfig<E extends Entity> {
7-
readonly constructFilter?: (filter: Filter<E>) => any;
7+
readonly constructFilter?: FilterConstructor<E>;
88
readonly service: Facade<E>;
99
readonly handleTransaction?: TransactionHandler;
1010
readonly defaultPaginationLimit?: number;

src/factory.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import handleTransaction from './utils/handleTransaction';
1515

1616
export default <E extends Entity>(factoryConfig: FactoryConfig<E>): Router => {
1717
const facadeConfig: FacadeConfig<E> = {
18-
constructFilter: (filter) => filter,
18+
constructFilter: ({ filter }) => filter,
1919
defaultPaginationLimit: 10,
2020
handleTransaction,
2121
...factoryConfig,

src/functions/countEntities.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam';
77
export default <E extends Entity>(config: FacadeConfig<E>) => {
88
return async (req: Request, res: Response) => {
99
await config.handleTransaction({ req, res }, async () => {
10+
const filter = getJsonQueryParam(req.query, 'filter');
1011
const { count } = await config.service.countEntities({
11-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
12+
filter: config.constructFilter({ filter, req, res }),
1213
});
1314
res.status(OK).json(count);
1415
});

src/functions/getEntities.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import getNumberQueryParam from '../utils/getNumberQueryParam';
88
export default <E extends Entity>(config: FacadeConfig<E>) => {
99
return async (req: Request, res: Response) => {
1010
await config.handleTransaction({ req, res }, async () => {
11+
const filter = getJsonQueryParam(req.query, 'filter');
1112
const limit = getNumberQueryParam(req.query, 'limit', config.defaultPaginationLimit);
1213
const result = await config.service.getEntities({
13-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
14+
filter: config.constructFilter({ filter, req, res }),
1415
pagination: {
1516
cursor: req.query.cursor,
1617
forward: req.query.forward === 'true',

src/functions/getEntity.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam';
77
export default <E extends Entity>(config: FacadeConfig<E>) => {
88
return async (req: Request, res: Response) => {
99
await config.handleTransaction({ req, res }, async () => {
10+
const filter = getJsonQueryParam(req.query, 'filter');
1011
const { entity } = await config.service.getEntity({
11-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
12+
filter: config.constructFilter({ filter, req, res }),
1213
id: req.params.id,
1314
});
1415
res.status(OK).json(entity);

src/functions/patchEntities.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam';
77
export default <E extends Entity>(config: FacadeConfig<E>) => {
88
return async (req: Request, res: Response) => {
99
await config.handleTransaction({ req, res }, async () => {
10+
const filter = getJsonQueryParam(req.query, 'filter');
1011
const { entity } = await config.service.patchEntity({
11-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
12+
filter: config.constructFilter({ filter, req, res }),
1213
id: req.params.id,
1314
patch: req.body,
1415
});

src/functions/removeEntities.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam';
77
export default <E extends Entity>(config: FacadeConfig<E>) => {
88
return async (req: Request, res: Response) => {
99
await config.handleTransaction({ req, res }, async () => {
10+
const filter = getJsonQueryParam(req.query, 'filter');
1011
await config.service.removeEntities({
11-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
12+
filter: config.constructFilter({ filter, req, res }),
1213
});
1314
res.status(NO_CONTENT).send();
1415
});

src/functions/removeEntity.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam';
77
export default <E extends Entity>(config: FacadeConfig<E>) => {
88
return async (req: Request, res: Response) => {
99
await config.handleTransaction({ req, res }, async () => {
10+
const filter = getJsonQueryParam(req.query, 'filter');
1011
await config.service.removeEntity({
11-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
12+
filter: config.constructFilter({ filter, req, res }),
1213
id: req.params.id,
1314
});
1415
res.status(NO_CONTENT).send();

src/functions/replaceEntity.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import getJsonQueryParam from '../utils/getJsonQueryParam';
77
export default <E extends Entity>(config: FacadeConfig<E>) => {
88
return async (req: Request, res: Response) => {
99
await config.handleTransaction({ req, res }, async () => {
10+
const filter = getJsonQueryParam(req.query, 'filter');
1011
const { entity } = await config.service.replaceEntity({
1112
entity: req.body,
12-
filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')),
13+
filter: config.constructFilter({ filter, req, res }),
1314
id: req.params.id,
1415
});
1516
res.status(OK).json(entity);

src/utils/FilterConstructor.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Entity from '@js-entity-repos/core/dist/types/Entity';
2+
import { Filter } from '@js-entity-repos/core/dist/types/Filter';
3+
import { Request, Response } from 'express';
4+
5+
export interface Opts<E extends Entity> {
6+
readonly req: Request;
7+
readonly res: Response;
8+
readonly filter: Filter<E>;
9+
}
10+
11+
type FilterConstructor<E extends Entity> = (opts: Opts<E>) => Filter<E>;
12+
13+
export default FilterConstructor;

0 commit comments

Comments
 (0)