@fjell/express-router 4.4.78 → 4.4.79
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.d.ts.map +1 -1
- package/dist/CItemRouter.js +51 -1
- package/dist/CItemRouter.js.map +2 -2
- package/dist/ItemRouter.d.ts.map +1 -1
- package/dist/ItemRouter.js +57 -7
- package/dist/ItemRouter.js.map +2 -2
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CItemRouter.d.ts","sourceRoot":"","sources":["../src/CItemRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EACO,MAAM,EAAoC,IAAI,EAAqB,WAAW,EAC3F,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAiB,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"CItemRouter.d.ts","sourceRoot":"","sources":["../src/CItemRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EACO,MAAM,EAAoC,IAAI,EAAqB,WAAW,EAC3F,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAiB,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAyEhE,qBAAa,WAAW,CACtB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,EACjB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,CACzB,SAAQ,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBAGvC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACtC,IAAI,EAAE,CAAC,EACP,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAClD,OAAO,GAAE,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAM;IAKjD,SAAS,IAAI,OAAO;IAIpB,KAAK,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAMnD,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAWrD,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAI5D,UAAU,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,mBAgDpD;IAEF,SAAS,CAAC,SAAS,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,mBA+FtD;CAEH"}
|
package/dist/CItemRouter.js
CHANGED
|
@@ -4,6 +4,56 @@ import {
|
|
|
4
4
|
} from "@fjell/core";
|
|
5
5
|
import { NotFoundError } from "@fjell/lib";
|
|
6
6
|
import { ItemRouter } from "./ItemRouter.js";
|
|
7
|
+
function extractErrorDetails(error) {
|
|
8
|
+
if (!error) {
|
|
9
|
+
return { type: "unknown_error" };
|
|
10
|
+
}
|
|
11
|
+
const details = {};
|
|
12
|
+
if (typeof error.message === "string") {
|
|
13
|
+
details.message = error.message;
|
|
14
|
+
}
|
|
15
|
+
if (typeof error.name === "string") {
|
|
16
|
+
details.name = error.name;
|
|
17
|
+
}
|
|
18
|
+
if (typeof error.code === "string" || typeof error.code === "number") {
|
|
19
|
+
details.code = error.code;
|
|
20
|
+
}
|
|
21
|
+
if (typeof error.stack === "string") {
|
|
22
|
+
details.stack = error.stack;
|
|
23
|
+
}
|
|
24
|
+
if (typeof error.constraint === "string") {
|
|
25
|
+
details.constraint = error.constraint;
|
|
26
|
+
}
|
|
27
|
+
if (typeof error.detail === "string") {
|
|
28
|
+
details.detail = error.detail;
|
|
29
|
+
}
|
|
30
|
+
if (typeof error.table === "string") {
|
|
31
|
+
details.table = error.table;
|
|
32
|
+
}
|
|
33
|
+
if (typeof error.column === "string") {
|
|
34
|
+
details.column = error.column;
|
|
35
|
+
}
|
|
36
|
+
if (error.errors && Array.isArray(error.errors)) {
|
|
37
|
+
details.validationErrors = error.errors.map((e) => {
|
|
38
|
+
const errorDetail = {
|
|
39
|
+
message: e.message,
|
|
40
|
+
type: e.type,
|
|
41
|
+
path: e.path
|
|
42
|
+
};
|
|
43
|
+
if (e.value !== null && e.value !== void 0) {
|
|
44
|
+
errorDetail.value = String(e.value).substring(0, 100);
|
|
45
|
+
}
|
|
46
|
+
return errorDetail;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (typeof error.status === "number") {
|
|
50
|
+
details.status = error.status;
|
|
51
|
+
}
|
|
52
|
+
if (typeof error.statusCode === "number") {
|
|
53
|
+
details.statusCode = error.statusCode;
|
|
54
|
+
}
|
|
55
|
+
return details;
|
|
56
|
+
}
|
|
7
57
|
class CItemRouter extends ItemRouter {
|
|
8
58
|
constructor(lib, type, parentRoute, options = {}) {
|
|
9
59
|
super(lib, type, options, parentRoute);
|
|
@@ -132,7 +182,7 @@ class CItemRouter extends ItemRouter {
|
|
|
132
182
|
});
|
|
133
183
|
}
|
|
134
184
|
} catch (error) {
|
|
135
|
-
this.logger.error("Error in findItems",
|
|
185
|
+
this.logger.error("Error in findItems", extractErrorDetails(error));
|
|
136
186
|
if (error instanceof NotFoundError || error?.name === "NotFoundError") {
|
|
137
187
|
res.status(404).json({ error: error.message || "Parent item not found" });
|
|
138
188
|
} else {
|
package/dist/CItemRouter.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/CItemRouter.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n AllOptions, ComKey, FindOperationResult, FindOptions, Item, ItemQuery, LocKey, LocKeyArray, paramsToQuery, PriKey, QueryParams, validatePK\n} from \"@fjell/core\";\nimport { Library, NotFoundError } from \"@fjell/lib\";\nimport { Request, Response } from \"express\";\nimport { ItemRouter, ItemRouterOptions } from \"./ItemRouter.js\";\n\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 constructor(\n lib: Library<T, S, L1, L2, L3, L4, L5>,\n type: S,\n parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,\n options: ItemRouterOptions<S, L1, L2, L3, L4, L5> = {},\n ) {\n super(lib as any, type, options, 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 public createItem = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.default('Creating Item', { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n \n try {\n const itemToCreate = this.convertDates(req.body as Item<S, L1, L2, L3, L4, L5>);\n let item = validatePK(await libOperations.create(\n itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n item = await this.postCreateItem(item);\n this.logger.default('Created Item %j', item);\n res.status(201).json(item);\n } catch (error: any) {\n // Log structured error details for agentic debugging\n this.logger.error('Error in createItem endpoint', {\n component: 'CItemRouter',\n operation: 'createItem',\n endpoint: req.path,\n method: req.method,\n itemType: this.getPkType(),\n requestBody: JSON.stringify(req.body),\n locations: JSON.stringify(this.getLocations(res)),\n errorType: error?.constructor?.name || typeof error,\n errorName: error?.name,\n errorMessage: error?.message,\n errorCode: error?.errorInfo?.code || error?.code,\n validationErrors: error?.errorInfo?.details?.fieldErrors,\n suggestion: 'Check request body validation, required fields, parent locations, unique constraints, and data types',\n stack: error?.stack\n });\n \n // Check for validation errors\n if (error.name === 'CreateValidationError' || error.name === 'ValidationError' ||\n error.name === 'SequelizeValidationError' ||\n (error.message && (error.message.includes('validation') ||\n error.message.includes('required') ||\n error.message.includes('cannot be null') ||\n error.message.includes('notNull Violation')))) {\n res.status(400).json({\n message: \"Validation Error\",\n details: error?.errorInfo?.details?.fieldErrors || error?.message\n });\n } else {\n res.status(500).json({\n message: \"General Error\",\n error: error?.message\n });\n }\n }\n };\n\n protected findItems = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\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 try {\n if (finder) {\n // If finder is defined? Call a finder.\n this.logger.default('Finding Items with Finder', { finder, finderParams, one });\n\n let parsedParams: any;\n try {\n parsedParams = finderParams ? JSON.parse(finderParams) : {};\n } catch (parseError: any) {\n res.status(400).json({\n error: 'Invalid JSON in finderParams',\n message: parseError.message\n });\n return;\n }\n\n // Parse pagination options from query parameters\n const findOptions: FindOptions | undefined =\n (req.query.limit || req.query.offset) ? {\n ...(req.query.limit && { limit: parseInt(req.query.limit as string, 10) }),\n ...(req.query.offset && { offset: parseInt(req.query.offset as string, 10) }),\n } : (void 0);\n\n const locations = this.getLocations(res);\n\n if (one === 'true') {\n const item = await (this.lib as any).findOne(finder, parsedParams, locations);\n // Wrap findOne result in FindOperationResult format\n const validatedItem = item ? (validatePK(item, this.getPkType()) as Item<S, L1, L2, L3, L4, L5>) : null;\n const result: FindOperationResult<Item<S, L1, L2, L3, L4, L5>> = {\n items: validatedItem ? [validatedItem] : [],\n metadata: {\n total: validatedItem ? 1 : 0,\n returned: validatedItem ? 1 : 0,\n offset: 0,\n hasMore: false\n }\n };\n res.json(result);\n } else {\n // Call find() with pagination options - it returns FindOperationResult\n const result = await libOperations.find(finder, parsedParams, locations, findOptions);\n \n // Validate items - validatePK can handle arrays\n const validatedItems = validatePK(result.items, this.getPkType()) as Item<S, L1, L2, L3, L4, L5>[];\n \n res.json({\n items: validatedItems,\n metadata: result.metadata\n });\n }\n } else {\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n const locations = this.getLocations(res);\n this.logger.debug('Finding Items with Query: %j', itemQuery);\n this.logger.debug('Location keys being passed: %j', locations);\n \n // Parse pagination options from query params\n const allOptions: AllOptions = {};\n if (req.query.limit) {\n allOptions.limit = parseInt(req.query.limit as string, 10);\n }\n if (req.query.offset) {\n allOptions.offset = parseInt(req.query.offset as string, 10);\n }\n \n // libOperations.all() now returns AllOperationResult<V>\n const result = await libOperations.all(itemQuery, locations, allOptions);\n this.logger.debug('Found %d Items with Query', result.items.length);\n\n // Validate PKs on returned items\n const validatedItems = result.items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType()));\n \n // Return full AllOperationResult structure with validated items\n res.json({\n items: validatedItems,\n metadata: result.metadata\n });\n }\n } catch (error: any) {\n this.logger.error('Error in findItems', { error });\n if (error instanceof NotFoundError || error?.name === 'NotFoundError') {\n res.status(404).json({ error: error.message || 'Parent item not found' });\n } else {\n res.status(500).json({ error: error.message || 'Internal server error' });\n }\n }\n };\n\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EAC8F;AAAA,EAAoC;AAAA,OAC3H;AACP,SAAkB,qBAAqB;AAEvC,SAAS,kBAAqC;
|
|
4
|
+
"sourcesContent": ["import {\n AllOptions, ComKey, FindOperationResult, FindOptions, Item, ItemQuery, LocKey, LocKeyArray, paramsToQuery, PriKey, QueryParams, validatePK\n} from \"@fjell/core\";\nimport { Library, NotFoundError } from \"@fjell/lib\";\nimport { Request, Response } from \"express\";\nimport { ItemRouter, ItemRouterOptions } from \"./ItemRouter.js\";\n\n/**\n * Extract serializable error details from Error objects\n *\n * Error objects have non-enumerable properties that don't serialize to JSON.\n * This function explicitly extracts all meaningful details into a plain object.\n */\nfunction extractErrorDetails(error: any): Record<string, any> {\n if (!error) {\n return { type: 'unknown_error' };\n }\n\n const details: Record<string, any> = {};\n\n // Standard JavaScript Error properties\n if (typeof error.message === 'string') {\n details.message = error.message;\n }\n if (typeof error.name === 'string') {\n details.name = error.name;\n }\n if (typeof error.code === 'string' || typeof error.code === 'number') {\n details.code = error.code;\n }\n if (typeof error.stack === 'string') {\n details.stack = error.stack;\n }\n\n // Database-specific error properties (PostgreSQL/Sequelize)\n if (typeof error.constraint === 'string') {\n details.constraint = error.constraint;\n }\n if (typeof error.detail === 'string') {\n details.detail = error.detail;\n }\n if (typeof error.table === 'string') {\n details.table = error.table;\n }\n if (typeof error.column === 'string') {\n details.column = error.column;\n }\n\n // Sequelize validation errors\n if (error.errors && Array.isArray(error.errors)) {\n details.validationErrors = error.errors.map((e: any) => {\n const errorDetail: any = {\n message: e.message,\n type: e.type,\n path: e.path\n };\n if (e.value !== null && e.value !== void 0) {\n errorDetail.value = String(e.value).substring(0, 100);\n }\n return errorDetail;\n });\n }\n\n // HTTP status\n if (typeof error.status === 'number') {\n details.status = error.status;\n }\n if (typeof error.statusCode === 'number') {\n details.statusCode = error.statusCode;\n }\n\n return details;\n}\n\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 constructor(\n lib: Library<T, S, L1, L2, L3, L4, L5>,\n type: S,\n parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,\n options: ItemRouterOptions<S, L1, L2, L3, L4, L5> = {},\n ) {\n super(lib as any, type, options, 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 public createItem = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.default('Creating Item', { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n\n try {\n const itemToCreate = this.convertDates(req.body as Item<S, L1, L2, L3, L4, L5>);\n let item = validatePK(await libOperations.create(\n itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n item = await this.postCreateItem(item);\n this.logger.default('Created Item %j', item);\n res.status(201).json(item);\n } catch (error: any) {\n // Log structured error details for agentic debugging\n this.logger.error('Error in createItem endpoint', {\n component: 'CItemRouter',\n operation: 'createItem',\n endpoint: req.path,\n method: req.method,\n itemType: this.getPkType(),\n requestBody: JSON.stringify(req.body),\n locations: JSON.stringify(this.getLocations(res)),\n errorType: error?.constructor?.name || typeof error,\n errorName: error?.name,\n errorMessage: error?.message,\n errorCode: error?.errorInfo?.code || error?.code,\n validationErrors: error?.errorInfo?.details?.fieldErrors,\n suggestion: 'Check request body validation, required fields, parent locations, unique constraints, and data types',\n stack: error?.stack\n });\n\n // Check for validation errors\n if (error.name === 'CreateValidationError' || error.name === 'ValidationError' ||\n error.name === 'SequelizeValidationError' ||\n (error.message && (error.message.includes('validation') ||\n error.message.includes('required') ||\n error.message.includes('cannot be null') ||\n error.message.includes('notNull Violation')))) {\n res.status(400).json({\n message: \"Validation Error\",\n details: error?.errorInfo?.details?.fieldErrors || error?.message\n });\n } else {\n res.status(500).json({\n message: \"General Error\",\n error: error?.message\n });\n }\n }\n };\n\n protected findItems = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\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 try {\n if (finder) {\n // If finder is defined? Call a finder.\n this.logger.default('Finding Items with Finder', { finder, finderParams, one });\n\n let parsedParams: any;\n try {\n parsedParams = finderParams ? JSON.parse(finderParams) : {};\n } catch (parseError: any) {\n res.status(400).json({\n error: 'Invalid JSON in finderParams',\n message: parseError.message\n });\n return;\n }\n\n // Parse pagination options from query parameters\n const findOptions: FindOptions | undefined =\n (req.query.limit || req.query.offset) ? {\n ...(req.query.limit && { limit: parseInt(req.query.limit as string, 10) }),\n ...(req.query.offset && { offset: parseInt(req.query.offset as string, 10) }),\n } : (void 0);\n\n const locations = this.getLocations(res);\n\n if (one === 'true') {\n const item = await (this.lib as any).findOne(finder, parsedParams, locations);\n // Wrap findOne result in FindOperationResult format\n const validatedItem = item ? (validatePK(item, this.getPkType()) as Item<S, L1, L2, L3, L4, L5>) : null;\n const result: FindOperationResult<Item<S, L1, L2, L3, L4, L5>> = {\n items: validatedItem ? [validatedItem] : [],\n metadata: {\n total: validatedItem ? 1 : 0,\n returned: validatedItem ? 1 : 0,\n offset: 0,\n hasMore: false\n }\n };\n res.json(result);\n } else {\n // Call find() with pagination options - it returns FindOperationResult\n const result = await libOperations.find(finder, parsedParams, locations, findOptions);\n\n // Validate items - validatePK can handle arrays\n const validatedItems = validatePK(result.items, this.getPkType()) as Item<S, L1, L2, L3, L4, L5>[];\n\n res.json({\n items: validatedItems,\n metadata: result.metadata\n });\n }\n } else {\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n const locations = this.getLocations(res);\n this.logger.debug('Finding Items with Query: %j', itemQuery);\n this.logger.debug('Location keys being passed: %j', locations);\n\n // Parse pagination options from query params\n const allOptions: AllOptions = {};\n if (req.query.limit) {\n allOptions.limit = parseInt(req.query.limit as string, 10);\n }\n if (req.query.offset) {\n allOptions.offset = parseInt(req.query.offset as string, 10);\n }\n\n // libOperations.all() now returns AllOperationResult<V>\n const result = await libOperations.all(itemQuery, locations, allOptions);\n this.logger.debug('Found %d Items with Query', result.items.length);\n\n // Validate PKs on returned items\n const validatedItems = result.items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType()));\n\n // Return full AllOperationResult structure with validated items\n res.json({\n items: validatedItems,\n metadata: result.metadata\n });\n }\n } catch (error: any) {\n this.logger.error('Error in findItems', extractErrorDetails(error));\n if (error instanceof NotFoundError || error?.name === 'NotFoundError') {\n res.status(404).json({ error: error.message || 'Parent item not found' });\n } else {\n res.status(500).json({ error: error.message || 'Internal server error' });\n }\n }\n };\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/ItemRouter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemRouter.d.ts","sourceRoot":"","sources":["../src/ItemRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EAEN,IAAI,EAEJ,MAAM,EACN,WAAW,EACX,MAAM,EAEP,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,EAAsB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ItemRouter.d.ts","sourceRoot":"","sources":["../src/ItemRouter.ts"],"names":[],"mappings":"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"}
|
package/dist/ItemRouter.js
CHANGED
|
@@ -8,6 +8,56 @@ import deepmerge from "deepmerge";
|
|
|
8
8
|
import { Router } from "express";
|
|
9
9
|
import LibLogger from "./logger.js";
|
|
10
10
|
import { createErrorHandler } from "./errorHandler.js";
|
|
11
|
+
function extractErrorDetails(error) {
|
|
12
|
+
if (!error) {
|
|
13
|
+
return { type: "unknown_error" };
|
|
14
|
+
}
|
|
15
|
+
const details = {};
|
|
16
|
+
if (typeof error.message === "string") {
|
|
17
|
+
details.message = error.message;
|
|
18
|
+
}
|
|
19
|
+
if (typeof error.name === "string") {
|
|
20
|
+
details.name = error.name;
|
|
21
|
+
}
|
|
22
|
+
if (typeof error.code === "string" || typeof error.code === "number") {
|
|
23
|
+
details.code = error.code;
|
|
24
|
+
}
|
|
25
|
+
if (typeof error.stack === "string") {
|
|
26
|
+
details.stack = error.stack;
|
|
27
|
+
}
|
|
28
|
+
if (typeof error.constraint === "string") {
|
|
29
|
+
details.constraint = error.constraint;
|
|
30
|
+
}
|
|
31
|
+
if (typeof error.detail === "string") {
|
|
32
|
+
details.detail = error.detail;
|
|
33
|
+
}
|
|
34
|
+
if (typeof error.table === "string") {
|
|
35
|
+
details.table = error.table;
|
|
36
|
+
}
|
|
37
|
+
if (typeof error.column === "string") {
|
|
38
|
+
details.column = error.column;
|
|
39
|
+
}
|
|
40
|
+
if (error.errors && Array.isArray(error.errors)) {
|
|
41
|
+
details.validationErrors = error.errors.map((e) => {
|
|
42
|
+
const errorDetail = {
|
|
43
|
+
message: e.message,
|
|
44
|
+
type: e.type,
|
|
45
|
+
path: e.path
|
|
46
|
+
};
|
|
47
|
+
if (e.value !== null && e.value !== void 0) {
|
|
48
|
+
errorDetail.value = String(e.value).substring(0, 100);
|
|
49
|
+
}
|
|
50
|
+
return errorDetail;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (typeof error.status === "number") {
|
|
54
|
+
details.status = error.status;
|
|
55
|
+
}
|
|
56
|
+
if (typeof error.statusCode === "number") {
|
|
57
|
+
details.statusCode = error.statusCode;
|
|
58
|
+
}
|
|
59
|
+
return details;
|
|
60
|
+
}
|
|
11
61
|
class ItemRouter {
|
|
12
62
|
lib;
|
|
13
63
|
keyType;
|
|
@@ -88,7 +138,7 @@ class ItemRouter {
|
|
|
88
138
|
const result = await libOperations.allAction(allActionKey, req.body, this.getLocations(res));
|
|
89
139
|
res.json(result);
|
|
90
140
|
} catch (error) {
|
|
91
|
-
this.logger.error("Error in postAllAction",
|
|
141
|
+
this.logger.error("Error in postAllAction", extractErrorDetails(error));
|
|
92
142
|
if ((error.name === "ValidationError" || error.message?.includes("not found")) && error.message) {
|
|
93
143
|
res.status(500).json({ error: "All Action is not configured" });
|
|
94
144
|
} else {
|
|
@@ -121,7 +171,7 @@ class ItemRouter {
|
|
|
121
171
|
const result = await libOperations.allFacet(facetKey, combinedQueryParams, this.getLocations(res));
|
|
122
172
|
res.json(result);
|
|
123
173
|
} catch (error) {
|
|
124
|
-
this.logger.error("Error in getAllFacet",
|
|
174
|
+
this.logger.error("Error in getAllFacet", extractErrorDetails(error));
|
|
125
175
|
if ((error.name === "ValidationError" || error.message?.includes("not found")) && error.message) {
|
|
126
176
|
res.status(500).json({ error: "All Facet is not configured" });
|
|
127
177
|
} else {
|
|
@@ -154,7 +204,7 @@ class ItemRouter {
|
|
|
154
204
|
const result = await libOperations.action(ik, actionKey, req.body);
|
|
155
205
|
res.json(result);
|
|
156
206
|
} catch (error) {
|
|
157
|
-
this.logger.error("Error in postItemAction",
|
|
207
|
+
this.logger.error("Error in postItemAction", extractErrorDetails(error));
|
|
158
208
|
if ((error.name === "ValidationError" || error.message?.includes("not found")) && error.message) {
|
|
159
209
|
res.status(500).json({ error: "Item Action is not configured" });
|
|
160
210
|
} else {
|
|
@@ -188,7 +238,7 @@ class ItemRouter {
|
|
|
188
238
|
const result = await libOperations.facet(ik, facetKey, combinedQueryParams);
|
|
189
239
|
res.json(result);
|
|
190
240
|
} catch (error) {
|
|
191
|
-
this.logger.error("Error in getItemFacet",
|
|
241
|
+
this.logger.error("Error in getItemFacet", extractErrorDetails(error));
|
|
192
242
|
if ((error.name === "ValidationError" || error.message?.includes("not found")) && error.message) {
|
|
193
243
|
res.status(500).json({ error: "Item Facet is not configured" });
|
|
194
244
|
} else {
|
|
@@ -356,7 +406,7 @@ class ItemRouter {
|
|
|
356
406
|
if (isNotFound) {
|
|
357
407
|
res.status(404).json({ ik, message: "Item Not Found" });
|
|
358
408
|
} else {
|
|
359
|
-
this.logger.error("Error in deleteItem",
|
|
409
|
+
this.logger.error("Error in deleteItem", extractErrorDetails(error));
|
|
360
410
|
res.status(500).json({ ik, message: "General Error" });
|
|
361
411
|
}
|
|
362
412
|
}
|
|
@@ -399,7 +449,7 @@ class ItemRouter {
|
|
|
399
449
|
if (isNotFound) {
|
|
400
450
|
res.status(404).json({ ik, message: "Item Not Found" });
|
|
401
451
|
} else {
|
|
402
|
-
this.logger.error("Error in getItem",
|
|
452
|
+
this.logger.error("Error in getItem", extractErrorDetails(error));
|
|
403
453
|
res.status(500).json({ ik, message: "General Error" });
|
|
404
454
|
}
|
|
405
455
|
}
|
|
@@ -421,7 +471,7 @@ class ItemRouter {
|
|
|
421
471
|
if (isNotFound) {
|
|
422
472
|
res.status(404).json({ ik, message: "Item Not Found" });
|
|
423
473
|
} else {
|
|
424
|
-
this.logger.error("Error in updateItem",
|
|
474
|
+
this.logger.error("Error in updateItem", extractErrorDetails(error));
|
|
425
475
|
res.status(500).json({ ik, message: "General Error" });
|
|
426
476
|
}
|
|
427
477
|
}
|
package/dist/ItemRouter.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ItemRouter.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ActionError,\n ComKey,\n cPK,\n Item,\n ItemEvent,\n LocKey,\n LocKeyArray,\n PriKey,\n validatePK\n} from \"@fjell/core\";\nimport { NotFoundError } from \"@fjell/lib\";\nimport { Instance } from \"./Instance.js\";\nimport deepmerge from \"deepmerge\";\nimport { NextFunction, Request, Response, Router } from \"express\";\nimport LibLogger from \"./logger.js\";\nimport { createErrorHandler, ErrorHandlerOptions } from \"./errorHandler.js\";\n\n/**\n * Router-level action method signature - aligned with library ActionMethod pattern\n * Takes the resolved item key, action parameters, and HTTP context\n */\nexport interface RouterActionMethod<\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 ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n actionParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\n/**\n * Router-level facet method signature - aligned with library FacetMethod pattern\n * Takes the resolved item key, facet parameters, and HTTP context\n */\nexport interface RouterFacetMethod<\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 ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n facetParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\n/**\n * Router-level all action method signature - aligned with library AllActionMethod pattern\n * Takes action parameters, optional locations, and HTTP context\n */\nexport interface RouterAllActionMethod<\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 allActionParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [],\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\n/**\n * Router-level all facet method signature - aligned with library AllFacetMethod pattern\n * Takes facet parameters, optional locations, and HTTP context\n */\nexport interface RouterAllFacetMethod<\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 allFacetParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [],\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\nexport type ItemRouterOptions<\n S extends string = 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 * Handlers for item actions - aligned with library operation signatures\n * The key in the Record is the action name, method receives resolved item key and parameters\n */\n actions?: Record<string, RouterActionMethod<S, L1, L2, L3, L4, L5>>;\n\n /**\n * Handlers for item facets - aligned with library operation signatures\n * The key in the Record is the facet name, method receives resolved item key and parameters\n */\n facets?: Record<string, RouterFacetMethod<S, L1, L2, L3, L4, L5>>;\n\n /**\n * Handlers for all actions - aligned with library operation signatures\n * The key in the Record is the action name, method receives parameters and optional locations\n */\n allActions?: Record<string, RouterAllActionMethod<L1, L2, L3, L4, L5>>;\n\n /**\n * Handlers for all facets - aligned with library operation signatures\n * The key in the Record is the facet name, method receives parameters and optional locations\n */\n allFacets?: Record<string, RouterAllFacetMethod<L1, L2, L3, L4, L5>>;\n\n /**\n * Error handler configuration\n */\n errorHandler?: ErrorHandlerOptions;\n};\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: Instance<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;\n private keyType: S;\n protected options: ItemRouterOptions<S, L1, L2, L3, L4, L5>;\n private childRouters: Record<string, Router> = {};\n protected logger;\n protected parentRoute?: ItemRouter<L1, L2, L3, L4, L5, never>;\n protected errorHandler: (err: any, req: Request, res: Response, next: NextFunction) => void;\n\n constructor(\n lib: Instance<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,\n keyType: S,\n options: ItemRouterOptions<S, L1, L2, L3, L4, L5> = {},\n parentRoute?: ItemRouter<L1, L2, L3, L4, L5, never>\n ) {\n this.lib = lib;\n this.keyType = keyType;\n this.options = options;\n this.parentRoute = parentRoute;\n this.logger = LibLogger.get(\"ItemRouter\", keyType);\n this.errorHandler = createErrorHandler(options.errorHandler);\n }\n\n /**\n * Wrap async route handlers to catch errors and pass to error handler\n */\n protected wrapAsync(fn: (req: Request, res: Response, next: NextFunction) => Promise<any>) {\n return (req: Request, res: Response, next: NextFunction) => {\n Promise.resolve(fn.call(this, req, res, next)).catch(next);\n };\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 const pkParam = this.getPkParam();\n const lkValue = res.locals[pkParam];\n this.logger.debug('Getting location key', {\n keyType: this.keyType,\n pkParam: pkParam,\n lkValue: lkValue,\n allLocals: res.locals\n });\n return { kt: this.keyType, lk: lkValue };\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 protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [] {\n return this.parentRoute ? this.parentRoute.getLKA(res) as LocKeyArray<L1, L2, L3, L4, L5> : [];\n }\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 postAllAction = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Posting All Action', { query: req?.query, params: req?.params, locals: res?.locals });\n const allActionKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n\n try {\n // Check for router-level handler first\n if (this.options.allActions && this.options.allActions[allActionKey]) {\n this.logger.debug('Using router-level all action handler', { allActionKey });\n const result = await this.options.allActions[allActionKey](\n req.body as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n this.getLocations(res),\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if allAction operation exists\n if (!libOperations.allAction) {\n res.status(500).json({ error: 'All Actions are not configured' });\n return;\n }\n\n // Fallback to library handler\n const result = await libOperations.allAction(allActionKey, req.body, this.getLocations(res));\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in postAllAction', { error });\n // Check if it's a validation error or action not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'All Action is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n protected getAllFacet = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Getting All Facet', { query: req?.query, params: req?.params, locals: res?.locals });\n const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n\n try {\n // Check for router-level handler first\n if (this.options.allFacets && this.options.allFacets[facetKey]) {\n this.logger.debug('Using router-level all facet handler', { facetKey });\n const result = await this.options.allFacets[facetKey](\n req.query as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n this.getLocations(res),\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if allFacet operation exists\n if (!libOperations.allFacet) {\n res.status(500).json({ error: 'All Facets are not configured' });\n return;\n }\n\n // Fallback to library handler\n const combinedQueryParams = { ...(req.query || {}), ...(req.params || {}) } as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>;\n const result = await libOperations.allFacet(facetKey, combinedQueryParams, this.getLocations(res));\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in getAllFacet', { error });\n // Check if it's a validation error or facet not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'All Facet is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n protected postItemAction = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Posting Item Action', { 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\n try {\n // Check for router-level handler first\n if (this.options.actions && this.options.actions[actionKey]) {\n this.logger.debug('Using router-level action handler', { actionKey });\n const result = await this.options.actions[actionKey](\n ik,\n req.body as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if actions operation exists\n if (!libOperations.action) {\n res.status(500).json({ error: 'Item Actions are not configured' });\n return;\n }\n\n // Fallback to library handler\n const result = await libOperations.action(ik, actionKey, req.body);\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in postItemAction', { error });\n // Check if it's a validation error or action not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'Item Action is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n protected getItemFacet = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Getting Item Facet', { 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\n try {\n // Check for router-level handler first\n if (this.options.facets && this.options.facets[facetKey]) {\n this.logger.debug('Using router-level facet handler', { facetKey });\n const result = await this.options.facets[facetKey](\n ik,\n req.query as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if facets operation exists\n if (!libOperations.facet) {\n res.status(500).json({ error: 'Item Facets are not configured' });\n return;\n }\n\n // Fallback to library handler\n const combinedQueryParams = { ...(req.query || {}), ...(req.params || {}) } as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>;\n const result = await libOperations.facet(ik, facetKey, combinedQueryParams);\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in getItemFacet', { error });\n // Check if it's a validation error or facet not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'Item Facet is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n private configure = (router: Router) => {\n if (!this.lib) {\n this.logger.error('Library is undefined in configure');\n throw new Error('Library is required for router configuration');\n }\n // Ensure options exists - library should have options but handle case where it doesn't\n const libOptions = (this.lib as any).options || {};\n this.logger.debug('Configuring Router', { pkType: this.getPkType(), hasOptions: !!libOptions });\n router.get('/', this.wrapAsync(this.findItems));\n router.post('/', this.wrapAsync(this.createItem));\n\n // Track registered routes to detect collisions\n const registeredAllActions = new Set<string>();\n const registeredAllFacets = new Set<string>();\n const registeredItemActions = new Set<string>();\n const registeredItemFacets = new Set<string>();\n\n // Configure router-level allActions first (highest precedence)\n this.logger.default('Router All Actions', { allActions: this.options.allActions });\n if (this.options.allActions) {\n Object.keys(this.options.allActions).forEach((actionKey) => {\n this.logger.debug('Configuring Router All Action %s', actionKey);\n router.post(`/${actionKey}`, this.wrapAsync(this.postAllAction));\n registeredAllActions.add(actionKey);\n });\n }\n\n // Configure library allActions, warn on conflicts\n this.logger.default('Library All Actions', { allActions: libOptions.allActions });\n if (libOptions.allActions) {\n Object.keys(libOptions.allActions).forEach((actionKey) => {\n if (registeredAllActions.has(actionKey)) {\n this.logger.warning('All Action name collision - router-level handler takes precedence', { actionKey });\n } else {\n this.logger.debug('Configuring Library All Action %s', actionKey);\n router.post(`/${actionKey}`, this.wrapAsync(this.postAllAction));\n registeredAllActions.add(actionKey);\n }\n });\n }\n\n // Configure router-level allFacets first (highest precedence)\n this.logger.default('Router All Facets', { allFacets: this.options.allFacets });\n if (this.options.allFacets) {\n Object.keys(this.options.allFacets).forEach((facetKey) => {\n this.logger.debug('Configuring Router All Facet %s', facetKey);\n router.get(`/${facetKey}`, this.wrapAsync(this.getAllFacet));\n registeredAllFacets.add(facetKey);\n });\n }\n\n // Configure library allFacets, warn on conflicts\n this.logger.default('Library All Facets', { allFacets: libOptions.allFacets });\n if (libOptions.allFacets) {\n Object.keys(libOptions.allFacets).forEach((facetKey) => {\n if (registeredAllFacets.has(facetKey)) {\n this.logger.warning('All Facet name collision - router-level handler takes precedence', { facetKey });\n } else {\n this.logger.debug('Configuring Library All Facet %s', facetKey);\n router.get(`/${facetKey}`, this.wrapAsync(this.getAllFacet));\n registeredAllFacets.add(facetKey);\n }\n });\n }\n\n const itemRouter = Router();\n itemRouter.get('/', this.wrapAsync(this.getItem));\n itemRouter.put('/', this.wrapAsync(this.updateItem));\n itemRouter.delete('/', this.wrapAsync(this.deleteItem));\n\n // Configure router-level item actions first (highest precedence)\n this.logger.default('Router Item Actions', { itemActions: this.options.actions });\n if (this.options.actions) {\n Object.keys(this.options.actions).forEach((actionKey) => {\n this.logger.debug('Configuring Router Item Action %s', actionKey);\n itemRouter.post(`/${actionKey}`, this.wrapAsync(this.postItemAction));\n registeredItemActions.add(actionKey);\n });\n }\n\n // Configure library item actions, warn on conflicts\n this.logger.default('Library Item Actions', { itemActions: libOptions.actions });\n if (libOptions.actions) {\n Object.keys(libOptions.actions).forEach((actionKey) => {\n if (registeredItemActions.has(actionKey)) {\n this.logger.warning('Item Action name collision - router-level handler takes precedence', { actionKey });\n } else {\n this.logger.debug('Configuring Library Item Action %s', actionKey);\n itemRouter.post(`/${actionKey}`, this.wrapAsync(this.postItemAction));\n registeredItemActions.add(actionKey);\n }\n });\n }\n\n // Configure router-level item facets first (highest precedence)\n this.logger.default('Router Item Facets', { itemFacets: this.options.facets });\n if (this.options.facets) {\n Object.keys(this.options.facets).forEach((facetKey) => {\n this.logger.debug('Configuring Router Item Facet %s', facetKey);\n itemRouter.get(`/${facetKey}`, this.wrapAsync(this.getItemFacet));\n registeredItemFacets.add(facetKey);\n });\n }\n\n // Configure library item facets, warn on conflicts\n this.logger.default('Library Item Facets', { itemFacets: libOptions.facets });\n if (libOptions.facets) {\n Object.keys(libOptions.facets).forEach((facetKey) => {\n if (registeredItemFacets.has(facetKey)) {\n this.logger.warning('Item Facet name collision - router-level handler takes precedence', { facetKey });\n } else {\n this.logger.debug('Configuring Library Item Facet %s', facetKey);\n itemRouter.get(`/${facetKey}`, this.wrapAsync(this.getItemFacet));\n registeredItemFacets.add(facetKey);\n }\n });\n }\n\n this.logger.debug('Configuring Item Operations under PK Param %s', this.getPkParam());\n router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);\n\n if (this.childRouters) {\n this.configureChildRouters(itemRouter, this.childRouters);\n }\n\n // Apply error handler as last middleware\n router.use(this.errorHandler);\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?.originalUrl });\n res.status(400).json({ error: 'Invalid Primary Key', path: req?.originalUrl });\n }\n }\n\n private configureChildRouters = (router: Router, childRouters: Record<string, Router>) => {\n for (const path in childRouters) {\n this.logger.debug('Configuring Child Router at Path %s', 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 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.debug('Post Create Item', { item });\n return item;\n };\n\n protected deleteItem = async (req: Request, res: Response): Promise<void> => {\n const libOperations = this.lib.operations;\n\n this.logger.debug('Deleting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n\n try {\n const removedItem = await libOperations.remove(ik);\n if (removedItem) {\n const item = validatePK(removedItem, this.getPkType());\n res.json(item);\n } else {\n res.status(204).send();\n }\n } catch (error: any) {\n // Check for NotFoundError from various packages\n // Also check error.cause since errors may be wrapped\n const originalError = error?.cause || error;\n const isNotFound =\n error instanceof NotFoundError ||\n originalError instanceof NotFoundError ||\n error?.name === 'NotFoundError' ||\n originalError?.name === 'NotFoundError' ||\n error?.errorInfo?.code === 'NOT_FOUND' ||\n originalError?.errorInfo?.code === 'NOT_FOUND' ||\n (error?.message && (\n error.message.includes('not found') ||\n error.message.includes('Cannot remove') ||\n error.message.includes('Cannot update') ||\n error.message.toLowerCase().includes('not found')\n )) ||\n (originalError?.message && (\n originalError.message.includes('not found') ||\n originalError.message.includes('Cannot remove') ||\n originalError.message.includes('Cannot update') ||\n originalError.message.toLowerCase().includes('not found')\n ));\n \n if (isNotFound) {\n res.status(404).json({ ik, message: \"Item Not Found\" });\n } else {\n this.logger.error('Error in deleteItem', { error });\n res.status(500).json({ ik, message: \"General Error\" });\n }\n }\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 const libOperations = this.lib.operations;\n this.logger.debug('Getting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n\n try {\n const fetchedItem = await libOperations.get(ik);\n if (!fetchedItem) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: `${this.keyType} not found`,\n operation: {\n type: 'get',\n name: 'get',\n params: { key: ik }\n },\n context: {\n itemType: this.keyType\n },\n details: { retryable: false },\n technical: {\n timestamp: new Date().toISOString()\n }\n });\n }\n\n const item = validatePK(fetchedItem, this.getPkType());\n res.json(item);\n } catch (error: any) {\n // Check for NotFoundError from various packages\n // Also check error.cause since errors may be wrapped\n const originalError = error?.cause || error;\n const isNotFound =\n error instanceof NotFoundError ||\n originalError instanceof NotFoundError ||\n error?.name === 'NotFoundError' ||\n originalError?.name === 'NotFoundError' ||\n error?.errorInfo?.code === 'NOT_FOUND' ||\n originalError?.errorInfo?.code === 'NOT_FOUND' ||\n (error?.message && (\n error.message.includes('not found') ||\n error.message.includes('Cannot remove') ||\n error.message.includes('Cannot update') ||\n error.message.toLowerCase().includes('not found')\n )) ||\n (originalError?.message && (\n originalError.message.includes('not found') ||\n originalError.message.includes('Cannot remove') ||\n originalError.message.includes('Cannot update') ||\n originalError.message.toLowerCase().includes('not found')\n ));\n \n if (isNotFound) {\n res.status(404).json({ ik, message: \"Item Not Found\" });\n } else {\n this.logger.error('Error in getItem', { error });\n res.status(500).json({ ik, message: \"General Error\" });\n }\n }\n }\n\n protected updateItem = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Updating Item',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n\n try {\n const itemToUpdate = this.convertDates(req.body as Partial<Item<S, L1, L2, L3, L4, L5>>);\n const retItem = validatePK(await libOperations.update(ik, itemToUpdate), this.getPkType());\n res.json(retItem);\n } catch (error: any) {\n // Check for NotFoundError from various packages\n // Also check error.cause since errors may be wrapped\n const originalError = error?.cause || error;\n const isNotFound =\n error instanceof NotFoundError ||\n originalError instanceof NotFoundError ||\n error?.name === 'NotFoundError' ||\n originalError?.name === 'NotFoundError' ||\n error?.errorInfo?.code === 'NOT_FOUND' ||\n originalError?.errorInfo?.code === 'NOT_FOUND' ||\n (error?.message && (\n error.message.includes('not found') ||\n error.message.includes('Cannot remove') ||\n error.message.includes('Cannot update') ||\n error.message.includes('Update Failed') ||\n error.message.toLowerCase().includes('not found')\n )) ||\n (originalError?.message && (\n originalError.message.includes('not found') ||\n originalError.message.includes('Cannot remove') ||\n originalError.message.includes('Cannot update') ||\n originalError.message.toLowerCase().includes('not found')\n ));\n \n if (isNotFound) {\n res.status(404).json({ ik, message: \"Item Not Found\" });\n } else {\n this.logger.error('Error in updateItem', { error });\n res.status(500).json({ ik, message: \"General Error\" });\n }\n }\n };\n\n public convertDates = (item: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n this.logger.debug('Converting Dates', { item });\n const events = item.events as Record<string, ItemEvent> | undefined;\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"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n ActionError,\n ComKey,\n cPK,\n Item,\n ItemEvent,\n LocKey,\n LocKeyArray,\n PriKey,\n validatePK\n} from \"@fjell/core\";\nimport { NotFoundError } from \"@fjell/lib\";\nimport { Instance } from \"./Instance.js\";\nimport deepmerge from \"deepmerge\";\nimport { NextFunction, Request, Response, Router } from \"express\";\nimport LibLogger from \"./logger.js\";\nimport { createErrorHandler, ErrorHandlerOptions } from \"./errorHandler.js\";\n\n/**\n * Extract serializable error details from Error objects\n *\n * Error objects have non-enumerable properties that don't serialize to JSON.\n * This function explicitly extracts all meaningful details into a plain object.\n */\nfunction extractErrorDetails(error: any): Record<string, any> {\n if (!error) {\n return { type: 'unknown_error' };\n }\n\n const details: Record<string, any> = {};\n\n // Standard JavaScript Error properties\n if (typeof error.message === 'string') {\n details.message = error.message;\n }\n if (typeof error.name === 'string') {\n details.name = error.name;\n }\n if (typeof error.code === 'string' || typeof error.code === 'number') {\n details.code = error.code;\n }\n if (typeof error.stack === 'string') {\n details.stack = error.stack;\n }\n\n // Database-specific error properties (PostgreSQL/Sequelize)\n if (typeof error.constraint === 'string') {\n details.constraint = error.constraint;\n }\n if (typeof error.detail === 'string') {\n details.detail = error.detail;\n }\n if (typeof error.table === 'string') {\n details.table = error.table;\n }\n if (typeof error.column === 'string') {\n details.column = error.column;\n }\n\n // Sequelize validation errors\n if (error.errors && Array.isArray(error.errors)) {\n details.validationErrors = error.errors.map((e: any) => {\n const errorDetail: any = {\n message: e.message,\n type: e.type,\n path: e.path\n };\n if (e.value !== null && e.value !== void 0) {\n errorDetail.value = String(e.value).substring(0, 100);\n }\n return errorDetail;\n });\n }\n\n // HTTP status\n if (typeof error.status === 'number') {\n details.status = error.status;\n }\n if (typeof error.statusCode === 'number') {\n details.statusCode = error.statusCode;\n }\n\n return details;\n}\n\n/**\n * Router-level action method signature - aligned with library ActionMethod pattern\n * Takes the resolved item key, action parameters, and HTTP context\n */\nexport interface RouterActionMethod<\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 ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n actionParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\n/**\n * Router-level facet method signature - aligned with library FacetMethod pattern\n * Takes the resolved item key, facet parameters, and HTTP context\n */\nexport interface RouterFacetMethod<\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 ik: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n facetParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\n/**\n * Router-level all action method signature - aligned with library AllActionMethod pattern\n * Takes action parameters, optional locations, and HTTP context\n */\nexport interface RouterAllActionMethod<\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 allActionParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [],\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\n/**\n * Router-level all facet method signature - aligned with library AllFacetMethod pattern\n * Takes facet parameters, optional locations, and HTTP context\n */\nexport interface RouterAllFacetMethod<\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 allFacetParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [],\n context: { req: Request, res: Response }\n ): Promise<any>;\n}\n\nexport type ItemRouterOptions<\n S extends string = 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 * Handlers for item actions - aligned with library operation signatures\n * The key in the Record is the action name, method receives resolved item key and parameters\n */\n actions?: Record<string, RouterActionMethod<S, L1, L2, L3, L4, L5>>;\n\n /**\n * Handlers for item facets - aligned with library operation signatures\n * The key in the Record is the facet name, method receives resolved item key and parameters\n */\n facets?: Record<string, RouterFacetMethod<S, L1, L2, L3, L4, L5>>;\n\n /**\n * Handlers for all actions - aligned with library operation signatures\n * The key in the Record is the action name, method receives parameters and optional locations\n */\n allActions?: Record<string, RouterAllActionMethod<L1, L2, L3, L4, L5>>;\n\n /**\n * Handlers for all facets - aligned with library operation signatures\n * The key in the Record is the facet name, method receives parameters and optional locations\n */\n allFacets?: Record<string, RouterAllFacetMethod<L1, L2, L3, L4, L5>>;\n\n /**\n * Error handler configuration\n */\n errorHandler?: ErrorHandlerOptions;\n};\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: Instance<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;\n private keyType: S;\n protected options: ItemRouterOptions<S, L1, L2, L3, L4, L5>;\n private childRouters: Record<string, Router> = {};\n protected logger;\n protected parentRoute?: ItemRouter<L1, L2, L3, L4, L5, never>;\n protected errorHandler: (err: any, req: Request, res: Response, next: NextFunction) => void;\n\n constructor(\n lib: Instance<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,\n keyType: S,\n options: ItemRouterOptions<S, L1, L2, L3, L4, L5> = {},\n parentRoute?: ItemRouter<L1, L2, L3, L4, L5, never>\n ) {\n this.lib = lib;\n this.keyType = keyType;\n this.options = options;\n this.parentRoute = parentRoute;\n this.logger = LibLogger.get(\"ItemRouter\", keyType);\n this.errorHandler = createErrorHandler(options.errorHandler);\n }\n\n /**\n * Wrap async route handlers to catch errors and pass to error handler\n */\n protected wrapAsync(fn: (req: Request, res: Response, next: NextFunction) => Promise<any>) {\n return (req: Request, res: Response, next: NextFunction) => {\n Promise.resolve(fn.call(this, req, res, next)).catch(next);\n };\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 const pkParam = this.getPkParam();\n const lkValue = res.locals[pkParam];\n this.logger.debug('Getting location key', {\n keyType: this.keyType,\n pkParam: pkParam,\n lkValue: lkValue,\n allLocals: res.locals\n });\n return { kt: this.keyType, lk: lkValue };\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 protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [] {\n return this.parentRoute ? this.parentRoute.getLKA(res) as LocKeyArray<L1, L2, L3, L4, L5> : [];\n }\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 postAllAction = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Posting All Action', { query: req?.query, params: req?.params, locals: res?.locals });\n const allActionKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n\n try {\n // Check for router-level handler first\n if (this.options.allActions && this.options.allActions[allActionKey]) {\n this.logger.debug('Using router-level all action handler', { allActionKey });\n const result = await this.options.allActions[allActionKey](\n req.body as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n this.getLocations(res),\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if allAction operation exists\n if (!libOperations.allAction) {\n res.status(500).json({ error: 'All Actions are not configured' });\n return;\n }\n\n // Fallback to library handler\n const result = await libOperations.allAction(allActionKey, req.body, this.getLocations(res));\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in postAllAction', extractErrorDetails(error));\n // Check if it's a validation error or action not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'All Action is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n protected getAllFacet = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Getting All Facet', { query: req?.query, params: req?.params, locals: res?.locals });\n const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n\n try {\n // Check for router-level handler first\n if (this.options.allFacets && this.options.allFacets[facetKey]) {\n this.logger.debug('Using router-level all facet handler', { facetKey });\n const result = await this.options.allFacets[facetKey](\n req.query as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n this.getLocations(res),\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if allFacet operation exists\n if (!libOperations.allFacet) {\n res.status(500).json({ error: 'All Facets are not configured' });\n return;\n }\n\n // Fallback to library handler\n const combinedQueryParams = { ...(req.query || {}), ...(req.params || {}) } as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>;\n const result = await libOperations.allFacet(facetKey, combinedQueryParams, this.getLocations(res));\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in getAllFacet', extractErrorDetails(error));\n // Check if it's a validation error or facet not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'All Facet is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n protected postItemAction = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Posting Item Action', { 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\n try {\n // Check for router-level handler first\n if (this.options.actions && this.options.actions[actionKey]) {\n this.logger.debug('Using router-level action handler', { actionKey });\n const result = await this.options.actions[actionKey](\n ik,\n req.body as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if actions operation exists\n if (!libOperations.action) {\n res.status(500).json({ error: 'Item Actions are not configured' });\n return;\n }\n\n // Fallback to library handler\n const result = await libOperations.action(ik, actionKey, req.body);\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in postItemAction', extractErrorDetails(error));\n // Check if it's a validation error or action not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'Item Action is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n protected getItemFacet = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Getting Item Facet', { 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\n try {\n // Check for router-level handler first\n if (this.options.facets && this.options.facets[facetKey]) {\n this.logger.debug('Using router-level facet handler', { facetKey });\n const result = await this.options.facets[facetKey](\n ik,\n req.query as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n { req, res }\n );\n if (result != null) {\n res.json(result);\n }\n return;\n }\n\n // Check if facets operation exists\n if (!libOperations.facet) {\n res.status(500).json({ error: 'Item Facets are not configured' });\n return;\n }\n\n // Fallback to library handler\n const combinedQueryParams = { ...(req.query || {}), ...(req.params || {}) } as Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>;\n const result = await libOperations.facet(ik, facetKey, combinedQueryParams);\n res.json(result);\n } catch (error: any) {\n this.logger.error('Error in getItemFacet', extractErrorDetails(error));\n // Check if it's a validation error or facet not found error\n if ((error.name === 'ValidationError' || error.message?.includes('not found')) && error.message) {\n res.status(500).json({ error: 'Item Facet is not configured' });\n } else {\n res.status(500).json(error);\n }\n }\n }\n\n private configure = (router: Router) => {\n if (!this.lib) {\n this.logger.error('Library is undefined in configure');\n throw new Error('Library is required for router configuration');\n }\n // Ensure options exists - library should have options but handle case where it doesn't\n const libOptions = (this.lib as any).options || {};\n this.logger.debug('Configuring Router', { pkType: this.getPkType(), hasOptions: !!libOptions });\n router.get('/', this.wrapAsync(this.findItems));\n router.post('/', this.wrapAsync(this.createItem));\n\n // Track registered routes to detect collisions\n const registeredAllActions = new Set<string>();\n const registeredAllFacets = new Set<string>();\n const registeredItemActions = new Set<string>();\n const registeredItemFacets = new Set<string>();\n\n // Configure router-level allActions first (highest precedence)\n this.logger.default('Router All Actions', { allActions: this.options.allActions });\n if (this.options.allActions) {\n Object.keys(this.options.allActions).forEach((actionKey) => {\n this.logger.debug('Configuring Router All Action %s', actionKey);\n router.post(`/${actionKey}`, this.wrapAsync(this.postAllAction));\n registeredAllActions.add(actionKey);\n });\n }\n\n // Configure library allActions, warn on conflicts\n this.logger.default('Library All Actions', { allActions: libOptions.allActions });\n if (libOptions.allActions) {\n Object.keys(libOptions.allActions).forEach((actionKey) => {\n if (registeredAllActions.has(actionKey)) {\n this.logger.warning('All Action name collision - router-level handler takes precedence', { actionKey });\n } else {\n this.logger.debug('Configuring Library All Action %s', actionKey);\n router.post(`/${actionKey}`, this.wrapAsync(this.postAllAction));\n registeredAllActions.add(actionKey);\n }\n });\n }\n\n // Configure router-level allFacets first (highest precedence)\n this.logger.default('Router All Facets', { allFacets: this.options.allFacets });\n if (this.options.allFacets) {\n Object.keys(this.options.allFacets).forEach((facetKey) => {\n this.logger.debug('Configuring Router All Facet %s', facetKey);\n router.get(`/${facetKey}`, this.wrapAsync(this.getAllFacet));\n registeredAllFacets.add(facetKey);\n });\n }\n\n // Configure library allFacets, warn on conflicts\n this.logger.default('Library All Facets', { allFacets: libOptions.allFacets });\n if (libOptions.allFacets) {\n Object.keys(libOptions.allFacets).forEach((facetKey) => {\n if (registeredAllFacets.has(facetKey)) {\n this.logger.warning('All Facet name collision - router-level handler takes precedence', { facetKey });\n } else {\n this.logger.debug('Configuring Library All Facet %s', facetKey);\n router.get(`/${facetKey}`, this.wrapAsync(this.getAllFacet));\n registeredAllFacets.add(facetKey);\n }\n });\n }\n\n const itemRouter = Router();\n itemRouter.get('/', this.wrapAsync(this.getItem));\n itemRouter.put('/', this.wrapAsync(this.updateItem));\n itemRouter.delete('/', this.wrapAsync(this.deleteItem));\n\n // Configure router-level item actions first (highest precedence)\n this.logger.default('Router Item Actions', { itemActions: this.options.actions });\n if (this.options.actions) {\n Object.keys(this.options.actions).forEach((actionKey) => {\n this.logger.debug('Configuring Router Item Action %s', actionKey);\n itemRouter.post(`/${actionKey}`, this.wrapAsync(this.postItemAction));\n registeredItemActions.add(actionKey);\n });\n }\n\n // Configure library item actions, warn on conflicts\n this.logger.default('Library Item Actions', { itemActions: libOptions.actions });\n if (libOptions.actions) {\n Object.keys(libOptions.actions).forEach((actionKey) => {\n if (registeredItemActions.has(actionKey)) {\n this.logger.warning('Item Action name collision - router-level handler takes precedence', { actionKey });\n } else {\n this.logger.debug('Configuring Library Item Action %s', actionKey);\n itemRouter.post(`/${actionKey}`, this.wrapAsync(this.postItemAction));\n registeredItemActions.add(actionKey);\n }\n });\n }\n\n // Configure router-level item facets first (highest precedence)\n this.logger.default('Router Item Facets', { itemFacets: this.options.facets });\n if (this.options.facets) {\n Object.keys(this.options.facets).forEach((facetKey) => {\n this.logger.debug('Configuring Router Item Facet %s', facetKey);\n itemRouter.get(`/${facetKey}`, this.wrapAsync(this.getItemFacet));\n registeredItemFacets.add(facetKey);\n });\n }\n\n // Configure library item facets, warn on conflicts\n this.logger.default('Library Item Facets', { itemFacets: libOptions.facets });\n if (libOptions.facets) {\n Object.keys(libOptions.facets).forEach((facetKey) => {\n if (registeredItemFacets.has(facetKey)) {\n this.logger.warning('Item Facet name collision - router-level handler takes precedence', { facetKey });\n } else {\n this.logger.debug('Configuring Library Item Facet %s', facetKey);\n itemRouter.get(`/${facetKey}`, this.wrapAsync(this.getItemFacet));\n registeredItemFacets.add(facetKey);\n }\n });\n }\n\n this.logger.debug('Configuring Item Operations under PK Param %s', this.getPkParam());\n router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);\n\n if (this.childRouters) {\n this.configureChildRouters(itemRouter, this.childRouters);\n }\n\n // Apply error handler as last middleware\n router.use(this.errorHandler);\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?.originalUrl });\n res.status(400).json({ error: 'Invalid Primary Key', path: req?.originalUrl });\n }\n }\n\n private configureChildRouters = (router: Router, childRouters: Record<string, Router>) => {\n for (const path in childRouters) {\n this.logger.debug('Configuring Child Router at Path %s', 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 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.debug('Post Create Item', { item });\n return item;\n };\n\n protected deleteItem = async (req: Request, res: Response): Promise<void> => {\n const libOperations = this.lib.operations;\n\n this.logger.debug('Deleting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n\n try {\n const removedItem = await libOperations.remove(ik);\n if (removedItem) {\n const item = validatePK(removedItem, this.getPkType());\n res.json(item);\n } else {\n res.status(204).send();\n }\n } catch (error: any) {\n // Check for NotFoundError from various packages\n // Also check error.cause since errors may be wrapped\n const originalError = error?.cause || error;\n const isNotFound =\n error instanceof NotFoundError ||\n originalError instanceof NotFoundError ||\n error?.name === 'NotFoundError' ||\n originalError?.name === 'NotFoundError' ||\n error?.errorInfo?.code === 'NOT_FOUND' ||\n originalError?.errorInfo?.code === 'NOT_FOUND' ||\n (error?.message && (\n error.message.includes('not found') ||\n error.message.includes('Cannot remove') ||\n error.message.includes('Cannot update') ||\n error.message.toLowerCase().includes('not found')\n )) ||\n (originalError?.message && (\n originalError.message.includes('not found') ||\n originalError.message.includes('Cannot remove') ||\n originalError.message.includes('Cannot update') ||\n originalError.message.toLowerCase().includes('not found')\n ));\n\n if (isNotFound) {\n res.status(404).json({ ik, message: \"Item Not Found\" });\n } else {\n this.logger.error('Error in deleteItem', extractErrorDetails(error));\n res.status(500).json({ ik, message: \"General Error\" });\n }\n }\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 const libOperations = this.lib.operations;\n this.logger.debug('Getting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n\n try {\n const fetchedItem = await libOperations.get(ik);\n if (!fetchedItem) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: `${this.keyType} not found`,\n operation: {\n type: 'get',\n name: 'get',\n params: { key: ik }\n },\n context: {\n itemType: this.keyType\n },\n details: { retryable: false },\n technical: {\n timestamp: new Date().toISOString()\n }\n });\n }\n\n const item = validatePK(fetchedItem, this.getPkType());\n res.json(item);\n } catch (error: any) {\n // Check for NotFoundError from various packages\n // Also check error.cause since errors may be wrapped\n const originalError = error?.cause || error;\n const isNotFound =\n error instanceof NotFoundError ||\n originalError instanceof NotFoundError ||\n error?.name === 'NotFoundError' ||\n originalError?.name === 'NotFoundError' ||\n error?.errorInfo?.code === 'NOT_FOUND' ||\n originalError?.errorInfo?.code === 'NOT_FOUND' ||\n (error?.message && (\n error.message.includes('not found') ||\n error.message.includes('Cannot remove') ||\n error.message.includes('Cannot update') ||\n error.message.toLowerCase().includes('not found')\n )) ||\n (originalError?.message && (\n originalError.message.includes('not found') ||\n originalError.message.includes('Cannot remove') ||\n originalError.message.includes('Cannot update') ||\n originalError.message.toLowerCase().includes('not found')\n ));\n\n if (isNotFound) {\n res.status(404).json({ ik, message: \"Item Not Found\" });\n } else {\n this.logger.error('Error in getItem', extractErrorDetails(error));\n res.status(500).json({ ik, message: \"General Error\" });\n }\n }\n }\n\n protected updateItem = async (req: Request, res: Response) => {\n const libOperations = this.lib.operations;\n this.logger.debug('Updating Item',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n\n try {\n const itemToUpdate = this.convertDates(req.body as Partial<Item<S, L1, L2, L3, L4, L5>>);\n const retItem = validatePK(await libOperations.update(ik, itemToUpdate), this.getPkType());\n res.json(retItem);\n } catch (error: any) {\n // Check for NotFoundError from various packages\n // Also check error.cause since errors may be wrapped\n const originalError = error?.cause || error;\n const isNotFound =\n error instanceof NotFoundError ||\n originalError instanceof NotFoundError ||\n error?.name === 'NotFoundError' ||\n originalError?.name === 'NotFoundError' ||\n error?.errorInfo?.code === 'NOT_FOUND' ||\n originalError?.errorInfo?.code === 'NOT_FOUND' ||\n (error?.message && (\n error.message.includes('not found') ||\n error.message.includes('Cannot remove') ||\n error.message.includes('Cannot update') ||\n error.message.includes('Update Failed') ||\n error.message.toLowerCase().includes('not found')\n )) ||\n (originalError?.message && (\n originalError.message.includes('not found') ||\n originalError.message.includes('Cannot remove') ||\n originalError.message.includes('Cannot update') ||\n originalError.message.toLowerCase().includes('not found')\n ));\n\n if (isNotFound) {\n res.status(404).json({ ik, message: \"Item Not Found\" });\n } else {\n this.logger.error('Error in updateItem', extractErrorDetails(error));\n res.status(500).json({ ik, message: \"General Error\" });\n }\n }\n };\n\n public convertDates = (item: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n this.logger.debug('Converting Dates', { item });\n const events = item.events as Record<string, ItemEvent> | undefined;\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["result"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjell/express-router",
|
|
3
3
|
"description": "Express Router for Fjell",
|
|
4
|
-
"version": "4.4.
|
|
4
|
+
"version": "4.4.79",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"express",
|
|
7
7
|
"router",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@fjell/core": "^4.4.73",
|
|
38
|
-
"@fjell/lib": "^4.4.
|
|
38
|
+
"@fjell/lib": "^4.4.83",
|
|
39
39
|
"@fjell/logging": "^4.4.65",
|
|
40
40
|
"@fjell/registry": "^4.4.81",
|
|
41
41
|
"deepmerge": "^4.3.1",
|