@fjell/express-router 4.4.1 → 4.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/logger.ts","../src/ItemRouter.ts","../src/CItemRouter.ts","../src/PItemRouter.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n","import {\n ComKey,\n cPK,\n Item,\n ItemEvent,\n ItemProperties,\n LocKey,\n LocKeyArray,\n PriKey,\n validatePK\n} from \"@fjell/core\";\nimport { NotFoundError, Operations } from \"@fjell/lib\";\nimport deepmerge from \"deepmerge\";\nimport { Request, RequestHandler, Response, Router } from \"express\";\nimport LibLogger from \"./logger\";\n\nexport type ItemRouterOptions = Record<string, never>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type ActionMethod = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any, body: any) =>\n Promise<Item<S, L1, L2, L3, L4, L5>>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type AllActionMethods = Array<RequestHandler>;\n\nexport class ItemRouter<\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> {\n\n protected lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;\n private keyType: S;\n protected options: ItemRouterOptions;\n private childRouters: Record<string, Router> = {};\n private logger;\n private itemActions: Record<string, ActionMethod> | undefined;\n\n constructor(\n lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,\n keyType: S,\n options: ItemRouterOptions = {}\n ) {\n this.lib = lib;\n this.keyType = keyType;\n this.options = options;\n this.logger = LibLogger.get(\"ItemRouter\", keyType);\n }\n\n public getPkType = (): S => {\n return this.keyType;\n }\n\n protected getPkParam = (): string => {\n return `${this.getPkType()}Pk`;\n }\n\n protected getLk(res: Response): LocKey<S> {\n return { kt: this.keyType, lk: res.locals[this.getPkParam()] };\n }\n\n // this is meant to be consumed by children routers\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n return [this.getLk(res)] as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getPk(res: Response): PriKey<S> {\n return cPK<S>(res.locals[this.getPkParam()], this.getPkType());\n }\n\n // Unless this is a contained router, the locations will always be an empty array.\n /* eslint-disable */\n protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [] {\n throw new Error('Method not implemented in an abstract router');\n }\n /* eslint-enable */\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected getIk(res: Response): PriKey<S> | ComKey<S, L1, L2, L3, L4, L5> {\n throw new Error('Method not implemented in an abstract router');\n }\n\n protected postItemAction = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n if (!this.itemActions) {\n this.logger.error('Item Actions are not configured');\n return res.status(500).json({ error: 'Item Actions are not configured' });\n }\n try {\n const item =\n validatePK(await this.lib.get(ik), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n return res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));\n } catch (err: any) {\n this.logger.error('Error in Item Action', { message: err?.message, stack: err?.stack });\n return res.status(500).json(err);\n }\n }\n\n private configure = (router: Router) => {\n this.logger.default('Configuring Router', { pkType: this.getPkType() });\n router.get('/', this.findItems);\n router.post('/', this.createItem);\n\n const allActions = this.configureAllActions();\n this.logger.debug('All Actions supplied to Router', { allActions });\n if (allActions) {\n Object.keys(allActions).forEach((actionKey) => {\n this.logger.default('Configuring All Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n router.post(`/${actionKey}`, ...allActions[actionKey]);\n });\n }\n\n const itemRouter = Router();\n itemRouter.get('/', this.getItem);\n itemRouter.put('/', this.updateItem);\n itemRouter.delete('/', this.deleteItem);\n\n this.itemActions = this.configureItemActions();\n this.logger.debug('Item Actions supplied to Router', { itemActions: this.itemActions });\n if (this.itemActions) {\n Object.keys(this.itemActions).forEach((actionKey) => {\n this.logger.default('Configuring Item Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n itemRouter.post(`/${actionKey}`, this.postItemAction)\n });\n }\n\n this.logger.default('Configuring Item Operations under PK Param', { pkParam: this.getPkParam() });\n router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);\n\n if (this.childRouters) {\n this.configureChildRouters(itemRouter, this.childRouters);\n }\n return router;\n }\n\n private validatePrimaryKeyValue = (req: Request, res: Response, next: any) => {\n const pkParamValue = req.params[this.getPkParam()];\n if (this.validatePKParam(pkParamValue)) {\n res.locals[this.getPkParam()] = pkParamValue;\n next();\n } else {\n this.logger.error('Invalid Primary Key', { pkParamValue, path: req?.path });\n res.status(500).json({ error: 'Invalid Primary Key', path: req?.path });\n }\n }\n\n private configureChildRouters = (router: Router, childRouters: Record<string, Router>) => {\n for (const path in childRouters) {\n this.logger.default('Configuring Child Router at Path', { path });\n\n router.use(`/${path}`, childRouters[path]);\n }\n return router;\n }\n\n public addChildRouter = (path: string, router: Router) => {\n this.childRouters[path] = router;\n }\n\n /* istanbul ignore next */\n protected configureItemActions(): Record<string, ActionMethod> {\n this.logger.debug('ARouter - No Item Actions Configured');\n return {};\n }\n\n /* istanbul ignore next */\n protected configureAllActions(): Record<string, AllActionMethods> {\n this.logger.debug('ARouter - No All Actions Configured');\n return {};\n }\n\n /* istanbul ignore next */\n public getRouter(): Router {\n const router = Router();\n this.configure(router);\n return router;\n }\n\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected createItem = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {\n throw new Error('Method not implemented in an abstract router');\n };\n\n // TODO: Probably a better way to do this, but this postCreate hook only needs the item.\n /* istanbul ignore next */\n public postCreateItem = async (item: Item<S, L1, L2, L3, L4, L5>): Promise<Item<S, L1, L2, L3, L4, L5>> => {\n this.logger.default('Post Create Item', { item });\n return item;\n };\n\n protected deleteItem = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {\n this.logger.default('Deleting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n const removedItem = await this.lib.remove(ik);\n const item = validatePK(removedItem, this.getPkType());\n return res.json(item);\n };\n\n /* eslint-disable */\n /* istanbul ignore next */\n protected findItems = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {\n throw new Error('Method not implemented in an abstract router');\n };\n /* eslint-enable */\n\n protected getItem = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n try {\n // TODO: What error does validate PK throw, when can that fail?\n const item = validatePK(await this.lib.get(ik), this.getPkType());\n return res.json(item);\n } catch (err: any) {\n if (err instanceof NotFoundError) {\n this.logger.error('Item Not Found', { ik, message: err?.message, stack: err?.stack });\n return res.status(404).json({\n ik,\n message: \"Item Not Found\",\n });\n } else {\n this.logger.error('General Error', { ik, message: err?.message, stack: err?.stack });\n return res.status(500).json({\n ik,\n message: \"General Error\",\n });\n }\n }\n }\n\n protected updateItem = async (req: Request, res: Response) => {\n this.logger.default('Updating Item',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const itemToUpdate = this.convertDates(req.body as ItemProperties<S, L1, L2, L3, L4, L5>);\n const retItem = validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());\n return res.json(retItem);\n };\n\n public convertDates = (item: Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>):\n Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5> => {\n const events = item.events as Record<string, ItemEvent>;\n this.logger.default('Converting Dates', { item });\n if (events) {\n Object.keys(events).forEach((key: string) => {\n Object.assign(events, {\n [key]: deepmerge(events[key], { at: events[key].at ? new Date(events[key].at) : null })\n });\n });\n }\n Object.assign(item, { events });\n return item;\n };\n\n // TODO: Maybe just simplify this and require that everything is a UUID?\n /**\n * This method might be an annoyance, but we need to capture a few cases where someone passes\n * a PK parameter that has an odd string in it.\n *\n * @param pkParamValue The value of the primary key parameter\n * @returns if the value is valid.\n */\n protected validatePKParam = (pkParamValue: string): boolean => {\n let validPkParam = true;\n if (pkParamValue.length <= 0) {\n this.logger.error('Primary Key is an Empty String', { pkParamValue });\n validPkParam = false;\n } else if (pkParamValue === 'undefined') {\n this.logger.error('Primary Key is the string \\'undefined\\'', { pkParamValue });\n validPkParam = false;\n }\n return validPkParam;\n }\n\n}\n","import {\n ComKey, Item, ItemQuery, LocKey, LocKeyArray, paramsToQuery, PriKey, QueryParams, validatePK\n} from \"@fjell/core\";\nimport { Request, Response } from \"express\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport LibLogger from \"@/logger\";\nimport { Contained } from \"@fjell/lib\";\n\nconst logger = LibLogger.get('CItemRouter');\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class CItemRouter<\n T extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> extends ItemRouter<S, L1, L2, L3, L4, L5> {\n\n private parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>;\n\n constructor(\n lib: Contained.Operations<T, S, L1, L2, L3, L4, L5>,\n type: S,\n parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,\n options: ItemRouterOptions = {},\n ) {\n super(lib, type, options);\n this.parentRoute = parentRoute;\n }\n\n public hasParent(): boolean {\n return !!this.parentRoute;\n }\n\n public getIk(res: Response): ComKey<S, L1, L2, L3, L4, L5> {\n const pri = this.getPk(res) as PriKey<S>;\n const loc = this.getLocations(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n return { kt: pri.kt, pk: pri.pk, loc }\n }\n\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n /**\n * A location key array is passed to a child router to provide contextfor the items it will\n * be working with. It is always a concatenation of \"My LKA\" + \"Parent LKA\" which will\n * bubble all the way up to the root Primary.\n */\n let lka: LocKey<S | L1 | L2 | L3 | L4>[] = [this.getLk(res)];\n lka = lka.concat(this.parentRoute.getLKA(res) as LocKey<S | L1 | L2 | L3 | L4>[]);\n return lka as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> {\n return this.parentRoute.getLKA(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n }\n\n protected createItem = async (req: Request, res: Response) => {\n logger.trace('Creating Item 2',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const itemToCreate = this.convertDates(req.body as Item<S, L1, L2, L3, L4, L5>);\n let item =\n validatePK(await this.lib.create(\n itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n item = await this.postCreateItem(item);\n return res.json(item);\n };\n\n /* eslint-disable */\n protected findItems = async (req: Request, res: Response) => {\n logger.trace('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n\n let items: Item<S, L1, L2, L3, L4, L5>[] = [];\n\n if( finder ) { \n // If finder is defined? Call a finder.\n items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));\n } else {\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery, this.getLocations(res));\n }\n\n return res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));\n };\n /* eslint-enable */\n\n}\n","import { Item, ItemQuery, paramsToQuery, PriKey, QueryParams, validatePK } from \"@fjell/core\";\nimport { Primary } from \"@fjell/lib\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport { Request, Response } from \"express\";\nimport LibLogger from \"@/logger\";\n\nconst logger = LibLogger.get('PItemRouter');\n\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter<S> {\n\n constructor(lib: Primary.Operations<T, S>, keyType: S, options: ItemRouterOptions = {}) {\n super(lib, keyType, options);\n }\n\n public getIk(res: Response): PriKey<S> {\n const pri = this.getPk(res) as PriKey<S>;\n return pri\n }\n\n public createItem = async (req: Request, res: Response) => {\n logger.default('Creating Item 2', { body: req.body, query: req.query, params: req.params, locals: res.locals });\n const itemToCreate = this.convertDates(req.body as Item<S>);\n let item =\n validatePK(await this.lib.create(itemToCreate), this.getPkType()) as Item<S>;\n item = await this.postCreateItem(item);\n return res.json(item);\n };\n\n /* eslint-disable */\n protected findItems = async (req: Request, res: Response) => {\n logger.default('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n let items: Item<S>[] = [];\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n\n if( finder ) { \n // If finder is defined? Call a finder.\n logger.default('Finding Items with a finder', { finder, finderParams });\n items = await this.lib.find(finder, JSON.parse(finderParams));\n } else {\n logger.default('Finding Items with a query', { query: req.query });\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery);\n }\n\n return res.json(items.map((item: Item<S>) => validatePK(item, this.getPkType())));\n };\n /* eslint-enable */\n}\n"],"names":["LibLogger","Logging","getLogger","ItemRouter","getLk","res","kt","keyType","lk","locals","getPkParam","getLKA","getPk","cPK","getPkType","getLocations","Error","getIk","logger","debug","router","Router","configure","lib","options","_define_property","childRouters","itemActions","postItemAction","req","default","query","params","ik","actionKey","path","substring","lastIndexOf","error","status","json","item","validatePK","get","body","err","message","stack","pkType","findItems","post","createItem","allActions","configureAllActions","Object","keys","forEach","itemRouter","getItem","put","updateItem","delete","deleteItem","configureItemActions","pkParam","use","validatePrimaryKeyValue","configureChildRouters","next","pkParamValue","validatePKParam","addChildRouter","postCreateItem","removedItem","remove","NotFoundError","itemToUpdate","convertDates","retItem","update","events","key","assign","deepmerge","at","Date","validPkParam","length","CItemRouter","hasParent","parentRoute","pri","loc","pk","lka","concat","type","trace","itemToCreate","create","locations","finder","finderParams","items","find","JSON","parse","itemQuery","paramsToQuery","all","map","PItemRouter"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/logger.ts","../src/ItemRouter.ts","../src/CItemRouter.ts","../src/PItemRouter.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n","import {\n ComKey,\n cPK,\n Item,\n ItemEvent,\n ItemProperties,\n LocKey,\n LocKeyArray,\n PriKey,\n validatePK\n} from \"@fjell/core\";\nimport { NotFoundError, Operations } from \"@fjell/lib\";\nimport deepmerge from \"deepmerge\";\nimport { Request, RequestHandler, Response, Router } from \"express\";\nimport LibLogger from \"./logger\";\n\nexport type ItemRouterOptions = Record<string, never>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type ActionMethod = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any, body: any) =>\n Promise<Item<S, L1, L2, L3, L4, L5>>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type AllActionMethods = Array<RequestHandler>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type FacetMethod = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any) =>\n Promise<any>;\n\nexport class ItemRouter<\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> {\n\n protected lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;\n private keyType: S;\n protected options: ItemRouterOptions;\n private childRouters: Record<string, Router> = {};\n private logger;\n private itemActions: Record<string, ActionMethod> | undefined;\n private itemFacets: Record<string, FacetMethod> | undefined;\n\n constructor(\n lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,\n keyType: S,\n options: ItemRouterOptions = {}\n ) {\n this.lib = lib;\n this.keyType = keyType;\n this.options = options;\n this.logger = LibLogger.get(\"ItemRouter\", keyType);\n }\n\n public getPkType = (): S => {\n return this.keyType;\n }\n\n protected getPkParam = (): string => {\n return `${this.getPkType()}Pk`;\n }\n\n protected getLk(res: Response): LocKey<S> {\n return { kt: this.keyType, lk: res.locals[this.getPkParam()] };\n }\n\n // this is meant to be consumed by children routers\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n return [this.getLk(res)] as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getPk(res: Response): PriKey<S> {\n return cPK<S>(res.locals[this.getPkParam()], this.getPkType());\n }\n\n // Unless this is a contained router, the locations will always be an empty array.\n /* eslint-disable */\n protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [] {\n throw new Error('Method not implemented in an abstract router');\n }\n /* eslint-enable */\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected getIk(res: Response): PriKey<S> | ComKey<S, L1, L2, L3, L4, L5> {\n throw new Error('Method not implemented in an abstract router');\n }\n\n protected postItemAction = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n if (!this.itemActions) {\n this.logger.error('Item Actions are not configured');\n res.status(500).json({ error: 'Item Actions are not configured' });\n return;\n }\n try {\n const item =\n validatePK(await this.lib.get(ik), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));\n } catch (err: any) {\n this.logger.error('Error in Item Action', { message: err?.message, stack: err?.stack });\n res.status(500).json(err);\n }\n }\n\n protected getItemFacet = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n if (!this.itemFacets) {\n this.logger.error('Item Facets are not configured');\n res.status(500).json({ error: 'Item Facets are not configured' });\n return;\n }\n try {\n const item =\n validatePK(await this.lib.get(ik), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n await this.itemFacets[facetKey](req, res, item, req.params);\n } catch (err: any) {\n this.logger.error('Error in Item Facet', { message: err?.message, stack: err?.stack });\n res.status(500).json(err);\n }\n }\n\n private configure = (router: Router) => {\n this.logger.default('Configuring Router', { pkType: this.getPkType() });\n router.get('/', this.findItems);\n router.post('/', this.createItem);\n\n const allActions = this.configureAllActions();\n this.logger.debug('All Actions supplied to Router', { allActions });\n if (allActions) {\n Object.keys(allActions).forEach((actionKey) => {\n this.logger.default('Configuring All Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n router.post(`/${actionKey}`, ...allActions[actionKey]);\n });\n }\n\n const itemRouter = Router();\n itemRouter.get('/', this.getItem);\n itemRouter.put('/', this.updateItem);\n itemRouter.delete('/', this.deleteItem);\n\n this.itemActions = this.configureItemActions();\n this.logger.debug('Item Actions supplied to Router', { itemActions: this.itemActions });\n if (this.itemActions) {\n Object.keys(this.itemActions).forEach((actionKey) => {\n this.logger.default('Configuring Item Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n itemRouter.post(`/${actionKey}`, this.postItemAction)\n });\n }\n\n this.itemFacets = this.configureItemFacets();\n this.logger.debug('Item Facets supplied to Router', { itemFacets: this.itemFacets });\n if (this.itemFacets) {\n Object.keys(this.itemFacets).forEach((facetKey) => {\n this.logger.default('Configuring Item Facet', { facetKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n itemRouter.get(`/${facetKey}`, this.getItemFacet)\n });\n }\n\n this.logger.default('Configuring Item Operations under PK Param', { pkParam: this.getPkParam() });\n router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);\n\n if (this.childRouters) {\n this.configureChildRouters(itemRouter, this.childRouters);\n }\n return router;\n }\n\n private validatePrimaryKeyValue = (req: Request, res: Response, next: any) => {\n const pkParamValue = req.params[this.getPkParam()];\n if (this.validatePKParam(pkParamValue)) {\n res.locals[this.getPkParam()] = pkParamValue;\n next();\n } else {\n this.logger.error('Invalid Primary Key', { pkParamValue, path: req?.path });\n res.status(500).json({ error: 'Invalid Primary Key', path: req?.path });\n }\n }\n\n private configureChildRouters = (router: Router, childRouters: Record<string, Router>) => {\n for (const path in childRouters) {\n this.logger.default('Configuring Child Router at Path', { path });\n\n router.use(`/${path}`, childRouters[path]);\n }\n return router;\n }\n\n public addChildRouter = (path: string, router: Router) => {\n this.childRouters[path] = router;\n }\n\n /* istanbul ignore next */\n protected configureItemActions(): Record<string, ActionMethod> {\n this.logger.debug('ARouter - No Item Actions Configured');\n return {};\n }\n\n /* istanbul ignore next */\n protected configureItemFacets(): Record<string, FacetMethod> {\n this.logger.debug('ARouter - No Item Facets Configured');\n return {};\n }\n\n /* istanbul ignore next */\n protected configureAllActions(): Record<string, AllActionMethods> {\n this.logger.debug('ARouter - No All Actions Configured');\n return {};\n }\n\n /* istanbul ignore next */\n public getRouter(): Router {\n const router = Router();\n this.configure(router);\n return router;\n }\n\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected createItem = async (req: Request, res: Response): Promise<void> => {\n throw new Error('Method not implemented in an abstract router');\n };\n\n // TODO: Probably a better way to do this, but this postCreate hook only needs the item.\n /* istanbul ignore next */\n public postCreateItem = async (item: Item<S, L1, L2, L3, L4, L5>): Promise<Item<S, L1, L2, L3, L4, L5>> => {\n this.logger.default('Post Create Item', { item });\n return item;\n };\n\n protected deleteItem = async (req: Request, res: Response): Promise<void> => {\n this.logger.default('Deleting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n const removedItem = await this.lib.remove(ik);\n const item = validatePK(removedItem, this.getPkType());\n res.json(item);\n };\n\n /* eslint-disable */\n /* istanbul ignore next */\n protected findItems = async (req: Request, res: Response): Promise<void> => {\n throw new Error('Method not implemented in an abstract router');\n };\n /* eslint-enable */\n\n protected getItem = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n try {\n // TODO: What error does validate PK throw, when can that fail?\n const item = validatePK(await this.lib.get(ik), this.getPkType());\n res.json(item);\n } catch (err: any) {\n if (err instanceof NotFoundError) {\n this.logger.error('Item Not Found', { ik, message: err?.message, stack: err?.stack });\n res.status(404).json({\n ik,\n message: \"Item Not Found\",\n });\n } else {\n this.logger.error('General Error', { ik, message: err?.message, stack: err?.stack });\n res.status(500).json({\n ik,\n message: \"General Error\",\n });\n }\n }\n }\n\n protected updateItem = async (req: Request, res: Response) => {\n this.logger.default('Updating Item',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const itemToUpdate = this.convertDates(req.body as ItemProperties<S, L1, L2, L3, L4, L5>);\n const retItem = validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());\n res.json(retItem);\n };\n\n public convertDates = (item: Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>):\n Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5> => {\n const events = item.events as Record<string, ItemEvent>;\n this.logger.default('Converting Dates', { item });\n if (events) {\n Object.keys(events).forEach((key: string) => {\n Object.assign(events, {\n [key]: deepmerge(events[key], { at: events[key].at ? new Date(events[key].at) : null })\n });\n });\n }\n Object.assign(item, { events });\n return item;\n };\n\n // TODO: Maybe just simplify this and require that everything is a UUID?\n /**\n * This method might be an annoyance, but we need to capture a few cases where someone passes\n * a PK parameter that has an odd string in it.\n *\n * @param pkParamValue The value of the primary key parameter\n * @returns if the value is valid.\n */\n protected validatePKParam = (pkParamValue: string): boolean => {\n let validPkParam = true;\n if (pkParamValue.length <= 0) {\n this.logger.error('Primary Key is an Empty String', { pkParamValue });\n validPkParam = false;\n } else if (pkParamValue === 'undefined') {\n this.logger.error('Primary Key is the string \\'undefined\\'', { pkParamValue });\n validPkParam = false;\n }\n return validPkParam;\n }\n\n}\n","import {\n ComKey, Item, ItemQuery, LocKey, LocKeyArray, paramsToQuery, PriKey, QueryParams, validatePK\n} from \"@fjell/core\";\nimport { Request, Response } from \"express\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport LibLogger from \"@/logger\";\nimport { Contained } from \"@fjell/lib\";\n\nconst logger = LibLogger.get('CItemRouter');\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class CItemRouter<\n T extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> extends ItemRouter<S, L1, L2, L3, L4, L5> {\n\n private parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>;\n\n constructor(\n lib: Contained.Operations<T, S, L1, L2, L3, L4, L5>,\n type: S,\n parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,\n options: ItemRouterOptions = {},\n ) {\n super(lib, type, options);\n this.parentRoute = parentRoute;\n }\n\n public hasParent(): boolean {\n return !!this.parentRoute;\n }\n\n public getIk(res: Response): ComKey<S, L1, L2, L3, L4, L5> {\n const pri = this.getPk(res) as PriKey<S>;\n const loc = this.getLocations(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n return { kt: pri.kt, pk: pri.pk, loc }\n }\n\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n /**\n * A location key array is passed to a child router to provide contextfor the items it will\n * be working with. It is always a concatenation of \"My LKA\" + \"Parent LKA\" which will\n * bubble all the way up to the root Primary.\n */\n let lka: LocKey<S | L1 | L2 | L3 | L4>[] = [this.getLk(res)];\n lka = lka.concat(this.parentRoute.getLKA(res) as LocKey<S | L1 | L2 | L3 | L4>[]);\n return lka as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> {\n return this.parentRoute.getLKA(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n }\n\n protected createItem = async (req: Request, res: Response) => {\n logger.trace('Creating Item 2',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const itemToCreate = this.convertDates(req.body as Item<S, L1, L2, L3, L4, L5>);\n let item =\n validatePK(await this.lib.create(\n itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n item = await this.postCreateItem(item);\n res.json(item);\n };\n\n protected findItems = async (req: Request, res: Response) => {\n logger.trace('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n const one = query['one'] as string;\n\n let items: Item<S, L1, L2, L3, L4, L5>[] = [];\n\n if (finder) {\n // If finder is defined? Call a finder.\n logger.trace('Finding Items with a finder', { finder, finderParams, one });\n\n if (one === 'true') {\n const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams), this.getLocations(res));\n items = item ? [item] : [];\n } else {\n items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));\n }\n } else {\n logger.trace('Finding Items with a query', { query: req.query });\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery, this.getLocations(res));\n }\n\n res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));\n };\n\n}\n","import { Item, ItemQuery, paramsToQuery, PriKey, QueryParams, validatePK } from \"@fjell/core\";\nimport { Primary } from \"@fjell/lib\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport { Request, Response } from \"express\";\nimport LibLogger from \"@/logger\";\n\nconst logger = LibLogger.get('PItemRouter');\n\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter<S> {\n\n constructor(lib: Primary.Operations<T, S>, keyType: S, options: ItemRouterOptions = {}) {\n super(lib, keyType, options);\n }\n\n public getIk(res: Response): PriKey<S> {\n const pri = this.getPk(res) as PriKey<S>;\n return pri\n }\n\n public createItem = async (req: Request, res: Response) => {\n logger.default('Creating Item 2', { body: req.body, query: req.query, params: req.params, locals: res.locals });\n const itemToCreate = this.convertDates(req.body as Item<S>);\n let item =\n validatePK(await this.lib.create(itemToCreate), this.getPkType()) as Item<S>;\n item = await this.postCreateItem(item);\n res.json(item);\n };\n\n protected findItems = async (req: Request, res: Response) => {\n logger.default('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n let items: Item<S>[] = [];\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n const one = query['one'] as string;\n\n if (finder) {\n // If finder is defined? Call a finder.\n logger.default('Finding Items with a finder', { finder, finderParams, one });\n\n if (one === 'true') {\n const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams));\n items = item ? [item] : [];\n } else {\n items = await this.lib.find(finder, JSON.parse(finderParams));\n }\n } else {\n logger.default('Finding Items with a query', { query: req.query });\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery);\n }\n\n res.json(items.map((item: Item<S>) => validatePK(item, this.getPkType())));\n };\n\n}\n"],"names":["LibLogger","Logging","getLogger","ItemRouter","getLk","res","kt","keyType","lk","locals","getPkParam","getLKA","getPk","cPK","getPkType","getLocations","Error","getIk","logger","debug","router","Router","configure","lib","options","_define_property","childRouters","itemActions","itemFacets","postItemAction","req","default","query","params","ik","actionKey","path","substring","lastIndexOf","error","status","json","item","validatePK","get","body","err","message","stack","getItemFacet","facetKey","pkType","findItems","post","createItem","allActions","configureAllActions","Object","keys","forEach","itemRouter","getItem","put","updateItem","delete","deleteItem","configureItemActions","configureItemFacets","pkParam","use","validatePrimaryKeyValue","configureChildRouters","next","pkParamValue","validatePKParam","addChildRouter","postCreateItem","removedItem","remove","NotFoundError","itemToUpdate","convertDates","retItem","update","events","key","assign","deepmerge","at","Date","validPkParam","length","CItemRouter","hasParent","parentRoute","pri","loc","pk","lka","concat","type","trace","itemToCreate","create","locations","finder","finderParams","one","items","findOne","JSON","parse","find","itemQuery","paramsToQuery","all","map","PItemRouter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjell/express-router",
3
- "version": "4.4.1",
3
+ "version": "4.4.2",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Express Router for Fjell",
6
6
  "engines": {
@@ -18,50 +18,26 @@
18
18
  "type": "module",
19
19
  "dependencies": {
20
20
  "@fjell/core": "^4.4.3",
21
- "@fjell/lib": "^4.4.1",
21
+ "@fjell/lib": "^4.4.2",
22
22
  "@fjell/logging": "^4.4.3",
23
- "@google-cloud/firestore": "^7.11.1",
24
- "cors": "^2.8.5",
25
- "dayjs": "^1.11.13",
26
23
  "deepmerge": "^4.3.1",
27
- "dotenv": "^16.5.0",
28
- "express": "^4.21.2",
29
- "multer": "1.4.5-lts.2",
30
- "nodemailer": "^6.10.1",
31
- "response-time": "^2.3.3",
32
- "specifier-resolution-node": "^1.1.4",
33
- "supertest": "^7.1.1",
34
- "winston": "^3.17.0"
24
+ "express": "^5.1.0"
35
25
  },
36
26
  "devDependencies": {
37
- "@babel/preset-env": "^7.27.2",
38
- "@babel/preset-react": "^7.27.1",
39
- "@babel/preset-typescript": "^7.27.1",
40
27
  "@eslint/eslintrc": "^3.3.1",
41
28
  "@eslint/js": "^9.29.0",
42
- "@jest/globals": "^29.7.0",
43
- "@swc/core": "^1.12.1",
44
- "@tsconfig/recommended": "^1.0.9",
45
- "@types/cors": "^2.8.19",
46
- "@types/express": "^4.17.23",
47
- "@types/jest": "^29.5.14",
48
- "@types/multer": "^1.4.13",
49
- "@types/node": "^20.19.1",
50
- "@types/nodemailer": "^6.4.17",
51
- "@types/react": "^18.3.23",
52
- "@types/response-time": "^2.3.9",
29
+ "@swc/core": "^1.12.5",
30
+ "@tsconfig/recommended": "^1.0.10",
31
+ "@types/express": "^5.0.3",
32
+ "@types/node": "^24.0.3",
53
33
  "@typescript-eslint/eslint-plugin": "^8.34.1",
54
34
  "@typescript-eslint/parser": "^8.34.1",
55
35
  "@vitest/coverage-v8": "^3.2.4",
56
36
  "@vitest/ui": "^3.2.4",
57
- "concurrently": "^9.1.2",
58
37
  "eslint": "^9.29.0",
59
- "jest": "^29.7.0",
60
38
  "nodemon": "^3.1.10",
61
39
  "rimraf": "^6.0.1",
62
- "ts-jest": "^29.4.0",
63
40
  "ts-node": "^10.9.2",
64
- "tsc-alias": "^1.8.16",
65
41
  "typescript": "^5.8.3",
66
42
  "vite": "^6.3.5",
67
43
  "vite-plugin-dts": "^4.5.4",
@@ -74,6 +50,7 @@
74
50
  },
75
51
  "scripts": {
76
52
  "build": "tsc --noEmit && vite build",
53
+ "dev": "nodemon --watch src --ext ts --exec 'pnpm build'",
77
54
  "lint": "eslint . --ext .ts --fix",
78
55
  "clean": "rimraf dist",
79
56
  "test": "pnpm run lint && vitest run --coverage"
@@ -66,30 +66,37 @@ export class CItemRouter<
66
66
  validatePK(await this.lib.create(
67
67
  itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;
68
68
  item = await this.postCreateItem(item);
69
- return res.json(item);
69
+ res.json(item);
70
70
  };
71
71
 
72
- /* eslint-disable */
73
72
  protected findItems = async (req: Request, res: Response) => {
74
73
  logger.trace('Finding Items', { query: req.query, params: req.params, locals: res.locals });
75
74
 
76
75
  const query: ParsedQuery = req.query as unknown as ParsedQuery;
77
76
  const finder = query['finder'] as string;
78
77
  const finderParams = query['finderParams'] as string;
78
+ const one = query['one'] as string;
79
79
 
80
80
  let items: Item<S, L1, L2, L3, L4, L5>[] = [];
81
81
 
82
- if( finder ) {
82
+ if (finder) {
83
83
  // If finder is defined? Call a finder.
84
- items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
84
+ logger.trace('Finding Items with a finder', { finder, finderParams, one });
85
+
86
+ if (one === 'true') {
87
+ const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams), this.getLocations(res));
88
+ items = item ? [item] : [];
89
+ } else {
90
+ items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
91
+ }
85
92
  } else {
93
+ logger.trace('Finding Items with a query', { query: req.query });
86
94
  // TODO: This is once of the more important places to perform some validaation and feedback
87
95
  const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);
88
96
  items = await this.lib.all(itemQuery, this.getLocations(res));
89
97
  }
90
98
 
91
- return res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));
99
+ res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));
92
100
  };
