@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":"ItemRouter.js","sources":["../src/ItemRouter.ts"],"sourcesContent":["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"],"names":["ItemRouter","getLk","res","kt","keyType","lk","locals","getPkParam","getLKA","getPk","cPK","getPkType","getLocations","Error","getIk","logger","debug","router","Router","configure","lib","options","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","LibLogger"],"mappings":"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"}
1
+ {"version":3,"file":"ItemRouter.js","sources":["../src/ItemRouter.ts"],"sourcesContent":["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"],"names":["ItemRouter","getLk","res","kt","keyType","lk","locals","getPkParam","getLKA","getPk","cPK","getPkType","getLocations","Error","getIk","logger","debug","router","Router","configure","lib","options","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","LibLogger"],"mappings":"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"}
@@ -36,8 +36,8 @@ class PItemRouter extends ItemRouter.ItemRouter {
36
36
  const itemToCreate = this.convertDates(req.body);
37
37
  let item = core.validatePK(await this.lib.create(itemToCreate), this.getPkType());
38
38
  item = await this.postCreateItem(item);
39
- return res.json(item);
40
- }), /* eslint-disable */ _define_property(this, "findItems", async (req, res)=>{
39
+ res.json(item);
40
+ }), _define_property(this, "findItems", async (req, res)=>{
41
41
  logger.default('Finding Items', {
42
42
  query: req.query,
43
43
  params: req.params,
@@ -47,13 +47,22 @@ class PItemRouter extends ItemRouter.ItemRouter {
47
47
  const query = req.query;
48
48
  const finder = query['finder'];
49
49
  const finderParams = query['finderParams'];
50
+ const one = query['one'];
50
51
  if (finder) {
51
52
  // If finder is defined? Call a finder.
52
53
  logger.default('Finding Items with a finder', {
53
54
  finder,
54
- finderParams
55
+ finderParams,
56
+ one
55
57
  });
56
- items = await this.lib.find(finder, JSON.parse(finderParams));
58
+ if (one === 'true') {
59
+ const item = await this.lib.findOne(finder, JSON.parse(finderParams));
60
+ items = item ? [
61
+ item
62
+ ] : [];
63
+ } else {
64
+ items = await this.lib.find(finder, JSON.parse(finderParams));
65
+ }
57
66
  } else {
58
67
  logger.default('Finding Items with a query', {
59
68
  query: req.query
@@ -62,7 +71,7 @@ class PItemRouter extends ItemRouter.ItemRouter {
62
71
  const itemQuery = core.paramsToQuery(req.query);
63
72
  items = await this.lib.all(itemQuery);
64
73
  }
65
- return res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
74
+ res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
66
75
  });
67
76
  }
68
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PItemRouter.cjs","sources":["../src/PItemRouter.ts"],"sourcesContent":["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":["logger","LibLogger","get","PItemRouter","ItemRouter","getIk","res","pri","getPk","lib","keyType","options","createItem","req","default","body","query","params","locals","itemToCreate","convertDates","item","validatePK","create","getPkType","postCreateItem","json","findItems","items","finder","finderParams","find","JSON","parse","itemQuery","paramsToQuery","all","map"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAMA,MAAMA,MAAAA,GAASC,gBAAUC,CAAAA,GAAG,CAAC,aAAA,CAAA;AAMtB,MAAMC,WAAyDC,SAAAA,qBAAAA,CAAAA;AAM7DC,IAAAA,KAAAA,CAAMC,GAAa,EAAa;AACrC,QAAA,MAAMC,GAAM,GAAA,IAAI,CAACC,KAAK,CAACF,GAAAA,CAAAA;QACvB,OAAOC,GAAAA;AACT;AAPA,IAAA,WAAA,CAAYE,GAA6B,EAAEC,OAAU,EAAEC,OAA6B,GAAA,EAAE,CAAE;AACtF,QAAA,KAAK,CAACF,GAAKC,EAAAA,OAAAA,EAASC,UAQtB,gBAAOC,CAAAA,IAAAA,EAAAA,YAAAA,EAAa,OAAOC,GAAcP,EAAAA,GAAAA,GAAAA;YACvCN,MAAOc,CAAAA,OAAO,CAAC,iBAAmB,EAAA;AAAEC,gBAAAA,IAAAA,EAAMF,IAAIE,IAAI;AAAEC,gBAAAA,KAAAA,EAAOH,IAAIG,KAAK;AAAEC,gBAAAA,MAAAA,EAAQJ,IAAII,MAAM;AAAEC,gBAAAA,MAAAA,EAAQZ,IAAIY;AAAO,aAAA,CAAA;AAC7G,YAAA,MAAMC,eAAe,IAAI,CAACC,YAAY,CAACP,IAAIE,IAAI,CAAA;AAC/C,YAAA,IAAIM,IACFC,GAAAA,eAAAA,CAAW,MAAM,IAAI,CAACb,GAAG,CAACc,MAAM,CAACJ,YAAAA,CAAAA,EAAe,IAAI,CAACK,SAAS,EAAA,CAAA;AAChEH,YAAAA,IAAAA,GAAO,MAAM,IAAI,CAACI,cAAc,CAACJ,IAAAA,CAAAA;YACjC,OAAOf,GAAAA,CAAIoB,IAAI,CAACL,IAAAA,CAAAA;AAClB,SAAA,CAAA,uBAGA,gBAAUM,CAAAA,IAAAA,EAAAA,WAAAA,EAAY,OAAOd,GAAcP,EAAAA,GAAAA,GAAAA;YACzCN,MAAOc,CAAAA,OAAO,CAAC,eAAiB,EAAA;AAAEE,gBAAAA,KAAAA,EAAOH,IAAIG,KAAK;AAAEC,gBAAAA,MAAAA,EAAQJ,IAAII,MAAM;AAAEC,gBAAAA,MAAAA,EAAQZ,IAAIY;AAAO,aAAA,CAAA;AAE3F,YAAA,IAAIU,QAAmB,EAAE;YAEzB,MAAMZ,KAAAA,GAAqBH,IAAIG,KAAK;YACpC,MAAMa,MAAAA,GAASb,KAAK,CAAC,QAAS,CAAA;YAC9B,MAAMc,YAAAA,GAAed,KAAK,CAAC,cAAe,CAAA;AAE1C,YAAA,IAAIa,MAAS,EAAA;;gBAEX7B,MAAOc,CAAAA,OAAO,CAAC,6BAA+B,EAAA;AAAEe,oBAAAA,MAAAA;AAAQC,oBAAAA;AAAa,iBAAA,CAAA;gBACrEF,KAAQ,GAAA,MAAM,IAAI,CAACnB,GAAG,CAACsB,IAAI,CAACF,MAAAA,EAAQG,IAAKC,CAAAA,KAAK,CAACH,YAAAA,CAAAA,CAAAA;aAC1C,MAAA;gBACL9B,MAAOc,CAAAA,OAAO,CAAC,4BAA8B,EAAA;AAAEE,oBAAAA,KAAAA,EAAOH,IAAIG;AAAM,iBAAA,CAAA;;gBAEhE,MAAMkB,SAAAA,GAAuBC,kBAActB,CAAAA,GAAAA,CAAIG,KAAK,CAAA;AACpDY,gBAAAA,KAAAA,GAAQ,MAAM,IAAI,CAACnB,GAAG,CAAC2B,GAAG,CAACF,SAAAA,CAAAA;AAC7B;AAEA,YAAA,OAAO5B,GAAIoB,CAAAA,IAAI,CAACE,KAAAA,CAAMS,GAAG,CAAC,CAAChB,IAAAA,GAAkBC,eAAWD,CAAAA,IAAAA,EAAM,IAAI,CAACG,SAAS,EAAA,CAAA,CAAA,CAAA;AAC9E,SAAA,CAAA;AAtCA;AAwCF;;;;"}
1
+ {"version":3,"file":"PItemRouter.cjs","sources":["../src/PItemRouter.ts"],"sourcesContent":["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":["logger","LibLogger","get","PItemRouter","ItemRouter","getIk","res","pri","getPk","lib","keyType","options","createItem","req","default","body","query","params","locals","itemToCreate","convertDates","item","validatePK","create","getPkType","postCreateItem","json","findItems","items","finder","finderParams","one","findOne","JSON","parse","find","itemQuery","paramsToQuery","all","map"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAMA,MAAMA,MAAAA,GAASC,gBAAUC,CAAAA,GAAG,CAAC,aAAA,CAAA;AAMtB,MAAMC,WAAyDC,SAAAA,qBAAAA,CAAAA;AAM7DC,IAAAA,KAAAA,CAAMC,GAAa,EAAa;AACrC,QAAA,MAAMC,GAAM,GAAA,IAAI,CAACC,KAAK,CAACF,GAAAA,CAAAA;QACvB,OAAOC,GAAAA;AACT;AAPA,IAAA,WAAA,CAAYE,GAA6B,EAAEC,OAAU,EAAEC,OAA6B,GAAA,EAAE,CAAE;AACtF,QAAA,KAAK,CAACF,GAAKC,EAAAA,OAAAA,EAASC,UAQtB,gBAAOC,CAAAA,IAAAA,EAAAA,YAAAA,EAAa,OAAOC,GAAcP,EAAAA,GAAAA,GAAAA;YACvCN,MAAOc,CAAAA,OAAO,CAAC,iBAAmB,EAAA;AAAEC,gBAAAA,IAAAA,EAAMF,IAAIE,IAAI;AAAEC,gBAAAA,KAAAA,EAAOH,IAAIG,KAAK;AAAEC,gBAAAA,MAAAA,EAAQJ,IAAII,MAAM;AAAEC,gBAAAA,MAAAA,EAAQZ,IAAIY;AAAO,aAAA,CAAA;AAC7G,YAAA,MAAMC,eAAe,IAAI,CAACC,YAAY,CAACP,IAAIE,IAAI,CAAA;AAC/C,YAAA,IAAIM,IACFC,GAAAA,eAAAA,CAAW,MAAM,IAAI,CAACb,GAAG,CAACc,MAAM,CAACJ,YAAAA,CAAAA,EAAe,IAAI,CAACK,SAAS,EAAA,CAAA;AAChEH,YAAAA,IAAAA,GAAO,MAAM,IAAI,CAACI,cAAc,CAACJ,IAAAA,CAAAA;AACjCf,YAAAA,GAAAA,CAAIoB,IAAI,CAACL,IAAAA,CAAAA;SAGX,CAAA,EAAA,gBAAA,CAAA,IAAA,EAAUM,WAAY,EAAA,OAAOd,GAAcP,EAAAA,GAAAA,GAAAA;YACzCN,MAAOc,CAAAA,OAAO,CAAC,eAAiB,EAAA;AAAEE,gBAAAA,KAAAA,EAAOH,IAAIG,KAAK;AAAEC,gBAAAA,MAAAA,EAAQJ,IAAII,MAAM;AAAEC,gBAAAA,MAAAA,EAAQZ,IAAIY;AAAO,aAAA,CAAA;AAE3F,YAAA,IAAIU,QAAmB,EAAE;YAEzB,MAAMZ,KAAAA,GAAqBH,IAAIG,KAAK;YACpC,MAAMa,MAAAA,GAASb,KAAK,CAAC,QAAS,CAAA;YAC9B,MAAMc,YAAAA,GAAed,KAAK,CAAC,cAAe,CAAA;YAC1C,MAAMe,GAAAA,GAAMf,KAAK,CAAC,KAAM,CAAA;AAExB,YAAA,IAAIa,MAAQ,EAAA;;gBAEV7B,MAAOc,CAAAA,OAAO,CAAC,6BAA+B,EAAA;AAAEe,oBAAAA,MAAAA;AAAQC,oBAAAA,YAAAA;AAAcC,oBAAAA;AAAI,iBAAA,CAAA;AAE1E,gBAAA,IAAIA,QAAQ,MAAQ,EAAA;AAClB,oBAAA,MAAMV,IAAO,GAAA,MAAM,IAAK,CAACZ,GAAG,CAASuB,OAAO,CAACH,MAAAA,EAAQI,IAAKC,CAAAA,KAAK,CAACJ,YAAAA,CAAAA,CAAAA;AAChEF,oBAAAA,KAAAA,GAAQP,IAAO,GAAA;AAACA,wBAAAA;AAAK,qBAAA,GAAG,EAAE;iBACrB,MAAA;oBACLO,KAAQ,GAAA,MAAM,IAAI,CAACnB,GAAG,CAAC0B,IAAI,CAACN,MAAAA,EAAQI,IAAKC,CAAAA,KAAK,CAACJ,YAAAA,CAAAA,CAAAA;AACjD;aACK,MAAA;gBACL9B,MAAOc,CAAAA,OAAO,CAAC,4BAA8B,EAAA;AAAEE,oBAAAA,KAAAA,EAAOH,IAAIG;AAAM,iBAAA,CAAA;;gBAEhE,MAAMoB,SAAAA,GAAuBC,kBAAcxB,CAAAA,GAAAA,CAAIG,KAAK,CAAA;AACpDY,gBAAAA,KAAAA,GAAQ,MAAM,IAAI,CAACnB,GAAG,CAAC6B,GAAG,CAACF,SAAAA,CAAAA;AAC7B;YAEA9B,GAAIoB,CAAAA,IAAI,CAACE,KAAAA,CAAMW,GAAG,CAAC,CAAClB,IAAAA,GAAkBC,eAAWD,CAAAA,IAAAA,EAAM,IAAI,CAACG,SAAS,EAAA,CAAA,CAAA,CAAA;AACvE,SAAA,CAAA;AA5CA;AA8CF;;;;"}
@@ -5,6 +5,6 @@ import { Request, Response } from 'express';
5
5
  export declare class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter<S> {
6
6
  constructor(lib: Primary.Operations<T, S>, keyType: S, options?: ItemRouterOptions);
7
7
  getIk(res: Response): PriKey<S>;
8
- createItem: (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
9
- protected findItems: (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
8
+ createItem: (req: Request, res: Response) => Promise<void>;
9
+ protected findItems: (req: Request, res: Response) => Promise<void>;
10
10
  }
@@ -32,8 +32,8 @@ class PItemRouter extends ItemRouter {
32
32
  const itemToCreate = this.convertDates(req.body);
33
33
  let item = validatePK(await this.lib.create(itemToCreate), this.getPkType());
34
34
  item = await this.postCreateItem(item);
35
- return res.json(item);
36
- }), /* eslint-disable */ _define_property(this, "findItems", async (req, res)=>{
35
+ res.json(item);
36
+ }), _define_property(this, "findItems", async (req, res)=>{
37
37
  logger.default('Finding Items', {
38
38
  query: req.query,
39
39
  params: req.params,
@@ -43,13 +43,22 @@ class PItemRouter extends ItemRouter {
43
43
  const query = req.query;
44
44
  const finder = query['finder'];
45
45
  const finderParams = query['finderParams'];
46
+ const one = query['one'];
46
47
  if (finder) {
47
48
  // If finder is defined? Call a finder.
48
49
  logger.default('Finding Items with a finder', {
49
50
  finder,
50
- finderParams
51
+ finderParams,
52
+ one
51
53
  });
52
- items = await this.lib.find(finder, JSON.parse(finderParams));
54
+ if (one === 'true') {
55
+ const item = await this.lib.findOne(finder, JSON.parse(finderParams));
56
+ items = item ? [
57
+ item
58
+ ] : [];
59
+ } else {
60
+ items = await this.lib.find(finder, JSON.parse(finderParams));
61
+ }
53
62
  } else {
54
63
  logger.default('Finding Items with a query', {
55
64
  query: req.query
@@ -58,7 +67,7 @@ class PItemRouter extends ItemRouter {
58
67
  const itemQuery = paramsToQuery(req.query);
59
68
  items = await this.lib.all(itemQuery);
60
69
  }
61
- return res.json(items.map((item)=>validatePK(item, this.getPkType())));
70
+ res.json(items.map((item)=>validatePK(item, this.getPkType())));
62
71
  });
63
72
  }
64
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PItemRouter.js","sources":["../src/PItemRouter.ts"],"sourcesContent":["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":["logger","LibLogger","get","PItemRouter","ItemRouter","getIk","res","pri","getPk","lib","keyType","options","createItem","req","default","body","query","params","locals","itemToCreate","convertDates","item","validatePK","create","getPkType","postCreateItem","json","findItems","items","finder","finderParams","find","JSON","parse","itemQuery","paramsToQuery","all","map"],"mappings":";;;;;;;;;;;;;;;;;AAMA,MAAMA,MAAAA,GAASC,SAAUC,CAAAA,GAAG,CAAC,aAAA,CAAA;AAMtB,MAAMC,WAAyDC,SAAAA,UAAAA,CAAAA;AAM7DC,IAAAA,KAAAA,CAAMC,GAAa,EAAa;AACrC,QAAA,MAAMC,GAAM,GAAA,IAAI,CAACC,KAAK,CAACF,GAAAA,CAAAA;QACvB,OAAOC,GAAAA;AACT;AAPA,IAAA,WAAA,CAAYE,GAA6B,EAAEC,OAAU,EAAEC,OAA6B,GAAA,EAAE,CAAE;AACtF,QAAA,KAAK,CAACF,GAAKC,EAAAA,OAAAA,EAASC,UAQtB,gBAAOC,CAAAA,IAAAA,EAAAA,YAAAA,EAAa,OAAOC,GAAcP,EAAAA,GAAAA,GAAAA;YACvCN,MAAOc,CAAAA,OAAO,CAAC,iBAAmB,EAAA;AAAEC,gBAAAA,IAAAA,EAAMF,IAAIE,IAAI;AAAEC,gBAAAA,KAAAA,EAAOH,IAAIG,KAAK;AAAEC,gBAAAA,MAAAA,EAAQJ,IAAII,MAAM;AAAEC,gBAAAA,MAAAA,EAAQZ,IAAIY;AAAO,aAAA,CAAA;AAC7G,YAAA,MAAMC,eAAe,IAAI,CAACC,YAAY,CAACP,IAAIE,IAAI,CAAA;AAC/C,YAAA,IAAIM,IACFC,GAAAA,UAAAA,CAAW,MAAM,IAAI,CAACb,GAAG,CAACc,MAAM,CAACJ,YAAAA,CAAAA,EAAe,IAAI,CAACK,SAAS,EAAA,CAAA;AAChEH,YAAAA,IAAAA,GAAO,MAAM,IAAI,CAACI,cAAc,CAACJ,IAAAA,CAAAA;YACjC,OAAOf,GAAAA,CAAIoB,IAAI,CAACL,IAAAA,CAAAA;AAClB,SAAA,CAAA,uBAGA,gBAAUM,CAAAA,IAAAA,EAAAA,WAAAA,EAAY,OAAOd,GAAcP,EAAAA,GAAAA,GAAAA;YACzCN,MAAOc,CAAAA,OAAO,CAAC,eAAiB,EAAA;AAAEE,gBAAAA,KAAAA,EAAOH,IAAIG,KAAK;AAAEC,gBAAAA,MAAAA,EAAQJ,IAAII,MAAM;AAAEC,gBAAAA,MAAAA,EAAQZ,IAAIY;AAAO,aAAA,CAAA;AAE3F,YAAA,IAAIU,QAAmB,EAAE;YAEzB,MAAMZ,KAAAA,GAAqBH,IAAIG,KAAK;YACpC,MAAMa,MAAAA,GAASb,KAAK,CAAC,QAAS,CAAA;YAC9B,MAAMc,YAAAA,GAAed,KAAK,CAAC,cAAe,CAAA;AAE1C,YAAA,IAAIa,MAAS,EAAA;;gBAEX7B,MAAOc,CAAAA,OAAO,CAAC,6BAA+B,EAAA;AAAEe,oBAAAA,MAAAA;AAAQC,oBAAAA;AAAa,iBAAA,CAAA;gBACrEF,KAAQ,GAAA,MAAM,IAAI,CAACnB,GAAG,CAACsB,IAAI,CAACF,MAAAA,EAAQG,IAAKC,CAAAA,KAAK,CAACH,YAAAA,CAAAA,CAAAA;aAC1C,MAAA;gBACL9B,MAAOc,CAAAA,OAAO,CAAC,4BAA8B,EAAA;AAAEE,oBAAAA,KAAAA,EAAOH,IAAIG;AAAM,iBAAA,CAAA;;gBAEhE,MAAMkB,SAAAA,GAAuBC,aAActB,CAAAA,GAAAA,CAAIG,KAAK,CAAA;AACpDY,gBAAAA,KAAAA,GAAQ,MAAM,IAAI,CAACnB,GAAG,CAAC2B,GAAG,CAACF,SAAAA,CAAAA;AAC7B;AAEA,YAAA,OAAO5B,GAAIoB,CAAAA,IAAI,CAACE,KAAAA,CAAMS,GAAG,CAAC,CAAChB,IAAAA,GAAkBC,UAAWD,CAAAA,IAAAA,EAAM,IAAI,CAACG,SAAS,EAAA,CAAA,CAAA,CAAA;AAC9E,SAAA,CAAA;AAtCA;AAwCF;;;;"}
1
+ {"version":3,"file":"PItemRouter.js","sources":["../src/PItemRouter.ts"],"sourcesContent":["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":["logger","LibLogger","get","PItemRouter","ItemRouter","getIk","res","pri","getPk","lib","keyType","options","createItem","req","default","body","query","params","locals","itemToCreate","convertDates","item","validatePK","create","getPkType","postCreateItem","json","findItems","items","finder","finderParams","one","findOne","JSON","parse","find","itemQuery","paramsToQuery","all","map"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -51,6 +51,10 @@ class ItemRouter {
51
51
  this.logger.debug('ARouter - No Item Actions Configured');
52
52
  return {};
53
53
  }
54
+ /* istanbul ignore next */ configureItemFacets() {
55
+ this.logger.debug('ARouter - No Item Facets Configured');
56
+ return {};
57
+ }
54
58
  /* istanbul ignore next */ configureAllActions() {
55
59
  this.logger.debug('ARouter - No All Actions Configured');
56
60
  return {};
@@ -67,6 +71,7 @@ class ItemRouter {
67
71
  _define_property$2(this, "childRouters", {});
68
72
  _define_property$2(this, "logger", void 0);
69
73
  _define_property$2(this, "itemActions", void 0);
74
+ _define_property$2(this, "itemFacets", void 0);
70
75
  _define_property$2(this, "getPkType", ()=>{
71
76
  return this.keyType;
72
77
  });
@@ -83,19 +88,46 @@ class ItemRouter {
83
88
  const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);
84
89
  if (!this.itemActions) {
85
90
  this.logger.error('Item Actions are not configured');
86
- return res.status(500).json({
91
+ res.status(500).json({
87
92
  error: 'Item Actions are not configured'
88
93
  });
94
+ return;
89
95
  }
90
96
  try {
91
97
  const item = core.validatePK(await this.lib.get(ik), this.getPkType());
92
- return res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
98
+ res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
93
99
  } catch (err) {
94
100
  this.logger.error('Error in Item Action', {
95
101
  message: err === null || err === void 0 ? void 0 : err.message,
96
102
  stack: err === null || err === void 0 ? void 0 : err.stack
97
103
  });
98
- return res.status(500).json(err);
104
+ res.status(500).json(err);
105
+ }
106
+ });
107
+ _define_property$2(this, "getItemFacet", async (req, res)=>{
108
+ this.logger.default('Getting Item', {
109
+ query: req === null || req === void 0 ? void 0 : req.query,
110
+ params: req === null || req === void 0 ? void 0 : req.params,
111
+ locals: res === null || res === void 0 ? void 0 : res.locals
112
+ });
113
+ const ik = this.getIk(res);
114
+ const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);
115
+ if (!this.itemFacets) {
116
+ this.logger.error('Item Facets are not configured');
117
+ res.status(500).json({
118
+ error: 'Item Facets are not configured'
119
+ });
120
+ return;
121
+ }
122
+ try {
123
+ const item = core.validatePK(await this.lib.get(ik), this.getPkType());
124
+ await this.itemFacets[facetKey](req, res, item, req.params);
125
+ } catch (err) {
126
+ this.logger.error('Error in Item Facet', {
127
+ message: err === null || err === void 0 ? void 0 : err.message,
128
+ stack: err === null || err === void 0 ? void 0 : err.stack
129
+ });
130
+ res.status(500).json(err);
99
131
  }
100
132
  });
101
133
  _define_property$2(this, "configure", (router)=>{
@@ -134,6 +166,19 @@ class ItemRouter {
134
166
  itemRouter.post(`/${actionKey}`, this.postItemAction);
135
167
  });
136
168
  }
169
+ this.itemFacets = this.configureItemFacets();
170
+ this.logger.debug('Item Facets supplied to Router', {
171
+ itemFacets: this.itemFacets
172
+ });
173
+ if (this.itemFacets) {
174
+ Object.keys(this.itemFacets).forEach((facetKey)=>{
175
+ this.logger.default('Configuring Item Facet', {
176
+ facetKey
177
+ });
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
+ }
137
182
  this.logger.default('Configuring Item Operations under PK Param', {
138
183
  pkParam: this.getPkParam()
139
184
  });
@@ -191,7 +236,7 @@ class ItemRouter {
191
236
  const ik = this.getIk(res);
192
237
  const removedItem = await this.lib.remove(ik);
193
238
  const item = core.validatePK(removedItem, this.getPkType());
194
- return res.json(item);
239
+ res.json(item);
195
240
  });
196
241
  /* eslint-disable */ /* istanbul ignore next */ _define_property$2(this, "findItems", async (req, res)=>{
197
242
  throw new Error('Method not implemented in an abstract router');
@@ -206,7 +251,7 @@ class ItemRouter {
206
251
  try {
207
252
  // TODO: What error does validate PK throw, when can that fail?
208
253
  const item = core.validatePK(await this.lib.get(ik), this.getPkType());
209
- return res.json(item);
254
+ res.json(item);
210
255
  } catch (err) {
211
256
  if (err instanceof lib.NotFoundError) {
212
257
  this.logger.error('Item Not Found', {
@@ -214,7 +259,7 @@ class ItemRouter {
214
259
  message: err === null || err === void 0 ? void 0 : err.message,
215
260
  stack: err === null || err === void 0 ? void 0 : err.stack
216
261
  });
217
- return res.status(404).json({
262
+ res.status(404).json({
218
263
  ik,
219
264
  message: "Item Not Found"
220
265
  });
@@ -224,7 +269,7 @@ class ItemRouter {
224
269
  message: err === null || err === void 0 ? void 0 : err.message,
225
270
  stack: err === null || err === void 0 ? void 0 : err.stack
226
271
  });
227
- return res.status(500).json({
272
+ res.status(500).json({
228
273
  ik,
229
274
  message: "General Error"
230
275
  });
@@ -241,7 +286,7 @@ class ItemRouter {
241
286
  const ik = this.getIk(res);
242
287
  const itemToUpdate = this.convertDates(req.body);
243
288
  const retItem = core.validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());
244
- return res.json(retItem);
289
+ res.json(retItem);
245
290
  });
246
291
  _define_property$2(this, "convertDates", (item)=>{
247
292
  const events = item.events;
@@ -345,8 +390,8 @@ class CItemRouter extends ItemRouter {
345
390
  locations: this.getLocations(res)
346
391
  }), this.getPkType());
347
392
  item = await this.postCreateItem(item);
348
- return res.json(item);
349
- }), /* eslint-disable */ _define_property$1(this, "findItems", async (req, res)=>{
393
+ res.json(item);
394
+ }), _define_property$1(this, "findItems", async (req, res)=>{
350
395
  logger$1.trace('Finding Items', {
351
396
  query: req.query,
352
397
  params: req.params,
@@ -355,16 +400,32 @@ class CItemRouter extends ItemRouter {
355
400
  const query = req.query;
356
401
  const finder = query['finder'];
357
402
  const finderParams = query['finderParams'];
403
+ const one = query['one'];
358
404
  let items = [];
359
405
  if (finder) {
360
406
  // If finder is defined? Call a finder.
361
- items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
407
+ logger$1.trace('Finding Items with a finder', {
408
+ finder,
409
+ finderParams,
410
+ one
411
+ });
412
+ if (one === 'true') {
413
+ const item = await this.lib.findOne(finder, JSON.parse(finderParams), this.getLocations(res));
414
+ items = item ? [
415
+ item
416
+ ] : [];
417
+ } else {
418
+ items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
419
+ }
362
420
  } else {
421
+ logger$1.trace('Finding Items with a query', {
422
+ query: req.query
423
+ });
363
424
  // TODO: This is once of the more important places to perform some validaation and feedback
364
425
  const itemQuery = core.paramsToQuery(req.query);
365
426
  items = await this.lib.all(itemQuery, this.getLocations(res));
366
427
  }
367
- return res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
428
+ res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
368
429
  });
369
430
  this.parentRoute = parentRoute;
370
431
  }
@@ -400,8 +461,8 @@ class PItemRouter extends ItemRouter {
400
461
  const itemToCreate = this.convertDates(req.body);
401
462
  let item = core.validatePK(await this.lib.create(itemToCreate), this.getPkType());
402
463
  item = await this.postCreateItem(item);
403
- return res.json(item);
404
- }), /* eslint-disable */ _define_property(this, "findItems", async (req, res)=>{
464
+ res.json(item);
465
+ }), _define_property(this, "findItems", async (req, res)=>{
405
466
  logger.default('Finding Items', {
406
467
  query: req.query,
407
468
  params: req.params,
@@ -411,13 +472,22 @@ class PItemRouter extends ItemRouter {
411
472
  const query = req.query;
412
473
  const finder = query['finder'];
413
474
  const finderParams = query['finderParams'];
475
+ const one = query['one'];
414
476
  if (finder) {
415
477
  // If finder is defined? Call a finder.
416
478
  logger.default('Finding Items with a finder', {
417
479
  finder,
418
- finderParams
480
+ finderParams,
481
+ one
419
482
  });
420
- items = await this.lib.find(finder, JSON.parse(finderParams));
483
+ if (one === 'true') {
484
+ const item = await this.lib.findOne(finder, JSON.parse(finderParams));
485
+ items = item ? [
486
+ item
487
+ ] : [];
488
+ } else {
489
+ items = await this.lib.find(finder, JSON.parse(finderParams));
490
+ }
421
491
  } else {
422
492
  logger.default('Finding Items with a query', {
423
493
  query: req.query
@@ -426,7 +496,7 @@ class PItemRouter extends ItemRouter {
426
496
  const itemQuery = core.paramsToQuery(req.query);
427
497
  items = await this.lib.all(itemQuery);
428
498
  }
429
- return res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
499
+ res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
430
500
  });
431
501
  }
432
502
  }