diff --git a/readme.md b/readme.md index 57672034..434d2a95 100644 --- a/readme.md +++ b/readme.md @@ -27,7 +27,11 @@ export interface TodoEntity extends Entity { import factory from '@js-entity-repos/express/dist/factory'; const todosFacade = factory({ - // Optional property that determines the default pagination limit. + // Optional property that modifies a filter for the service. + constructFilter: (filter) => { + return filter; + }, + // Optional property. defaultPaginationLimit: 10, // Optional property that catches errors from handlers. errorCatcher: (handler) => (req, res) => { diff --git a/src/FacadeConfig.ts b/src/FacadeConfig.ts index da97650e..e1f7d41e 100644 --- a/src/FacadeConfig.ts +++ b/src/FacadeConfig.ts @@ -1,8 +1,10 @@ import Facade from '@js-entity-repos/core/dist/Facade'; import Entity from '@js-entity-repos/core/dist/types/Entity'; +import Filter from '@js-entity-repos/core/dist/types/Filter'; import ErrorCatcher from './utils/ErrorCatcher'; export default interface FacadeConfig { + readonly constructFilter: (filter: Filter) => any; readonly service: Facade; readonly errorCatcher: ErrorCatcher; readonly defaultPaginationLimit: number; diff --git a/src/factory.ts b/src/factory.ts index 1f9d542e..7b397947 100644 --- a/src/factory.ts +++ b/src/factory.ts @@ -15,6 +15,7 @@ import catchErrors from './utils/catchErrors'; export default (factoryConfig: FactoryConfig): Router => { const facadeConfig: FacadeConfig = { + constructFilter: (filter) => filter, defaultPaginationLimit: 10, errorCatcher: catchErrors, ...factoryConfig, diff --git a/src/functions/countEntities.ts b/src/functions/countEntities.ts index 453c08a8..f75e697e 100644 --- a/src/functions/countEntities.ts +++ b/src/functions/countEntities.ts @@ -8,7 +8,7 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { const { count } = await config.service.countEntities({ - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), }); res.status(OK).json(count); }); diff --git a/src/functions/getEntities.ts b/src/functions/getEntities.ts index 75720e1f..d40202e3 100644 --- a/src/functions/getEntities.ts +++ b/src/functions/getEntities.ts @@ -10,7 +10,7 @@ export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { const limit = getNumberQueryParam(req.query, 'limit', config.defaultPaginationLimit); const result = await config.service.getEntities({ - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), pagination: { cursor: req.query.cursor, forward: req.query.forward === 'true', diff --git a/src/functions/getEntity.ts b/src/functions/getEntity.ts index f2262efb..f1aed8a8 100644 --- a/src/functions/getEntity.ts +++ b/src/functions/getEntity.ts @@ -8,7 +8,7 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { const { entity } = await config.service.getEntity({ - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), id: req.params.id, }); res.status(OK).json(entity); diff --git a/src/functions/patchEntities.ts b/src/functions/patchEntities.ts index 843d2c79..e11e40dd 100644 --- a/src/functions/patchEntities.ts +++ b/src/functions/patchEntities.ts @@ -8,7 +8,7 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { const { entity } = await config.service.patchEntity({ - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), id: req.params.id, patch: req.body, }); diff --git a/src/functions/removeEntities.ts b/src/functions/removeEntities.ts index 39981ac4..7a0952ae 100644 --- a/src/functions/removeEntities.ts +++ b/src/functions/removeEntities.ts @@ -8,7 +8,7 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { await config.service.removeEntities({ - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), }); res.status(NO_CONTENT).send(); }); diff --git a/src/functions/removeEntity.ts b/src/functions/removeEntity.ts index e4af6d08..c9fb7b76 100644 --- a/src/functions/removeEntity.ts +++ b/src/functions/removeEntity.ts @@ -8,7 +8,7 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { await config.service.removeEntity({ - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), id: req.params.id, }); res.status(NO_CONTENT).send(); diff --git a/src/functions/replaceEntity.ts b/src/functions/replaceEntity.ts index 85279b29..f7d5ee38 100644 --- a/src/functions/replaceEntity.ts +++ b/src/functions/replaceEntity.ts @@ -9,7 +9,7 @@ export default (config: FacadeConfig) => { return catchErrors(async (req: Request, res: Response) => { const { entity } = await config.service.replaceEntity({ entity: req.body, - filter: getJsonQueryParam(req.query, 'filter'), + filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), id: req.params.id, }); res.status(OK).json(entity); diff --git a/src/utils/getJsonQueryParam.ts b/src/utils/getJsonQueryParam.ts index 8a093ecd..0c8c4fa9 100644 --- a/src/utils/getJsonQueryParam.ts +++ b/src/utils/getJsonQueryParam.ts @@ -3,5 +3,5 @@ import Query from './Query'; export default (data: Query, paramName: string) => { const paramValue = data[paramName]; - return paramValue === undefined ? undefined : parseJson(paramValue, [paramName]); + return paramValue === undefined ? {} : parseJson(paramValue, [paramName]); };