93
- /* eslint-enable */
94
101
 
95
102
  }
package/src/ItemRouter.ts CHANGED
@@ -30,6 +30,17 @@ export type ActionMethod = <
30
30
  // TODO: body is in the request, it's not needed in the parameters
31
31
  export type AllActionMethods = Array<RequestHandler>;
32
32
 
33
+ // TODO: body is in the request, it's not needed in the parameters
34
+ export type FacetMethod = <
35
+ S extends string,
36
+ L1 extends string = never,
37
+ L2 extends string = never,
38
+ L3 extends string = never,
39
+ L4 extends string = never,
40
+ L5 extends string = never
41
+ >(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any) =>
42
+ Promise<any>;
43
+
33
44
  export class ItemRouter<
34
45
  S extends string,
35
46
  L1 extends string = never,
@@ -45,6 +56,7 @@ export class ItemRouter<
45
56
  private childRouters: Record<string, Router> = {};
46
57
  private logger;
47
58
  private itemActions: Record<string, ActionMethod> | undefined;
59
+ private itemFacets: Record<string, FacetMethod> | undefined;
48
60
 
49
61
  constructor(
50
62
  lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,
@@ -96,15 +108,35 @@ export class ItemRouter<
96
108
  const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);
97
109
  if (!this.itemActions) {
98
110
  this.logger.error('Item Actions are not configured');
99
- return res.status(500).json({ error: 'Item Actions are not configured' });
111
+ res.status(500).json({ error: 'Item Actions are not configured' });
112
+ return;
100
113
  }
