@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.
- package/dist/CItemRouter.cjs +20 -4
- package/dist/CItemRouter.cjs.map +1 -1
- package/dist/CItemRouter.d.ts +2 -2
- package/dist/CItemRouter.js +20 -4
- package/dist/CItemRouter.js.map +1 -1
- package/dist/ItemRouter.cjs +53 -8
- package/dist/ItemRouter.cjs.map +1 -1
- package/dist/ItemRouter.d.ts +10 -6
- package/dist/ItemRouter.js +53 -8
- package/dist/ItemRouter.js.map +1 -1
- package/dist/PItemRouter.cjs +14 -5
- package/dist/PItemRouter.cjs.map +1 -1
- package/dist/PItemRouter.d.ts +2 -2
- package/dist/PItemRouter.js +14 -5
- package/dist/PItemRouter.js.map +1 -1
- package/dist/index.cjs +87 -17
- package/dist/index.cjs.map +1 -1
- package/package.json +8 -31
- package/src/CItemRouter.ts +13 -6
- package/src/ItemRouter.ts +59 -11
- package/src/PItemRouter.ts +13 -7
package/dist/CItemRouter.cjs
CHANGED
|
@@ -60,8 +60,8 @@ class CItemRouter extends ItemRouter.ItemRouter {
|
|
|
60
60
|
locations: this.getLocations(res)
|
|
61
61
|
}), this.getPkType());
|
|
62
62
|
item = await this.postCreateItem(item);
|
|
63
|
-
|
|
64
|
-
}),
|
|
63
|
+
res.json(item);
|
|
64
|
+
}), _define_property(this, "findItems", async (req, res)=>{
|
|
65
65
|
logger.trace('Finding Items', {
|
|
66
66
|
query: req.query,
|
|
67
67
|
params: req.params,
|
|
@@ -70,16 +70,32 @@ class CItemRouter extends ItemRouter.ItemRouter {
|
|
|
70
70
|
const query = req.query;
|
|
71
71
|
const finder = query['finder'];
|
|
72
72
|
const finderParams = query['finderParams'];
|
|
73
|
+
const one = query['one'];
|
|
73
74
|
let items = [];
|
|
74
75
|
if (finder) {
|
|
75
76
|
// If finder is defined? Call a finder.
|
|
76
|
-
|
|
77
|
+
logger.trace('Finding Items with a finder', {
|
|
78
|
+
finder,
|
|
79
|
+
finderParams,
|
|
80
|
+
one
|
|
81
|
+
});
|
|
82
|
+
if (one === 'true') {
|
|
83
|
+
const item = await this.lib.findOne(finder, JSON.parse(finderParams), this.getLocations(res));
|
|
84
|
+
items = item ? [
|
|
85
|
+
item
|
|
86
|
+
] : [];
|
|
87
|
+
} else {
|
|
88
|
+
items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
|
|
89
|
+
}
|
|
77
90
|
} else {
|
|
91
|
+
logger.trace('Finding Items with a query', {
|
|
92
|
+
query: req.query
|
|
93
|
+
});
|
|
78
94
|
// TODO: This is once of the more important places to perform some validaation and feedback
|
|
79
95
|
const itemQuery = core.paramsToQuery(req.query);
|
|
80
96
|
items = await this.lib.all(itemQuery, this.getLocations(res));
|
|
81
97
|
}
|
|
82
|
-
|
|
98
|
+
res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
|
|
83
99
|
});
|
|
84
100
|
this.parentRoute = parentRoute;
|
|
85
101
|
}
|
package/dist/CItemRouter.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CItemRouter.cjs","sources":["../src/CItemRouter.ts"],"sourcesContent":["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
|
|
1
|
+
{"version":3,"file":"CItemRouter.cjs","sources":["../src/CItemRouter.ts"],"sourcesContent":["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"],"names":["logger","LibLogger","get","CItemRouter","ItemRouter","hasParent","parentRoute","getIk","res","pri","getPk","loc","getLocations","kt","pk","getLKA","lka","getLk","concat","lib","type","options","createItem","req","trace","body","query","params","locals","itemToCreate","convertDates","item","validatePK","create","locations","getPkType","postCreateItem","json","findItems","finder","finderParams","one","items","findOne","JSON","parse","find","itemQuery","paramsToQuery","all","map"],"mappings":"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"}
|
package/dist/CItemRouter.d.ts
CHANGED
|
@@ -9,6 +9,6 @@ export declare class CItemRouter<T extends Item<S, L1, L2, L3, L4, L5>, S extend
|
|
|
9
9
|
getIk(res: Response): ComKey<S, L1, L2, L3, L4, L5>;
|
|
10
10
|
getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4>;
|
|
11
11
|
getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5>;
|
|
12
|
-
protected createItem: (req: Request, res: Response) => Promise<
|
|
13
|
-
protected findItems: (req: Request, res: Response) => Promise<
|
|
12
|
+
protected createItem: (req: Request, res: Response) => Promise<void>;
|
|
13
|
+
protected findItems: (req: Request, res: Response) => Promise<void>;
|
|
14
14
|
}
|
package/dist/CItemRouter.js
CHANGED
|
@@ -56,8 +56,8 @@ class CItemRouter extends ItemRouter {
|
|
|
56
56
|
locations: this.getLocations(res)
|
|
57
57
|
}), this.getPkType());
|
|
58
58
|
item = await this.postCreateItem(item);
|
|
59
|
-
|
|
60
|
-
}),
|
|
59
|
+
res.json(item);
|
|
60
|
+
}), _define_property(this, "findItems", async (req, res)=>{
|
|
61
61
|
logger.trace('Finding Items', {
|
|
62
62
|
query: req.query,
|
|
63
63
|
params: req.params,
|
|
@@ -66,16 +66,32 @@ class CItemRouter extends ItemRouter {
|
|
|
66
66
|
const query = req.query;
|
|
67
67
|
const finder = query['finder'];
|
|
68
68
|
const finderParams = query['finderParams'];
|
|
69
|
+
const one = query['one'];
|
|
69
70
|
let items = [];
|
|
70
71
|
if (finder) {
|
|
71
72
|
// If finder is defined? Call a finder.
|
|
72
|
-
|
|
73
|
+
logger.trace('Finding Items with a finder', {
|
|
74
|
+
finder,
|
|
75
|
+
finderParams,
|
|
76
|
+
one
|
|
77
|
+
});
|
|
78
|
+
if (one === 'true') {
|
|
79
|
+
const item = await this.lib.findOne(finder, JSON.parse(finderParams), this.getLocations(res));
|
|
80
|
+
items = item ? [
|
|
81
|
+
item
|
|
82
|
+
] : [];
|
|
83
|
+
} else {
|
|
84
|
+
items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
|
|
85
|
+
}
|
|
73
86
|
} else {
|
|
87
|
+
logger.trace('Finding Items with a query', {
|
|
88
|
+
query: req.query
|
|
89
|
+
});
|
|
74
90
|
// TODO: This is once of the more important places to perform some validaation and feedback
|
|
75
91
|
const itemQuery = paramsToQuery(req.query);
|
|
76
92
|
items = await this.lib.all(itemQuery, this.getLocations(res));
|
|
77
93
|
}
|
|
78
|
-
|
|
94
|
+
res.json(items.map((item)=>validatePK(item, this.getPkType())));
|
|
79
95
|
});
|
|
80
96
|
this.parentRoute = parentRoute;
|
|
81
97
|
}
|
package/dist/CItemRouter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CItemRouter.js","sources":["../src/CItemRouter.ts"],"sourcesContent":["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
|
|
1
|
+
{"version":3,"file":"CItemRouter.js","sources":["../src/CItemRouter.ts"],"sourcesContent":["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"],"names":["logger","LibLogger","get","CItemRouter","ItemRouter","hasParent","parentRoute","getIk","res","pri","getPk","loc","getLocations","kt","pk","getLKA","lka","getLk","concat","lib","type","options","createItem","req","trace","body","query","params","locals","itemToCreate","convertDates","item","validatePK","create","locations","getPkType","postCreateItem","json","findItems","finder","finderParams","one","items","findOne","JSON","parse","find","itemQuery","paramsToQuery","all","map"],"mappings":"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"}
|
package/dist/ItemRouter.cjs
CHANGED
|
@@ -49,6 +49,10 @@ class ItemRouter {
|
|
|
49
49
|
this.logger.debug('ARouter - No Item Actions Configured');
|
|
50
50
|
return {};
|
|
51
51
|
}
|
|
52
|
+
/* istanbul ignore next */ configureItemFacets() {
|
|
53
|
+
this.logger.debug('ARouter - No Item Facets Configured');
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
52
56
|
/* istanbul ignore next */ configureAllActions() {
|
|
53
57
|
this.logger.debug('ARouter - No All Actions Configured');
|
|
54
58
|
return {};
|
|
@@ -65,6 +69,7 @@ class ItemRouter {
|
|
|
65
69
|
_define_property(this, "childRouters", {});
|
|
66
70
|
_define_property(this, "logger", void 0);
|
|
67
71
|
_define_property(this, "itemActions", void 0);
|
|
72
|
+
_define_property(this, "itemFacets", void 0);
|
|
68
73
|
_define_property(this, "getPkType", ()=>{
|
|
69
74
|
return this.keyType;
|
|
70
75
|
});
|
|
@@ -81,19 +86,46 @@ class ItemRouter {
|
|
|
81
86
|
const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);
|
|
82
87
|
if (!this.itemActions) {
|
|
83
88
|
this.logger.error('Item Actions are not configured');
|
|
84
|
-
|
|
89
|
+
res.status(500).json({
|
|
85
90
|
error: 'Item Actions are not configured'
|
|
86
91
|
});
|
|
92
|
+
return;
|
|
87
93
|
}
|
|
88
94
|
try {
|
|
89
95
|
const item = core.validatePK(await this.lib.get(ik), this.getPkType());
|
|
90
|
-
|
|
96
|
+
res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
|
|
91
97
|
} catch (err) {
|
|
92
98
|
this.logger.error('Error in Item Action', {
|
|
93
99
|
message: err === null || err === void 0 ? void 0 : err.message,
|
|
94
100
|
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
95
101
|
});
|
|
96
|
-
|
|
102
|
+
res.status(500).json(err);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
_define_property(this, "getItemFacet", async (req, res)=>{
|
|
106
|
+
this.logger.default('Getting Item', {
|
|
107
|
+
query: req === null || req === void 0 ? void 0 : req.query,
|
|
108
|
+
params: req === null || req === void 0 ? void 0 : req.params,
|
|
109
|
+
locals: res === null || res === void 0 ? void 0 : res.locals
|
|
110
|
+
});
|
|
111
|
+
const ik = this.getIk(res);
|
|
112
|
+
const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);
|
|
113
|
+
if (!this.itemFacets) {
|
|
114
|
+
this.logger.error('Item Facets are not configured');
|
|
115
|
+
res.status(500).json({
|
|
116
|
+
error: 'Item Facets are not configured'
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const item = core.validatePK(await this.lib.get(ik), this.getPkType());
|
|
122
|
+
await this.itemFacets[facetKey](req, res, item, req.params);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
this.logger.error('Error in Item Facet', {
|
|
125
|
+
message: err === null || err === void 0 ? void 0 : err.message,
|
|
126
|
+
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
127
|
+
});
|
|
128
|
+
res.status(500).json(err);
|
|
97
129
|
}
|
|
98
130
|
});
|
|
99
131
|
_define_property(this, "configure", (router)=>{
|
|
@@ -132,6 +164,19 @@ class ItemRouter {
|
|
|
132
164
|
itemRouter.post(`/${actionKey}`, this.postItemAction);
|
|
133
165
|
});
|
|
134
166
|
}
|
|
167
|
+
this.itemFacets = this.configureItemFacets();
|
|
168
|
+
this.logger.debug('Item Facets supplied to Router', {
|
|
169
|
+
itemFacets: this.itemFacets
|
|
170
|
+
});
|
|
171
|
+
if (this.itemFacets) {
|
|
172
|
+
Object.keys(this.itemFacets).forEach((facetKey)=>{
|
|
173
|
+
this.logger.default('Configuring Item Facet', {
|
|
174
|
+
facetKey
|
|
175
|
+
});
|
|
176
|
+
// TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers
|
|
177
|
+
itemRouter.get(`/${facetKey}`, this.getItemFacet);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
135
180
|
this.logger.default('Configuring Item Operations under PK Param', {
|
|
136
181
|
pkParam: this.getPkParam()
|
|
137
182
|
});
|
|
@@ -189,7 +234,7 @@ class ItemRouter {
|
|
|
189
234
|
const ik = this.getIk(res);
|
|
190
235
|
const removedItem = await this.lib.remove(ik);
|
|
191
236
|
const item = core.validatePK(removedItem, this.getPkType());
|
|
192
|
-
|
|
237
|
+
res.json(item);
|
|
193
238
|
});
|
|
194
239
|
/* eslint-disable */ /* istanbul ignore next */ _define_property(this, "findItems", async (req, res)=>{
|
|
195
240
|
throw new Error('Method not implemented in an abstract router');
|
|
@@ -204,7 +249,7 @@ class ItemRouter {
|
|
|
204
249
|
try {
|
|
205
250
|
// TODO: What error does validate PK throw, when can that fail?
|
|
206
251
|
const item = core.validatePK(await this.lib.get(ik), this.getPkType());
|
|
207
|
-
|
|
252
|
+
res.json(item);
|
|
208
253
|
} catch (err) {
|
|
209
254
|
if (err instanceof lib.NotFoundError) {
|
|
210
255
|
this.logger.error('Item Not Found', {
|
|
@@ -212,7 +257,7 @@ class ItemRouter {
|
|
|
212
257
|
message: err === null || err === void 0 ? void 0 : err.message,
|
|
213
258
|
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
214
259
|
});
|
|
215
|
-
|
|
260
|
+
res.status(404).json({
|
|
216
261
|
ik,
|
|
217
262
|
message: "Item Not Found"
|
|
218
263
|
});
|
|
@@ -222,7 +267,7 @@ class ItemRouter {
|
|
|
222
267
|
message: err === null || err === void 0 ? void 0 : err.message,
|
|
223
268
|
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
224
269
|
});
|
|
225
|
-
|
|
270
|
+
res.status(500).json({
|
|
226
271
|
ik,
|
|
227
272
|
message: "General Error"
|
|
228
273
|
});
|
|
@@ -239,7 +284,7 @@ class ItemRouter {
|
|
|
239
284
|
const ik = this.getIk(res);
|
|
240
285
|
const itemToUpdate = this.convertDates(req.body);
|
|
241
286
|
const retItem = core.validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());
|
|
242
|
-
|
|
287
|
+
res.json(retItem);
|
|
243
288
|
});
|
|
244
289
|
_define_property(this, "convertDates", (item)=>{
|
|
245
290
|
const events = item.events;
|
package/dist/ItemRouter.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemRouter.cjs","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.cjs","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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"}
|
package/dist/ItemRouter.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { Request, RequestHandler, Response, Router } from 'express';
|
|
|
4
4
|
export type ItemRouterOptions = Record<string, never>;
|
|
5
5
|
export type ActionMethod = <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any, body: any) => Promise<Item<S, L1, L2, L3, L4, L5>>;
|
|
6
6
|
export type AllActionMethods = Array<RequestHandler>;
|
|
7
|
+
export type FacetMethod = <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any) => Promise<any>;
|
|
7
8
|
export declare class ItemRouter<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> {
|
|
8
9
|
protected lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;
|
|
9
10
|
private keyType;
|
|
@@ -11,6 +12,7 @@ export declare class ItemRouter<S extends string, L1 extends string = never, L2
|
|
|
11
12
|
private childRouters;
|
|
12
13
|
private logger;
|
|
13
14
|
private itemActions;
|
|
15
|
+
private itemFacets;
|
|
14
16
|
constructor(lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>, keyType: S, options?: ItemRouterOptions);
|
|
15
17
|
getPkType: () => S;
|
|
16
18
|
protected getPkParam: () => string;
|
|
@@ -19,20 +21,22 @@ export declare class ItemRouter<S extends string, L1 extends string = never, L2
|
|
|
19
21
|
getPk(res: Response): PriKey<S>;
|
|
20
22
|
protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [];
|
|
21
23
|
protected getIk(res: Response): PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>;
|
|
22
|
-
protected postItemAction: (req: Request, res: Response) => Promise<
|
|
24
|
+
protected postItemAction: (req: Request, res: Response) => Promise<void>;
|
|
25
|
+
protected getItemFacet: (req: Request, res: Response) => Promise<void>;
|
|
23
26
|
private configure;
|
|
24
27
|
private validatePrimaryKeyValue;
|
|
25
28
|
private configureChildRouters;
|
|
26
29
|
addChildRouter: (path: string, router: Router) => void;
|
|
27
30
|
protected configureItemActions(): Record<string, ActionMethod>;
|
|
31
|
+
protected configureItemFacets(): Record<string, FacetMethod>;
|
|
28
32
|
protected configureAllActions(): Record<string, AllActionMethods>;
|
|
29
33
|
getRouter(): Router;
|
|
30
|
-
protected createItem: (req: Request, res: Response) => Promise<
|
|
34
|
+
protected createItem: (req: Request, res: Response) => Promise<void>;
|
|
31
35
|
postCreateItem: (item: Item<S, L1, L2, L3, L4, L5>) => Promise<Item<S, L1, L2, L3, L4, L5>>;
|
|
32
|
-
protected deleteItem: (req: Request, res: Response) => Promise<
|
|
33
|
-
protected findItems: (req: Request, res: Response) => Promise<
|
|
34
|
-
protected getItem: (req: Request, res: Response) => Promise<
|
|
35
|
-
protected updateItem: (req: Request, res: Response) => Promise<
|
|
36
|
+
protected deleteItem: (req: Request, res: Response) => Promise<void>;
|
|
37
|
+
protected findItems: (req: Request, res: Response) => Promise<void>;
|
|
38
|
+
protected getItem: (req: Request, res: Response) => Promise<void>;
|
|
39
|
+
protected updateItem: (req: Request, res: Response) => Promise<void>;
|
|
36
40
|
convertDates: (item: Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>) => Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>;
|
|
37
41
|
/**
|
|
38
42
|
* This method might be an annoyance, but we need to capture a few cases where someone passes
|
package/dist/ItemRouter.js
CHANGED
|
@@ -45,6 +45,10 @@ class ItemRouter {
|
|
|
45
45
|
this.logger.debug('ARouter - No Item Actions Configured');
|
|
46
46
|
return {};
|
|
47
47
|
}
|
|
48
|
+
/* istanbul ignore next */ configureItemFacets() {
|
|
49
|
+
this.logger.debug('ARouter - No Item Facets Configured');
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
48
52
|
/* istanbul ignore next */ configureAllActions() {
|
|
49
53
|
this.logger.debug('ARouter - No All Actions Configured');
|
|
50
54
|
return {};
|
|
@@ -61,6 +65,7 @@ class ItemRouter {
|
|
|
61
65
|
_define_property(this, "childRouters", {});
|
|
62
66
|
_define_property(this, "logger", void 0);
|
|
63
67
|
_define_property(this, "itemActions", void 0);
|
|
68
|
+
_define_property(this, "itemFacets", void 0);
|
|
64
69
|
_define_property(this, "getPkType", ()=>{
|
|
65
70
|
return this.keyType;
|
|
66
71
|
});
|
|
@@ -77,19 +82,46 @@ class ItemRouter {
|
|
|
77
82
|
const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);
|
|
78
83
|
if (!this.itemActions) {
|
|
79
84
|
this.logger.error('Item Actions are not configured');
|
|
80
|
-
|
|
85
|
+
res.status(500).json({
|
|
81
86
|
error: 'Item Actions are not configured'
|
|
82
87
|
});
|
|
88
|
+
return;
|
|
83
89
|
}
|
|
84
90
|
try {
|
|
85
91
|
const item = validatePK(await this.lib.get(ik), this.getPkType());
|
|
86
|
-
|
|
92
|
+
res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
|
|
87
93
|
} catch (err) {
|
|
88
94
|
this.logger.error('Error in Item Action', {
|
|
89
95
|
message: err === null || err === void 0 ? void 0 : err.message,
|
|
90
96
|
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
91
97
|
});
|
|
92
|
-
|
|
98
|
+
res.status(500).json(err);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
_define_property(this, "getItemFacet", async (req, res)=>{
|
|
102
|
+
this.logger.default('Getting Item', {
|
|
103
|
+
query: req === null || req === void 0 ? void 0 : req.query,
|
|
104
|
+
params: req === null || req === void 0 ? void 0 : req.params,
|
|
105
|
+
locals: res === null || res === void 0 ? void 0 : res.locals
|
|
106
|
+
});
|
|
107
|
+
const ik = this.getIk(res);
|
|
108
|
+
const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);
|
|
109
|
+
if (!this.itemFacets) {
|
|
110
|
+
this.logger.error('Item Facets are not configured');
|
|
111
|
+
res.status(500).json({
|
|
112
|
+
error: 'Item Facets are not configured'
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const item = validatePK(await this.lib.get(ik), this.getPkType());
|
|
118
|
+
await this.itemFacets[facetKey](req, res, item, req.params);
|
|
119
|
+
} catch (err) {
|
|
120
|
+
this.logger.error('Error in Item Facet', {
|
|
121
|
+
message: err === null || err === void 0 ? void 0 : err.message,
|
|
122
|
+
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
123
|
+
});
|
|
124
|
+
res.status(500).json(err);
|
|
93
125
|
}
|
|
94
126
|
});
|
|
95
127
|
_define_property(this, "configure", (router)=>{
|
|
@@ -128,6 +160,19 @@ class ItemRouter {
|
|
|
128
160
|
itemRouter.post(`/${actionKey}`, this.postItemAction);
|
|
129
161
|
});
|
|
130
162
|
}
|
|
163
|
+
this.itemFacets = this.configureItemFacets();
|
|
164
|
+
this.logger.debug('Item Facets supplied to Router', {
|
|
165
|
+
itemFacets: this.itemFacets
|
|
166
|
+
});
|
|
167
|
+
if (this.itemFacets) {
|
|
168
|
+
Object.keys(this.itemFacets).forEach((facetKey)=>{
|
|
169
|
+
this.logger.default('Configuring Item Facet', {
|
|
170
|
+
facetKey
|
|
171
|
+
});
|
|
172
|
+
// TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers
|
|
173
|
+
itemRouter.get(`/${facetKey}`, this.getItemFacet);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
131
176
|
this.logger.default('Configuring Item Operations under PK Param', {
|
|
132
177
|
pkParam: this.getPkParam()
|
|
133
178
|
});
|
|
@@ -185,7 +230,7 @@ class ItemRouter {
|
|
|
185
230
|
const ik = this.getIk(res);
|
|
186
231
|
const removedItem = await this.lib.remove(ik);
|
|
187
232
|
const item = validatePK(removedItem, this.getPkType());
|
|
188
|
-
|
|
233
|
+
res.json(item);
|
|
189
234
|
});
|
|
190
235
|
/* eslint-disable */ /* istanbul ignore next */ _define_property(this, "findItems", async (req, res)=>{
|
|
191
236
|
throw new Error('Method not implemented in an abstract router');
|
|
@@ -200,7 +245,7 @@ class ItemRouter {
|
|
|
200
245
|
try {
|
|
201
246
|
// TODO: What error does validate PK throw, when can that fail?
|
|
202
247
|
const item = validatePK(await this.lib.get(ik), this.getPkType());
|
|
203
|
-
|
|
248
|
+
res.json(item);
|
|
204
249
|
} catch (err) {
|
|
205
250
|
if (err instanceof NotFoundError) {
|
|
206
251
|
this.logger.error('Item Not Found', {
|
|
@@ -208,7 +253,7 @@ class ItemRouter {
|
|
|
208
253
|
message: err === null || err === void 0 ? void 0 : err.message,
|
|
209
254
|
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
210
255
|
});
|
|
211
|
-
|
|
256
|
+
res.status(404).json({
|
|
212
257
|
ik,
|
|
213
258
|
message: "Item Not Found"
|
|
214
259
|
});
|
|
@@ -218,7 +263,7 @@ class ItemRouter {
|
|
|
218
263
|
message: err === null || err === void 0 ? void 0 : err.message,
|
|
219
264
|
stack: err === null || err === void 0 ? void 0 : err.stack
|
|
220
265
|
});
|
|
221
|
-
|
|
266
|
+
res.status(500).json({
|
|
222
267
|
ik,
|
|
223
268
|
message: "General Error"
|
|
224
269
|
});
|
|
@@ -235,7 +280,7 @@ class ItemRouter {
|
|
|
235
280
|
const ik = this.getIk(res);
|
|
236
281
|
const itemToUpdate = this.convertDates(req.body);
|
|
237
282
|
const retItem = validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());
|
|
238
|
-
|
|
283
|
+
res.json(retItem);
|
|
239
284
|
});
|
|
240
285
|
_define_property(this, "convertDates", (item)=>{
|
|
241
286
|
const events = item.events;
|