diff --git a/readme.md b/readme.md index e24b650a..e5595bb0 100644 --- a/readme.md +++ b/readme.md @@ -28,7 +28,8 @@ import factory from '@js-entity-repos/express/dist/factory'; const todosFacade = factory({ // Optional property that modifies a filter for the service. - constructFilter: (filter) => { + constructFilter: ({ filter, req, res }) => { + // This is a great place to put authentication and authorisation logic. return filter; }, // Optional property. Defaults to 10. diff --git a/src/FacadeConfig.ts b/src/FacadeConfig.ts index 892d90be..43c78371 100644 --- a/src/FacadeConfig.ts +++ b/src/FacadeConfig.ts @@ -1,10 +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 FilterConstructor from './utils/FilterConstructor'; import TransactionHandler from './utils/TransactionHandler'; export default interface FacadeConfig { - readonly constructFilter: (filter: Filter) => any; + readonly constructFilter: FilterConstructor; readonly service: Facade; readonly handleTransaction: TransactionHandler; readonly defaultPaginationLimit: number; diff --git a/src/FactoryConfig.ts b/src/FactoryConfig.ts index 2aae9cc6..4681ae96 100644 --- a/src/FactoryConfig.ts +++ b/src/FactoryConfig.ts @@ -1,10 +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 FilterConstructor from './utils/FilterConstructor'; import TransactionHandler from './utils/TransactionHandler'; export default interface FactoryConfig { - readonly constructFilter?: (filter: Filter) => any; + readonly constructFilter?: FilterConstructor; readonly service: Facade; readonly handleTransaction?: TransactionHandler; readonly defaultPaginationLimit?: number; diff --git a/src/factory.ts b/src/factory.ts index 5f867a0b..aa7bd93f 100644 --- a/src/factory.ts +++ b/src/factory.ts @@ -15,7 +15,7 @@ import handleTransaction from './utils/handleTransaction'; export default (factoryConfig: FactoryConfig): Router => { const facadeConfig: FacadeConfig = { - constructFilter: (filter) => filter, + constructFilter: ({ filter }) => filter, defaultPaginationLimit: 10, handleTransaction, ...factoryConfig, diff --git a/src/functions/countEntities.ts b/src/functions/countEntities.ts index 5500fe6f..1271fe03 100644 --- a/src/functions/countEntities.ts +++ b/src/functions/countEntities.ts @@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); const { count } = await config.service.countEntities({ - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), }); res.status(OK).json(count); }); diff --git a/src/functions/getEntities.ts b/src/functions/getEntities.ts index 98718cd7..9bb477f8 100644 --- a/src/functions/getEntities.ts +++ b/src/functions/getEntities.ts @@ -8,9 +8,10 @@ import getNumberQueryParam from '../utils/getNumberQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); const limit = getNumberQueryParam(req.query, 'limit', config.defaultPaginationLimit); const result = await config.service.getEntities({ - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), pagination: { cursor: req.query.cursor, forward: req.query.forward === 'true', diff --git a/src/functions/getEntity.ts b/src/functions/getEntity.ts index 0cc13324..b78a7603 100644 --- a/src/functions/getEntity.ts +++ b/src/functions/getEntity.ts @@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); const { entity } = await config.service.getEntity({ - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), id: req.params.id, }); res.status(OK).json(entity); diff --git a/src/functions/patchEntities.ts b/src/functions/patchEntities.ts index f69a53a2..19472515 100644 --- a/src/functions/patchEntities.ts +++ b/src/functions/patchEntities.ts @@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); const { entity } = await config.service.patchEntity({ - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), id: req.params.id, patch: req.body, }); diff --git a/src/functions/removeEntities.ts b/src/functions/removeEntities.ts index 8847191c..269451bc 100644 --- a/src/functions/removeEntities.ts +++ b/src/functions/removeEntities.ts @@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); await config.service.removeEntities({ - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), }); res.status(NO_CONTENT).send(); }); diff --git a/src/functions/removeEntity.ts b/src/functions/removeEntity.ts index e41343d2..96c65ed2 100644 --- a/src/functions/removeEntity.ts +++ b/src/functions/removeEntity.ts @@ -7,8 +7,9 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); await config.service.removeEntity({ - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), id: req.params.id, }); res.status(NO_CONTENT).send(); diff --git a/src/functions/replaceEntity.ts b/src/functions/replaceEntity.ts index 1c29ea50..79b2ddc9 100644 --- a/src/functions/replaceEntity.ts +++ b/src/functions/replaceEntity.ts @@ -7,9 +7,10 @@ import getJsonQueryParam from '../utils/getJsonQueryParam'; export default (config: FacadeConfig) => { return async (req: Request, res: Response) => { await config.handleTransaction({ req, res }, async () => { + const filter = getJsonQueryParam(req.query, 'filter'); const { entity } = await config.service.replaceEntity({ entity: req.body, - filter: config.constructFilter(getJsonQueryParam(req.query, 'filter')), + filter: config.constructFilter({ filter, req, res }), id: req.params.id, }); res.status(OK).json(entity); diff --git a/src/utils/FilterConstructor.ts b/src/utils/FilterConstructor.ts new file mode 100644 index 00000000..2361fb51 --- /dev/null +++ b/src/utils/FilterConstructor.ts @@ -0,0 +1,13 @@ +import Entity from '@js-entity-repos/core/dist/types/Entity'; +import { Filter } from '@js-entity-repos/core/dist/types/Filter'; +import { Request, Response } from 'express'; + +export interface Opts { + readonly req: Request; + readonly res: Response; + readonly filter: Filter; +} + +type FilterConstructor = (opts: Opts) => Filter; + +export default FilterConstructor;