101
114
  try {
102
115
  const item =
103
116
  validatePK(await this.lib.get(ik), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;
104
- return res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
117
+ res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
105
118
  } catch (err: any) {
106
119
  this.logger.error('Error in Item Action', { message: err?.message, stack: err?.stack });
107
- return res.status(500).json(err);
120
+ res.status(500).json(err);
121
+ }
122
+ }
123
+
124
+ protected getItemFacet = async (req: Request, res: Response) => {
125
+ this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });
126
+ const ik = this.getIk(res);
127
+ const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);
128
+ if (!this.itemFacets) {
129
+ this.logger.error('Item Facets are not configured');
130
+ res.status(500).json({ error: 'Item Facets are not configured' });
131
+ return;
132
+ }
133
+ try {
134
+ const item =
135
+ validatePK(await this.lib.get(ik), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;
136
+ await this.itemFacets[facetKey](req, res, item, req.params);
137
+ } catch (err: any) {
138
+ this.logger.error('Error in Item Facet', { message: err?.message, stack: err?.stack });
139
+ res.status(500).json(err);
108
140
  }
109
141
  }
110
142
 
@@ -138,6 +170,16 @@ export class ItemRouter<
138
170
  });
139
171
  }
140
172
 
173
+ this.itemFacets = this.configureItemFacets();
174
+ this.logger.debug('Item Facets supplied to Router', { itemFacets: this.itemFacets });
175
+ if (this.itemFacets) {
176
+ Object.keys(this.itemFacets).forEach((facetKey) => {
177
+ this.logger.default('Configuring Item Facet', { facetKey });
178
+ // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers
179
+ itemRouter.get(`/${facetKey}`, this.getItemFacet)
180
+ });
181
+ }
182
+
141
183
  this.logger.default('Configuring Item Operations under PK Param', { pkParam: this.getPkParam() });
142
184
  router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);
143
185
 
@@ -177,6 +219,12 @@ export class ItemRouter<
177
219
  return {};
178
220
  }
179
221
 
222
+ /* istanbul ignore next */
223
+ protected configureItemFacets(): Record<string, FacetMethod> {
224
+ this.logger.debug('ARouter - No Item Facets Configured');
225
+ return {};
226
+ }
227
+
180
228
  /* istanbul ignore next */
181
229
  protected configureAllActions(): Record<string, AllActionMethods> {
182
230
  this.logger.debug('ARouter - No All Actions Configured');
@@ -192,7 +240,7 @@ export class ItemRouter<
192
240
 
193
241
  /* istanbul ignore next */
194
242
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
195
- protected createItem = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {
243
+ protected createItem = async (req: Request, res: Response): Promise<void> => {
196
244
  throw new Error('Method not implemented in an abstract router');
197
245
  };
198
246
 
@@ -203,17 +251,17 @@ export class ItemRouter<
203
251
  return item;
204
252
  };
205
253
 
206
- protected deleteItem = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {
254
+ protected deleteItem = async (req: Request, res: Response): Promise<void> => {
207
255
  this.logger.default('Deleting Item', { query: req.query, params: req.params, locals: res.locals });
208
256
  const ik = this.getIk(res);
209
257
  const removedItem = await this.lib.remove(ik);
210
258
  const item = validatePK(removedItem, this.getPkType());
211
- return res.json(item);
259
+ res.json(item);
212
260
  };
213
261
 
214
262
  /* eslint-disable */
215
263
  /* istanbul ignore next */
216
- protected findItems = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {
264
+ protected findItems = async (req: Request, res: Response): Promise<void> => {
217
265
  throw new Error('Method not implemented in an abstract router');
218
266
  };
219
267
  /* eslint-enable */
@@ -224,17 +272,17 @@ export class ItemRouter<
224
272
  try {
225
273
  // TODO: What error does validate PK throw, when can that fail?
226
274
  const item = validatePK(await this.lib.get(ik), this.getPkType());
227
- return res.json(item);
275
+ res.json(item);
228
276
  } catch (err: any) {
229
277
  if (err instanceof NotFoundError) {
230
278
  this.logger.error('Item Not Found', { ik, message: err?.message, stack: err?.stack });
231
- return res.status(404).json({
279
+ res.status(404).json({
232
280
  ik,
233
281
  message: "Item Not Found",
234
282
  });
235
283
  } else {
236
284
  this.logger.error('General Error', { ik, message: err?.message, stack: err?.stack });
237
- return res.status(500).json({
285
+ res.status(500).json({
238
286
  ik,
239
287
  message: "General Error",
240
288
  });
@@ -248,7 +296,7 @@ export class ItemRouter<
248
296
  const ik = this.getIk(res);
249
297
  const itemToUpdate = this.convertDates(req.body as ItemProperties<S, L1, L2, L3, L4, L5>);
250
298
  const retItem = validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());
251
- return res.json(retItem);
299
+ res.json(retItem);
252
300
  };
253
301
 
254
302
  public convertDates = (item: Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>):
@@ -27,10 +27,9 @@ export class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter
27
27
  let item =
28
28
  validatePK(await this.lib.create(itemToCreate), this.getPkType()) as Item<S>;
29
29
  item = await this.postCreateItem(item);
30
- return res.json(item);
30
+ res.json(item);
31
31
  };
32
32
 
33
- /* eslint-disable */
34
33
  protected findItems = async (req: Request, res: Response) => {
35
34
  logger.default('Finding Items', { query: req.query, params: req.params, locals: res.locals });
36
35
 
@@ -39,11 +38,18 @@ export class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter
39
38
  const query: ParsedQuery = req.query as unknown as ParsedQuery;
40
39
  const finder = query['finder'] as string;
41
40
  const finderParams = query['finderParams'] as string;
41
+ const one = query['one'] as string;
42
42
 
43
- if( finder ) {
43
+ if (finder) {
44
44
  // If finder is defined? Call a finder.
45
- logger.default('Finding Items with a finder', { finder, finderParams });
46
- items = await this.lib.find(finder, JSON.parse(finderParams));
45
+ logger.default('Finding Items with a finder', { finder, finderParams, one });
46
+
47
+ if (one === 'true') {
48
+ const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams));
49
+ items = item ? [item] : [];
50
+ } else {
51
+ items = await this.lib.find(finder, JSON.parse(finderParams));
52
+ }
47
53
  } else {
48
54
  logger.default('Finding Items with a query', { query: req.query });
49
55
  // TODO: This is once of the more important places to perform some validaation and feedback
@@ -51,7 +57,7 @@ export class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter
51
57
  items = await this.lib.all(itemQuery);
52
58
  }
53
59
 
54
- return res.json(items.map((item: Item<S>) => validatePK(item, this.getPkType())));
60
+ res.json(items.map((item: Item<S>) => validatePK(item, this.getPkType())));
55
61
  };
56
- /* eslint-enable */
62
+
57
63
  }