aws-service-stack 0.14.187 → 0.14.190
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/_examples/controller/e-order/e-order.config.js +2 -2
- package/dist/_examples/controller/e-order/e-order.config.js.map +1 -1
- package/dist/_examples/controller/profile/profile.config.js +2 -2
- package/dist/_examples/controller/profile/profile.config.js.map +1 -1
- package/dist/_examples/controller/supplier/supplier-config.js +1 -1
- package/dist/_examples/controller/supplier/supplier-config.js.map +1 -1
- package/dist/controller/base-controller.d.ts +1 -1
- package/dist/controller/base-controller.js +12 -7
- package/dist/controller/base-controller.js.map +1 -1
- package/dist/index.d.ts +1 -14
- package/dist/index.js +1 -32
- package/dist/index.js.map +1 -1
- package/dist/model/base.config.d.ts +3 -3
- package/dist/model/base.config.js +1 -1
- package/dist/model/base.config.js.map +1 -1
- package/dist/service/base.service.js +1 -1
- package/dist/service/base.service.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -1
|
@@ -28,7 +28,7 @@ class EOrderConfig extends base_config_1.EntityConfigImpl {
|
|
|
28
28
|
.set("byRecipientPhone", { field: "recipientPhone", rFields: ["recipientPhone"] })
|
|
29
29
|
.set("bySocialInvoice", { field: "socialInvoiceId", rFields: ["socialInvoiceId"] });
|
|
30
30
|
// PERMISSIONS
|
|
31
|
-
const
|
|
31
|
+
const adminGroupNames = ["adminUsers"];
|
|
32
32
|
const policyList = [
|
|
33
33
|
{ method: core_1.HttpMethod.GET, path: `${exports.path}`, access: [core_1.Access.ADMIN], response: order_repo_db_interface_1.RESPONSE_FIELDS_LIST },
|
|
34
34
|
{ method: core_1.HttpMethod.GET, path: `${exports.path}/search`, access: [core_1.Access.ADMIN], response: order_repo_db_interface_1.RESPONSE_FIELDS_LIST },
|
|
@@ -39,7 +39,7 @@ class EOrderConfig extends base_config_1.EntityConfigImpl {
|
|
|
39
39
|
{ method: core_1.HttpMethod.DELETE, path: `${exports.path}/{id}`, access: [core_1.Access.ADMIN] },
|
|
40
40
|
];
|
|
41
41
|
// INIT
|
|
42
|
-
super(exports.path,
|
|
42
|
+
super(exports.path, adminGroupNames);
|
|
43
43
|
this.setDynamoDB(tableName, ownerFieldName, indexMap)
|
|
44
44
|
.setOpenSearch(exports.openSearch_order.domain, exports.openSearch_order.index)
|
|
45
45
|
.setPolicies(policyList);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"e-order.config.js","sourceRoot":"","sources":["../../../../src/_examples/controller/e-order/e-order.config.ts"],"names":[],"mappings":";;;AAAA,4DAA8D;AAC9D,yCAA8F;AAC9F,8FAM0D;AAE1D,2BAA2B;AACd,QAAA,gBAAgB,GAAG;IAC9B,MAAM,EAAE,wGAAwG;IAChH,KAAK,EAAE,OAAO;CACf,CAAC;AACW,QAAA,IAAI,GAAG,WAAW,CAAC,CAAC,gBAAgB;AAEjD,sBAAsB;AACtB,MAAa,YAAa,SAAQ,8BAAgB;IAChD;QACE,WAAW;QACX,MAAM,SAAS,GAAG,uCAAuC,CAAC;QAC1D,MAAM,cAAc,GAAG,WAAW,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,qBAAc,EAAE;aAClC,SAAS,CAAC,WAAW,CAAC;aACtB,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;aACrE,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;aAC9E,GAAG,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC;aAC7F,GAAG,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;aAClE,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;aAClF,GAAG,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;aACrE,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;aAChE,GAAG,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;aACjF,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAEtF,cAAc;QACd,MAAM,
|
|
1
|
+
{"version":3,"file":"e-order.config.js","sourceRoot":"","sources":["../../../../src/_examples/controller/e-order/e-order.config.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityConfigImpl } from \"../../../model/base.config\";\nimport { Access as a, DynamoIndexMap, EndpointPolicy, HttpMethod as m } from \"@chinggis/core\";\nimport {\n CREATE,\n REPLACE,\n RESPONSE_FIELDS_DETAILS as FIELDS_D,\n RESPONSE_FIELDS_LIST as FIELDS_L,\n UPDATE,\n} from \"../../repositories/order/order-repo-db.interface\";\n\n// OpenSearch configuration\nexport const openSearch_order = {\n domain: \"https://search-amplify-opense-1ddfdekgbbpwe-kgxh6aum57h2wc4moozm2jcvom.ap-southeast-1.es.amazonaws.com\",\n index: \"order\",\n};\nexport const path = \"/e-orders\"; // url path base\n\n// Order configuration\nexport class EOrderConfig extends EntityConfigImpl {\n constructor() {\n // DYNAMODB\n const tableName = \"Order-y6r5xlyvorgtjjnyugtn4bz7ga-prod\";\n const ownerFieldName = \"profileId\";\n const indexMap = new DynamoIndexMap()\n .setFields(\"profileId\")\n .set(\"byClientType\", { field: \"clientType\", rFields: [\"clientType\"] })\n .set(\"byCompletedDate\", { field: \"completedDate\", rFields: [\"completedDate\"] })\n .set(\"byCompletedYearMonth\", { field: \"completedYearMonth\", rFields: [\"completedYearMonth\"] })\n .set(\"byLicenceId\", { field: \"licenceId\", rFields: [\"licenceId\"] })\n .set(\"byMonPayInvoice\", { field: \"monPayInvoiceId\", rFields: [\"monPayInvoiceId\"] })\n .set(\"byOdooNumber\", { field: \"odooNumber\", rFields: [\"odooNumber\"] })\n .set(\"byProfile\", { field: \"profileId\", rFields: [\"profileId\"] })\n .set(\"byRecipientPhone\", { field: \"recipientPhone\", rFields: [\"recipientPhone\"] })\n .set(\"bySocialInvoice\", { field: \"socialInvoiceId\", rFields: [\"socialInvoiceId\"] });\n\n // PERMISSIONS\n const adminGroupNames = [\"adminUsers\"];\n const policyList: EndpointPolicy[] = [\n { method: m.GET, path: `${path}`, access: [a.ADMIN], response: FIELDS_L },\n { method: m.GET, path: `${path}/search`, access: [a.ADMIN], response: FIELDS_L },\n { method: m.GET, path: `${path}/{id}`, access: [a.OWNER, a.ADMIN], response: FIELDS_D },\n { method: m.POST, path: `${path}`, access: [a.ADMIN], validator: CREATE, response: FIELDS_D },\n { method: m.PUT, path: `${path}/{id}`, access: [a.ADMIN], validator: REPLACE, response: FIELDS_D },\n { method: m.PATCH, path: `${path}/{id}`, access: [a.ADMIN], validator: UPDATE, response: FIELDS_D },\n { method: m.DELETE, path: `${path}/{id}`, access: [a.ADMIN] },\n ];\n\n // INIT\n super(path, adminGroupNames);\n this.setDynamoDB(tableName, ownerFieldName, indexMap)\n .setOpenSearch(openSearch_order.domain, openSearch_order.index)\n .setPolicies(policyList);\n }\n}\n\n// Export default Order configuration\nexport const CONFIG_E_ORDER = new EOrderConfig();\n"]}
|
|
@@ -16,7 +16,7 @@ class ProfileConfig extends base_config_1.EntityConfigImpl {
|
|
|
16
16
|
const opensearchIndex = "profiles"; // demo
|
|
17
17
|
const basePath = "profiles"; // url path base
|
|
18
18
|
const ownerFieldName = "profileId";
|
|
19
|
-
const
|
|
19
|
+
const adminGroupNames = ["admin"];
|
|
20
20
|
/**
|
|
21
21
|
* INDEX_MAP
|
|
22
22
|
* */
|
|
@@ -60,7 +60,7 @@ class ProfileConfig extends base_config_1.EntityConfigImpl {
|
|
|
60
60
|
lastName: zod_1.z.string().min(1).max(50).optional(),
|
|
61
61
|
dateOfBirth: zod_1.z.string().datetime().optional(),
|
|
62
62
|
});
|
|
63
|
-
super(basePath,
|
|
63
|
+
super(basePath, adminGroupNames);
|
|
64
64
|
this.setDynamoDB(tableName, ownerFieldName, indexMap)
|
|
65
65
|
.setOpenSearch(opensearchIndex, "profile")
|
|
66
66
|
.setPolicies(permissions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.config.js","sourceRoot":"","sources":["../../../../src/_examples/controller/profile/profile.config.ts"],"names":[],"mappings":";;;AAAA,yCAAoE;AACpE,4DAA8D;AAC9D,6BAAwB;AAExB;;GAEG;AACH,MAAa,aAAc,SAAQ,8BAAgB;IACjD;QACE;;aAEK;QACL,MAAM,SAAS,GAAG,wCAAwC,CAAC;QAC3D,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,OAAO;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,gBAAgB;QAC7C,MAAM,cAAc,GAAG,WAAW,CAAC;QACnC,MAAM,
|
|
1
|
+
{"version":3,"file":"profile.config.js","sourceRoot":"","sources":["../../../../src/_examples/controller/profile/profile.config.ts"],"names":[],"mappings":"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","sourcesContent":["import { Access, DynamoIndexMap, HttpMethod } from \"@chinggis/core\";\nimport { EntityConfigImpl } from \"../../../model/base.config\";\nimport { z } from \"zod\";\n\n/**\n * Profile-specific configuration extending generic EntityConfig\n */\nexport class ProfileConfig extends EntityConfigImpl {\n constructor() {\n /**\n * BASE\n * */\n const tableName = \"Profile-s4ph7chlarhupiqw7ml47pmehq-dev\";\n const opensearchIndex = \"profiles\"; // demo\n const basePath = \"profiles\"; // url path base\n const ownerFieldName = \"profileId\";\n const adminGroupNames = [\"admin\"];\n\n /**\n * INDEX_MAP\n * */\n const indexMap = new DynamoIndexMap()\n .setFields(\"profileId\")\n .set(\"byPhone\", { field: \"phone\", rFields: [\"phone\"] })\n .set(\"byVerifyPhone\", { field: \"toVerifyPhone\", rFields: [\"toVerifyPhone\"] })\n .set(\"byEmail\", { field: \"email\", rFields: [\"email\"] })\n .set(\"byCardNumber\", { field: \"cardNumber\", rFields: [\"cardNumber\"] });\n\n /**\n * PERMISSIONS\n * */\n const permissions = [\n {\n method: HttpMethod.GET,\n path: `/${basePath}`,\n access: [Access.PUBLIC, Access.USER, Access.OWNER, Access.ADMIN],\n },\n { method: HttpMethod.GET, path: `/${basePath}/{id}`, access: [Access.OWNER, Access.ADMIN] },\n { method: HttpMethod.POST, path: `/${basePath}`, access: [Access.ADMIN] },\n { method: HttpMethod.PUT, path: `/${basePath}/{id}`, access: [Access.OWNER, Access.ADMIN] },\n { method: HttpMethod.PATCH, path: `/${basePath}/{id}`, access: [Access.OWNER, Access.ADMIN] },\n { method: HttpMethod.DELETE, path: `/${basePath}/{id}`, access: [Access.ADMIN] },\n ];\n\n /**\n * VALIDATORS\n * */\n const createValidator = z.object({\n phone: z.string().min(10).max(15).optional(),\n email: z.string().email().optional(),\n cardNumber: z.string().min(16).max(19).optional(),\n firstName: z.string().min(1).max(50),\n lastName: z.string().min(1).max(50),\n dateOfBirth: z.string().datetime().optional(),\n });\n\n const updateValidator = z.object({\n phone: z.string().min(10).max(15).optional(),\n email: z.string().email().optional(),\n cardNumber: z.string().min(16).max(19).optional(),\n firstName: z.string().min(1).max(50).optional(),\n lastName: z.string().min(1).max(50).optional(),\n dateOfBirth: z.string().datetime().optional(),\n });\n\n super(basePath, adminGroupNames);\n\n this.setDynamoDB(tableName, ownerFieldName, indexMap)\n .setOpenSearch(opensearchIndex, \"profile\")\n .setPolicies(permissions);\n }\n}\n\n// Export default Profile configuration\nexport const CONFIG_PROFILE = new ProfileConfig();\n"]}
|
|
@@ -18,7 +18,7 @@ class SupplierConfig extends core_1.EntityConfigImpl {
|
|
|
18
18
|
.setFields("username")
|
|
19
19
|
.set("byAccountType", { field: "accountType", rFields: ["accountType"] });
|
|
20
20
|
// PERMISSIONS
|
|
21
|
-
const adminGroupName = "adminUsers";
|
|
21
|
+
const adminGroupName = ["adminUsers"];
|
|
22
22
|
const policyList = [
|
|
23
23
|
{ method: core_1.HttpMethod.GET, path: `${exports.path}`, access: [core_1.Access.ADMIN], response: suppler_model_1.RESPONSE_FIELDS_LIST },
|
|
24
24
|
{ method: core_1.HttpMethod.GET, path: `${exports.path}/search`, access: [core_1.Access.ADMIN], response: suppler_model_1.RESPONSE_FIELDS_LIST },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supplier-config.js","sourceRoot":"","sources":["../../../../src/_examples/controller/supplier/supplier-config.ts"],"names":[],"mappings":";;;AAAA,yCAAgH;AAChH,oEAM0C;AAE7B,QAAA,mBAAmB,GAAG;IACjC,MAAM,EAAE,wGAAwG;IAChH,KAAK,EAAE,UAAU;CAClB,CAAC;AACW,QAAA,IAAI,GAAG,oBAAoB,CAAC,CAAC,gBAAgB;AAE1D,yBAAyB;AACzB,MAAa,cAAe,SAAQ,uBAAgB;IAClD;QACE,WAAW;QACX,MAAM,SAAS,GAAG,yCAAyC,CAAC;QAC5D,MAAM,cAAc,GAAG,UAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,qBAAc,EAAE;aAClC,SAAS,CAAC,UAAU,CAAC;aACrB,GAAG,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAE5E,cAAc;QACd,MAAM,cAAc,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"supplier-config.js","sourceRoot":"","sources":["../../../../src/_examples/controller/supplier/supplier-config.ts"],"names":[],"mappings":";;;AAAA,yCAAgH;AAChH,oEAM0C;AAE7B,QAAA,mBAAmB,GAAG;IACjC,MAAM,EAAE,wGAAwG;IAChH,KAAK,EAAE,UAAU;CAClB,CAAC;AACW,QAAA,IAAI,GAAG,oBAAoB,CAAC,CAAC,gBAAgB;AAE1D,yBAAyB;AACzB,MAAa,cAAe,SAAQ,uBAAgB;IAClD;QACE,WAAW;QACX,MAAM,SAAS,GAAG,yCAAyC,CAAC;QAC5D,MAAM,cAAc,GAAG,UAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,qBAAc,EAAE;aAClC,SAAS,CAAC,UAAU,CAAC;aACrB,GAAG,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAE5E,cAAc;QACd,MAAM,cAAc,GAAG,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,UAAU,GAAqB;YACnC,EAAE,MAAM,EAAE,iBAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,YAAI,EAAE,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,oCAAQ,EAAE;YACzE,EAAE,MAAM,EAAE,iBAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,YAAI,SAAS,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,oCAAQ,EAAE;YAChF,EAAE,MAAM,EAAE,iBAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,YAAI,qBAAqB,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,oCAAQ,EAAE;YAC5F,EAAE,MAAM,EAAE,iBAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,YAAI,OAAO,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,EAAE,aAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,uCAAQ,EAAE;YACvF,EAAE,MAAM,EAAE,iBAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,YAAI,EAAE,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,sBAAM,EAAE,QAAQ,EAAE,uCAAQ,EAAE;YAC7F,EAAE,MAAM,EAAE,iBAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,YAAI,OAAO,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,uBAAO,EAAE,QAAQ,EAAE,uCAAQ,EAAE;YAClG,EAAE,MAAM,EAAE,iBAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAI,OAAO,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,sBAAM,EAAE,QAAQ,EAAE,uCAAQ,EAAE;YACnG,EAAE,MAAM,EAAE,iBAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,YAAI,OAAO,EAAE,MAAM,EAAE,CAAC,aAAC,CAAC,KAAK,CAAC,EAAE;SAC9D,CAAC;QAEF,OAAO;QACP,KAAK,CAAC,YAAI,EAAE,cAAc,CAAC,CAAC;QAC5B,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC;aAClD,aAAa,CAAC,2BAAmB,CAAC,MAAM,EAAE,2BAAmB,CAAC,KAAK,CAAC;aACpE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;CACF;AA5BD,wCA4BC;AAED,wCAAwC;AAC3B,QAAA,eAAe,GAAG,IAAI,cAAc,EAAE,CAAC","sourcesContent":["import { Access as a, DynamoIndexMap, EndpointPolicy, EntityConfigImpl, HttpMethod as m } from \"@chinggis/core\";\nimport {\n CREATE,\n REPLACE,\n RESPONSE_FIELDS_DETAILS as FIELDS_D,\n RESPONSE_FIELDS_LIST as FIELDS_L,\n UPDATE,\n} from \"../../model-shared/suppler.model\";\n\nexport const openSearch_supplier = {\n domain: \"https://search-amplify-opense-1qu4zfdauaeh1-ncvbubjnpcsfempstbsykhoadi.ap-southeast-1.es.amazonaws.com\",\n index: \"saccount\",\n};\nexport const path = \"/supplier/accounts\"; // url path base\n\n// Supplier configuration\nexport class SupplierConfig extends EntityConfigImpl {\n constructor() {\n // DYNAMODB\n const tableName = \"SAccount-2i5o74z4mjf6lpabqp7myrkdre-dev\";\n const ownerFieldName = \"username\";\n const indexMap = new DynamoIndexMap()\n .setFields(\"username\")\n .set(\"byAccountType\", { field: \"accountType\", rFields: [\"accountType\"] });\n\n // PERMISSIONS\n const adminGroupName = [\"adminUsers\"];\n const policyList: EndpointPolicy[] = [\n { method: m.GET, path: `${path}`, access: [a.ADMIN], response: FIELDS_L },\n { method: m.GET, path: `${path}/search`, access: [a.ADMIN], response: FIELDS_L },\n { method: m.GET, path: `${path}/list-non-level-one`, access: [a.ADMIN], response: FIELDS_L },\n { method: m.GET, path: `${path}/{id}`, access: [a.OWNER, a.ADMIN], response: FIELDS_D },\n { method: m.POST, path: `${path}`, access: [a.ADMIN], validator: CREATE, response: FIELDS_D },\n { method: m.PUT, path: `${path}/{id}`, access: [a.ADMIN], validator: REPLACE, response: FIELDS_D },\n { method: m.PATCH, path: `${path}/{id}`, access: [a.ADMIN], validator: UPDATE, response: FIELDS_D },\n { method: m.DELETE, path: `${path}/{id}`, access: [a.ADMIN] },\n ];\n\n // INIT\n super(path, adminGroupName);\n this.setDynamoDB(tableName, ownerFieldName, indexMap)\n .setOpenSearch(openSearch_supplier.domain, openSearch_supplier.index)\n .setPolicies(policyList);\n }\n}\n\n// Export default Supplier configuration\nexport const CONFIG_SUPPLIER = new SupplierConfig();\n"]}
|
|
@@ -7,7 +7,7 @@ export declare abstract class BaseController<T extends BaseService<any, any>> {
|
|
|
7
7
|
protected isAdmin: boolean;
|
|
8
8
|
protected request: HttpRequest;
|
|
9
9
|
protected readonly service: T;
|
|
10
|
-
protected
|
|
10
|
+
protected adminGroupNames: string[];
|
|
11
11
|
protected requestBody: any;
|
|
12
12
|
protected triggerEvent: any;
|
|
13
13
|
protected eventAttr: any;
|
|
@@ -16,7 +16,6 @@ const errors_1 = require("../exception/errors");
|
|
|
16
16
|
const string_util_1 = require("../utils/string.util");
|
|
17
17
|
class BaseController {
|
|
18
18
|
constructor(baseService, config) {
|
|
19
|
-
this.adminGroupName = "admin";
|
|
20
19
|
this.groups = [];
|
|
21
20
|
this.service = baseService;
|
|
22
21
|
// Store config for use in subclasses
|
|
@@ -25,7 +24,7 @@ class BaseController {
|
|
|
25
24
|
this.config = config;
|
|
26
25
|
// Set adminGroupName from config if available
|
|
27
26
|
if (config.ADMIN_GROUP_NAME) {
|
|
28
|
-
this.
|
|
27
|
+
this.adminGroupNames = config.ADMIN_GROUP_NAME;
|
|
29
28
|
}
|
|
30
29
|
this.service.setConfig(config);
|
|
31
30
|
}
|
|
@@ -274,13 +273,19 @@ class BaseController {
|
|
|
274
273
|
this.request.filterAndSort[ownerIdFieldName] = this.profileId;
|
|
275
274
|
}
|
|
276
275
|
bootstrapRequest(event) {
|
|
277
|
-
var _a, _b, _c, _d, _e;
|
|
278
|
-
const claims = (
|
|
276
|
+
var _a, _b, _c, _d, _e, _f;
|
|
277
|
+
const claims = (_b = (_a = event.requestContext) === null || _a === void 0 ? void 0 : _a.authorizer) === null || _b === void 0 ? void 0 : _b.claims;
|
|
279
278
|
this.groups = (claims === null || claims === void 0 ? void 0 : claims["cognito:groups"]) || [];
|
|
280
279
|
this.username = (claims === null || claims === void 0 ? void 0 : claims["cognito:username"]) || "";
|
|
281
280
|
this.userId = (_c = claims === null || claims === void 0 ? void 0 : claims.sub) !== null && _c !== void 0 ? _c : "";
|
|
282
281
|
this.profileId = (claims === null || claims === void 0 ? void 0 : claims["custom:profileId"]) || this.userId;
|
|
283
|
-
this.isAdmin =
|
|
282
|
+
this.isAdmin = (_d = this.groups) === null || _d === void 0 ? void 0 : _d.some((userGroup) => this.adminGroupNames.some((adminGroup) => userGroup.toLowerCase() === adminGroup.toLowerCase()));
|
|
283
|
+
for (const group of this.groups) {
|
|
284
|
+
if (this.username.toLowerCase().includes(group.toLowerCase())) {
|
|
285
|
+
this.isAdmin = true;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
284
289
|
if (this.isAdmin) {
|
|
285
290
|
delete this.profileId;
|
|
286
291
|
this.requestType = index_1.RequestType.ADMIN;
|
|
@@ -293,14 +298,14 @@ class BaseController {
|
|
|
293
298
|
// log.info(
|
|
294
299
|
// `groups:${this.groups}, isAdmin:${this.isAdmin}, userId:${this.userId}, profileId:${this.profileId}, username:${this.username}, requestType:${this.requestType}`,
|
|
295
300
|
// );
|
|
296
|
-
this.path = (
|
|
301
|
+
this.path = (_e = event === null || event === void 0 ? void 0 : event.requestContext) === null || _e === void 0 ? void 0 : _e.resourcePath;
|
|
297
302
|
this.methode = event.httpMethod;
|
|
298
303
|
this.resourcePath = `${this.methode} ${this.path}`;
|
|
299
304
|
this.request = (0, index_1.parseHttpRequest)(event);
|
|
300
305
|
this.requestBody = this.request.body;
|
|
301
306
|
this.event = event;
|
|
302
307
|
this.resource = event.resource || "";
|
|
303
|
-
this.entityId = ((
|
|
308
|
+
this.entityId = ((_f = event.pathParameters) === null || _f === void 0 ? void 0 : _f.id) || "";
|
|
304
309
|
//DEV
|
|
305
310
|
// const host = this.request.headers["Host"] || "";
|
|
306
311
|
// const isLocalhost = host.includes("localhost");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-controller.js","sourceRoot":"","sources":["../../src/controller/base-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Access,\n APIResponse,\n BaseService,\n createApiResponse,\n EndpointPolicy,\n findMatchedPolicy,\n formatErrors,\n getTableName,\n HttpMethod,\n HttpRequest,\n parseEventToAction,\n parseHttpRequest,\n parseImage,\n removeFields,\n RequestType,\n ResponseFields,\n validateWithSchema,\n} from \"../index\";\nimport {\n APIGatewayProxyEvent,\n APIGatewayProxyWebsocketEventV2,\n CreateAuthChallengeTriggerEvent,\n DefineAuthChallengeTriggerEvent,\n DynamoDBStreamEvent,\n PostConfirmationTriggerEvent,\n PreSignUpTriggerEvent,\n ScheduledEvent,\n SQSEvent,\n VerifyAuthChallengeResponseTriggerEvent,\n} from \"aws-lambda\";\nimport { errorHandlerHttp } from \"../exception/exception-handler\";\nimport { ErrorHttp } from \"../exception/errors\";\nimport { EntityConfig } from \"../model/base.config\";\nimport { trimSpecialChar } from \"../utils/string.util\";\n\nexport abstract class BaseController<T extends BaseService<any, any>> {\n protected resourcePath: string;\n protected userId: string;\n protected isAdmin: boolean;\n protected request: HttpRequest;\n protected readonly service: T;\n protected adminGroupName: string = \"admin\";\n protected requestBody: any;\n protected triggerEvent: any;\n protected eventAttr: any;\n protected event: APIGatewayProxyEvent;\n protected resource: string;\n protected entityId: string;\n protected methode: HttpMethod;\n protected groups: string[] = [];\n protected username: string;\n private profileId: string;\n private requestType: RequestType;\n private config: EntityConfig;\n private path: string;\n\n protected constructor(baseService: T, config: EntityConfig) {\n this.service = baseService;\n\n // Store config for use in subclasses\n if (!config) return;\n\n this.config = config;\n // Set adminGroupName from config if available\n if (config.ADMIN_GROUP_NAME) {\n this.adminGroupName = config.ADMIN_GROUP_NAME;\n }\n\n this.service.setConfig(config);\n }\n\n async resolveCrudRequest(event: APIGatewayProxyEvent): Promise<APIResponse> {\n try {\n this.bootstrapRequest(event);\n\n const policy: EndpointPolicy | undefined = findMatchedPolicy(\n this.methode,\n this.path,\n this.config.ENDPOINT_POLICY,\n );\n\n this.checkPermission(policy?.access);\n this.validateRequest(policy?.validator);\n this.setUserFilter();\n\n const response: any = await this.handleCrudByMethod(event);\n\n if (!policy?.response) {\n return createApiResponse(200, response);\n }\n\n const filteredResponse = this.filterResponse(response, policy.response);\n\n return createApiResponse(200, filteredResponse);\n } catch (err) {\n const error = errorHandlerHttp(err);\n return createApiResponse(error.statusCode, error.content);\n }\n }\n\n async resolveSQSEvent(sqsEvent: SQSEvent): Promise<void> {\n try {\n await this.processSQSEvent(sqsEvent);\n } catch (error) {\n console.error(\"Error handling SQS event:\", error);\n }\n }\n\n async resolveStreamEvent(event: DynamoDBStreamEvent): Promise<void> {\n try {\n for (const record of event.Records) {\n const oldItem = parseImage(record.dynamodb.OldImage) as T;\n const newItem = parseImage(record.dynamodb.NewImage) as T;\n\n await this.service.processChanges(\n oldItem,\n newItem,\n parseEventToAction(record.eventName),\n getTableName(record.eventSourceARN),\n );\n }\n await this.processStreamEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n async resolveScheduledEvent(event: ScheduledEvent): Promise<void> {\n try {\n await this.processScheduledEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n async resolveWebSocketEvent(event: APIGatewayProxyWebsocketEventV2): Promise<void> {\n try {\n return await this.processWebSocketEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n async resolveTriggerEvent(\n event:\n | CreateAuthChallengeTriggerEvent\n | DefineAuthChallengeTriggerEvent\n | VerifyAuthChallengeResponseTriggerEvent\n | PostConfirmationTriggerEvent\n | PreSignUpTriggerEvent,\n ): Promise<void> {\n try {\n this.triggerEvent = event;\n this.eventAttr = this.triggerEvent.userAttributes;\n return await this.processTriggerEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n setConfig(config: EntityConfig): void {\n this.config = config;\n }\n\n protected async handleList(): Promise<any> {\n if (this.methode === \"GET\" && trimSpecialChar(this.path) === trimSpecialChar(this.config.BASE_PATH)) {\n return await this.service.find(this.request.filterAndSort || {});\n }\n\n if (this.methode === \"GET\" && trimSpecialChar(this.path) === trimSpecialChar(this.config.BASE_PATH) + \"/search\") {\n return await this.service.search(this.request.filterAndSort || {});\n }\n\n if (this.methode === \"GET\" && trimSpecialChar(this.path) === trimSpecialChar(this.config.BASE_PATH) + \"/scan\") {\n return await this.service.scan(this.request.filterAndSort || {});\n }\n }\n\n protected async handleUpdate(): Promise<any> {\n if (!this.entityId)\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot PATCH resource without id field\");\n\n const entity = this.parseEntity();\n\n if (Object.keys(entity).length === 0) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"No fields to update\");\n }\n\n // id change is forbidden\n if (\"id\" in entity) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot modify the id field\");\n }\n\n entity.id = this.entityId;\n return this.service.update(entity, this.profileId);\n }\n\n protected async handleDelete(): Promise<boolean> {\n if (!this.entityId)\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot delete resource without id field\");\n\n return this.service.remove(this.entityId, this.profileId);\n }\n\n protected async handleFetch(): Promise<any> {\n if (!this.entityId)\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot fetch resource without id field\");\n\n const result = await this.service.findById(this.entityId, this.profileId);\n\n if (result) return result;\n\n throw new ErrorHttp({ code: 404, error: \"NotFound\" }, `Resource with ID ${this.entityId} not found`);\n }\n\n protected async handleReplace() {\n if (!this.entityId) throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot PUT resource without id field\");\n\n const entity = this.parseEntity();\n\n if (!Object.keys(entity).length) {\n throw new ErrorHttp({ code: 400, error: \"Bad Request\" }, \"No entity provided for PUT update\");\n }\n\n if (!this.entityId) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot PUT resource without id field\");\n }\n\n entity.id = this.entityId;\n\n return this.service.update(entity, this.profileId);\n }\n\n protected async handlePostCreate() {\n const entity = this.parseEntity();\n if (!Object.keys(entity).length) {\n throw new ErrorHttp({ code: 400, error: \"Bad Request\" }, \"No entity payload provided\");\n }\n\n if (!this.isAdmin) entity.profileId = this.profileId;\n else if (!entity.proflileId) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"No profileId provided\");\n }\n\n return await this.service.save(entity, this.profileId);\n }\n\n protected abstract processCrudRequest(event: APIGatewayProxyEvent): Promise<any>;\n\n /**\n * service дээр processChanges methode ажилсны дараа хийгдэх үйлдлүүд байна\n * @param event - DynamoDBStreamEvent\n * @returns Promise<void>\n * */\n protected abstract processStreamEvent(event: DynamoDBStreamEvent): Promise<void>;\n\n protected abstract processScheduledEvent(event: ScheduledEvent): Promise<void>;\n\n protected abstract processWebSocketEvent(event: APIGatewayProxyWebsocketEventV2): Promise<void>;\n\n protected processTriggerEvent?(\n event:\n | CreateAuthChallengeTriggerEvent\n | DefineAuthChallengeTriggerEvent\n | VerifyAuthChallengeResponseTriggerEvent\n | PostConfirmationTriggerEvent\n | PreSignUpTriggerEvent,\n ): Promise<void> {\n throw new Error(`Method not implemented. event: ${JSON.stringify(event, null, 2)}`);\n }\n\n protected abstract processSQSEvent(sqsEvent: SQSEvent): Promise<any>;\n\n protected isListRequest(): boolean {\n const basePath = trimSpecialChar(this.config.BASE_PATH);\n\n const allowedPaths = [basePath, `${basePath}/search`, `${basePath}/scan`];\n\n const isMethodGet = this.methode === \"GET\";\n const isAllowedPath = allowedPaths.includes(trimSpecialChar(this.path));\n\n return isMethodGet && isAllowedPath;\n }\n\n protected isUpdateRequest(): boolean {\n const expectedPath = `${trimSpecialChar(this.config.BASE_PATH)}/{id}`;\n const isMethodPatch = this.methode === \"PATCH\";\n const isExpectedPath = trimSpecialChar(this.path) === expectedPath;\n\n return isMethodPatch && isExpectedPath;\n }\n\n protected isDeleteRequest(): boolean {\n const expectedPath = `${trimSpecialChar(this.config.BASE_PATH)}/{id}`;\n const isMethodDelete = this.methode === \"DELETE\";\n const isExpectedPath = trimSpecialChar(this.path) === expectedPath;\n\n return isMethodDelete && isExpectedPath;\n }\n\n protected isFetchRequest(): boolean {\n const expectedPath = `${trimSpecialChar(this.config.BASE_PATH)}/{id}`;\n const isMethodGet = this.methode === \"GET\";\n const isExpectedPath = trimSpecialChar(this.path) === expectedPath;\n\n return isMethodGet && isExpectedPath;\n }\n\n private async handleCrudByMethod(event: APIGatewayProxyEvent): Promise<any> {\n if (this.isUpdateRequest()) return this.handleUpdate();\n if (this.isDeleteRequest()) return this.handleDelete();\n if (this.isFetchRequest()) return this.handleFetch();\n if (this.methode === \"PUT\") return this.handleReplace();\n if (this.methode === \"POST\") return this.handlePostCreate();\n if (this.isListRequest()) return this.handleList();\n return this.processCrudRequest(event); // Custom Endpoints\n }\n\n private filterResponse(response: any, responsePolicy: ResponseFields): any {\n if (Array.isArray(response)) {\n return removeFields(response, responsePolicy.include, responsePolicy.exclude);\n }\n\n if (response?.items && Array.isArray(response.items)) {\n response.items = removeFields(response.items, responsePolicy.include, responsePolicy.exclude);\n return response;\n }\n\n return removeFields([response], responsePolicy.include, responsePolicy.exclude)[0];\n }\n\n /**\n * Map RequestType to Access for permission checking\n */\n private getUserAccessLevel(): Access {\n switch (this.requestType) {\n case RequestType.ADMIN:\n return Access.ADMIN;\n case RequestType.USER:\n return Access.USER;\n case RequestType.GUEST:\n return Access.PUBLIC;\n case RequestType.SYSTEM:\n return Access.SYSTEM;\n default:\n return Access.PUBLIC;\n }\n }\n\n /** Check if the user has permission for the current operation */\n private checkPermission(allowedAccess: Access[]) {\n const currentAccessLevel = this.getUserAccessLevel();\n\n // This means USER can access OWNER-level permissions, but the service will verify actual ownership\n const hasPermission =\n allowedAccess.includes(currentAccessLevel) ||\n (this.requestType === RequestType.USER && allowedAccess.includes(Access.OWNER));\n\n if (hasPermission) return;\n\n throw new ErrorHttp(\n { code: 403, error: \"PermissionDenied\" },\n `Access denied. Required: ${allowedAccess.join(\", \")}, Current: ${currentAccessLevel}`,\n );\n }\n\n private setUserFilter() {\n if (this.isAdmin && !this.profileId) return;\n const ownerIdFieldName = this.config.OWNER_ID_FIELD_NAME || \"ownerId\";\n this.request.filterAndSort[ownerIdFieldName] = this.profileId;\n }\n\n private bootstrapRequest(event: APIGatewayProxyEvent) {\n const claims = (this.groups = event.requestContext?.authorizer?.claims);\n\n this.groups = claims?.[\"cognito:groups\"] || [];\n this.username = claims?.[\"cognito:username\"] || \"\";\n this.userId = claims?.sub ?? \"\";\n this.profileId = claims?.[\"custom:profileId\"] || this.userId;\n\n this.isAdmin = JSON.stringify(this.groups).toLowerCase().includes(this.adminGroupName.toLowerCase());\n if (this.isAdmin) {\n delete this.profileId;\n this.requestType = RequestType.ADMIN;\n } else if (this.profileId || this.userId) this.requestType = RequestType.USER;\n else this.requestType = RequestType.GUEST;\n\n // log.info(`claims:${JSON.stringify(claims, null, 2)}`);\n // log.info(\n // `groups:${this.groups}, isAdmin:${this.isAdmin}, userId:${this.userId}, profileId:${this.profileId}, username:${this.username}, requestType:${this.requestType}`,\n // );\n\n this.path = event?.requestContext?.resourcePath;\n this.methode = event.httpMethod as HttpMethod;\n this.resourcePath = `${this.methode} ${this.path}`;\n this.request = parseHttpRequest(event);\n this.requestBody = this.request.body;\n this.event = event;\n this.resource = event.resource || \"\";\n this.entityId = event.pathParameters?.id || \"\";\n\n //DEV\n // const host = this.request.headers[\"Host\"] || \"\";\n // const isLocalhost = host.includes(\"localhost\");\n //\n // const profileId = this.request.headers[\"profileId\"];\n //\n // if (profileId && isLocalhost) this.profileId = profileId;\n // else if (isLocalhost) {\n // this.isAdmin = true;\n // this.requestType = RequestType.ADMIN;\n // }\n\n // if (process.env.SERVERLESS_STAGE === \"dev\") {\n // log.debug(\"profileId:\" + profileId);\n // log.debug(`isLocalhost: ${isLocalhost}`);\n // log.debug(`isAdmin: ${this.isAdmin}`);\n // }\n }\n\n private parseEntity(): Record<string, unknown> {\n if (!this.requestBody) return {};\n return typeof this.requestBody === \"string\" ? JSON.parse(this.requestBody) : this.requestBody;\n }\n\n private validateRequest(schema: any) {\n if (!schema) return;\n\n try {\n validateWithSchema(schema, this.requestBody);\n } catch (error) {\n const formattedErrors = formatErrors(error);\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, formattedErrors);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base-controller.js","sourceRoot":"","sources":["../../src/controller/base-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Access,\n APIResponse,\n BaseService,\n createApiResponse,\n EndpointPolicy,\n findMatchedPolicy,\n formatErrors,\n getTableName,\n HttpMethod,\n HttpRequest,\n parseEventToAction,\n parseHttpRequest,\n parseImage,\n removeFields,\n RequestType,\n ResponseFields,\n validateWithSchema,\n} from \"../index\";\nimport {\n APIGatewayProxyEvent,\n APIGatewayProxyWebsocketEventV2,\n CreateAuthChallengeTriggerEvent,\n DefineAuthChallengeTriggerEvent,\n DynamoDBStreamEvent,\n PostConfirmationTriggerEvent,\n PreSignUpTriggerEvent,\n ScheduledEvent,\n SQSEvent,\n VerifyAuthChallengeResponseTriggerEvent,\n} from \"aws-lambda\";\nimport { errorHandlerHttp } from \"../exception/exception-handler\";\nimport { ErrorHttp } from \"../exception/errors\";\nimport { EntityConfig } from \"../model/base.config\";\nimport { trimSpecialChar } from \"../utils/string.util\";\n\nexport abstract class BaseController<T extends BaseService<any, any>> {\n protected resourcePath: string;\n protected userId: string;\n protected isAdmin: boolean;\n protected request: HttpRequest;\n protected readonly service: T;\n protected adminGroupNames: string[];\n protected requestBody: any;\n protected triggerEvent: any;\n protected eventAttr: any;\n protected event: APIGatewayProxyEvent;\n protected resource: string;\n protected entityId: string;\n protected methode: HttpMethod;\n protected groups: string[] = [];\n protected username: string;\n private profileId: string;\n private requestType: RequestType;\n private config: EntityConfig;\n private path: string;\n\n protected constructor(baseService: T, config: EntityConfig) {\n this.service = baseService;\n\n // Store config for use in subclasses\n if (!config) return;\n\n this.config = config;\n // Set adminGroupName from config if available\n if (config.ADMIN_GROUP_NAME) {\n this.adminGroupNames = config.ADMIN_GROUP_NAME;\n }\n\n this.service.setConfig(config);\n }\n\n async resolveCrudRequest(event: APIGatewayProxyEvent): Promise<APIResponse> {\n try {\n this.bootstrapRequest(event);\n\n const policy: EndpointPolicy | undefined = findMatchedPolicy(\n this.methode,\n this.path,\n this.config.ENDPOINT_POLICY,\n );\n\n this.checkPermission(policy?.access);\n this.validateRequest(policy?.validator);\n this.setUserFilter();\n\n const response: any = await this.handleCrudByMethod(event);\n\n if (!policy?.response) {\n return createApiResponse(200, response);\n }\n\n const filteredResponse = this.filterResponse(response, policy.response);\n\n return createApiResponse(200, filteredResponse);\n } catch (err) {\n const error = errorHandlerHttp(err);\n return createApiResponse(error.statusCode, error.content);\n }\n }\n\n async resolveSQSEvent(sqsEvent: SQSEvent): Promise<void> {\n try {\n await this.processSQSEvent(sqsEvent);\n } catch (error) {\n console.error(\"Error handling SQS event:\", error);\n }\n }\n\n async resolveStreamEvent(event: DynamoDBStreamEvent): Promise<void> {\n try {\n for (const record of event.Records) {\n const oldItem = parseImage(record.dynamodb.OldImage) as T;\n const newItem = parseImage(record.dynamodb.NewImage) as T;\n\n await this.service.processChanges(\n oldItem,\n newItem,\n parseEventToAction(record.eventName),\n getTableName(record.eventSourceARN),\n );\n }\n await this.processStreamEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n async resolveScheduledEvent(event: ScheduledEvent): Promise<void> {\n try {\n await this.processScheduledEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n async resolveWebSocketEvent(event: APIGatewayProxyWebsocketEventV2): Promise<void> {\n try {\n return await this.processWebSocketEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n async resolveTriggerEvent(\n event:\n | CreateAuthChallengeTriggerEvent\n | DefineAuthChallengeTriggerEvent\n | VerifyAuthChallengeResponseTriggerEvent\n | PostConfirmationTriggerEvent\n | PreSignUpTriggerEvent,\n ): Promise<void> {\n try {\n this.triggerEvent = event;\n this.eventAttr = this.triggerEvent.userAttributes;\n return await this.processTriggerEvent(event);\n } catch (error) {\n console.error(\"Error handling request event:\", error);\n }\n }\n\n setConfig(config: EntityConfig): void {\n this.config = config;\n }\n\n protected async handleList(): Promise<any> {\n if (this.methode === \"GET\" && trimSpecialChar(this.path) === trimSpecialChar(this.config.BASE_PATH)) {\n return await this.service.find(this.request.filterAndSort || {});\n }\n\n if (this.methode === \"GET\" && trimSpecialChar(this.path) === trimSpecialChar(this.config.BASE_PATH) + \"/search\") {\n return await this.service.search(this.request.filterAndSort || {});\n }\n\n if (this.methode === \"GET\" && trimSpecialChar(this.path) === trimSpecialChar(this.config.BASE_PATH) + \"/scan\") {\n return await this.service.scan(this.request.filterAndSort || {});\n }\n }\n\n protected async handleUpdate(): Promise<any> {\n if (!this.entityId)\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot PATCH resource without id field\");\n\n const entity = this.parseEntity();\n\n if (Object.keys(entity).length === 0) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"No fields to update\");\n }\n\n // id change is forbidden\n if (\"id\" in entity) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot modify the id field\");\n }\n\n entity.id = this.entityId;\n return this.service.update(entity, this.profileId);\n }\n\n protected async handleDelete(): Promise<boolean> {\n if (!this.entityId)\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot delete resource without id field\");\n\n return this.service.remove(this.entityId, this.profileId);\n }\n\n protected async handleFetch(): Promise<any> {\n if (!this.entityId)\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot fetch resource without id field\");\n\n const result = await this.service.findById(this.entityId, this.profileId);\n\n if (result) return result;\n\n throw new ErrorHttp({ code: 404, error: \"NotFound\" }, `Resource with ID ${this.entityId} not found`);\n }\n\n protected async handleReplace() {\n if (!this.entityId) throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot PUT resource without id field\");\n\n const entity = this.parseEntity();\n\n if (!Object.keys(entity).length) {\n throw new ErrorHttp({ code: 400, error: \"Bad Request\" }, \"No entity provided for PUT update\");\n }\n\n if (!this.entityId) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Cannot PUT resource without id field\");\n }\n\n entity.id = this.entityId;\n\n return this.service.update(entity, this.profileId);\n }\n\n protected async handlePostCreate() {\n const entity = this.parseEntity();\n if (!Object.keys(entity).length) {\n throw new ErrorHttp({ code: 400, error: \"Bad Request\" }, \"No entity payload provided\");\n }\n\n if (!this.isAdmin) entity.profileId = this.profileId;\n else if (!entity.proflileId) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"No profileId provided\");\n }\n\n return await this.service.save(entity, this.profileId);\n }\n\n protected abstract processCrudRequest(event: APIGatewayProxyEvent): Promise<any>;\n\n /**\n * service дээр processChanges methode ажилсны дараа хийгдэх үйлдлүүд байна\n * @param event - DynamoDBStreamEvent\n * @returns Promise<void>\n * */\n protected abstract processStreamEvent(event: DynamoDBStreamEvent): Promise<void>;\n\n protected abstract processScheduledEvent(event: ScheduledEvent): Promise<void>;\n\n protected abstract processWebSocketEvent(event: APIGatewayProxyWebsocketEventV2): Promise<void>;\n\n protected processTriggerEvent?(\n event:\n | CreateAuthChallengeTriggerEvent\n | DefineAuthChallengeTriggerEvent\n | VerifyAuthChallengeResponseTriggerEvent\n | PostConfirmationTriggerEvent\n | PreSignUpTriggerEvent,\n ): Promise<void> {\n throw new Error(`Method not implemented. event: ${JSON.stringify(event, null, 2)}`);\n }\n\n protected abstract processSQSEvent(sqsEvent: SQSEvent): Promise<any>;\n\n protected isListRequest(): boolean {\n const basePath = trimSpecialChar(this.config.BASE_PATH);\n\n const allowedPaths = [basePath, `${basePath}/search`, `${basePath}/scan`];\n\n const isMethodGet = this.methode === \"GET\";\n const isAllowedPath = allowedPaths.includes(trimSpecialChar(this.path));\n\n return isMethodGet && isAllowedPath;\n }\n\n protected isUpdateRequest(): boolean {\n const expectedPath = `${trimSpecialChar(this.config.BASE_PATH)}/{id}`;\n const isMethodPatch = this.methode === \"PATCH\";\n const isExpectedPath = trimSpecialChar(this.path) === expectedPath;\n\n return isMethodPatch && isExpectedPath;\n }\n\n protected isDeleteRequest(): boolean {\n const expectedPath = `${trimSpecialChar(this.config.BASE_PATH)}/{id}`;\n const isMethodDelete = this.methode === \"DELETE\";\n const isExpectedPath = trimSpecialChar(this.path) === expectedPath;\n\n return isMethodDelete && isExpectedPath;\n }\n\n protected isFetchRequest(): boolean {\n const expectedPath = `${trimSpecialChar(this.config.BASE_PATH)}/{id}`;\n const isMethodGet = this.methode === \"GET\";\n const isExpectedPath = trimSpecialChar(this.path) === expectedPath;\n\n return isMethodGet && isExpectedPath;\n }\n\n private async handleCrudByMethod(event: APIGatewayProxyEvent): Promise<any> {\n if (this.isUpdateRequest()) return this.handleUpdate();\n if (this.isDeleteRequest()) return this.handleDelete();\n if (this.isFetchRequest()) return this.handleFetch();\n if (this.methode === \"PUT\") return this.handleReplace();\n if (this.methode === \"POST\") return this.handlePostCreate();\n if (this.isListRequest()) return this.handleList();\n return this.processCrudRequest(event); // Custom Endpoints\n }\n\n private filterResponse(response: any, responsePolicy: ResponseFields): any {\n if (Array.isArray(response)) {\n return removeFields(response, responsePolicy.include, responsePolicy.exclude);\n }\n\n if (response?.items && Array.isArray(response.items)) {\n response.items = removeFields(response.items, responsePolicy.include, responsePolicy.exclude);\n return response;\n }\n\n return removeFields([response], responsePolicy.include, responsePolicy.exclude)[0];\n }\n\n /**\n * Map RequestType to Access for permission checking\n */\n private getUserAccessLevel(): Access {\n switch (this.requestType) {\n case RequestType.ADMIN:\n return Access.ADMIN;\n case RequestType.USER:\n return Access.USER;\n case RequestType.GUEST:\n return Access.PUBLIC;\n case RequestType.SYSTEM:\n return Access.SYSTEM;\n default:\n return Access.PUBLIC;\n }\n }\n\n /** Check if the user has permission for the current operation */\n private checkPermission(allowedAccess: Access[]) {\n const currentAccessLevel = this.getUserAccessLevel();\n\n // This means USER can access OWNER-level permissions, but the service will verify actual ownership\n const hasPermission =\n allowedAccess.includes(currentAccessLevel) ||\n (this.requestType === RequestType.USER && allowedAccess.includes(Access.OWNER));\n\n if (hasPermission) return;\n\n throw new ErrorHttp(\n { code: 403, error: \"PermissionDenied\" },\n `Access denied. Required: ${allowedAccess.join(\", \")}, Current: ${currentAccessLevel}`,\n );\n }\n\n private setUserFilter() {\n if (this.isAdmin && !this.profileId) return;\n const ownerIdFieldName = this.config.OWNER_ID_FIELD_NAME || \"ownerId\";\n this.request.filterAndSort[ownerIdFieldName] = this.profileId;\n }\n\n private bootstrapRequest(event: APIGatewayProxyEvent) {\n const claims = event.requestContext?.authorizer?.claims;\n\n this.groups = claims?.[\"cognito:groups\"] || [];\n this.username = claims?.[\"cognito:username\"] || \"\";\n this.userId = claims?.sub ?? \"\";\n this.profileId = claims?.[\"custom:profileId\"] || this.userId;\n\n this.isAdmin = this.groups?.some((userGroup) =>\n this.adminGroupNames.some((adminGroup) => userGroup.toLowerCase() === adminGroup.toLowerCase()),\n );\n\n for (const group of this.groups) {\n if (this.username.toLowerCase().includes(group.toLowerCase())) {\n this.isAdmin = true;\n break;\n }\n }\n\n if (this.isAdmin) {\n delete this.profileId;\n this.requestType = RequestType.ADMIN;\n } else if (this.profileId || this.userId) this.requestType = RequestType.USER;\n else this.requestType = RequestType.GUEST;\n\n // log.info(`claims:${JSON.stringify(claims, null, 2)}`);\n // log.info(\n // `groups:${this.groups}, isAdmin:${this.isAdmin}, userId:${this.userId}, profileId:${this.profileId}, username:${this.username}, requestType:${this.requestType}`,\n // );\n\n this.path = event?.requestContext?.resourcePath;\n this.methode = event.httpMethod as HttpMethod;\n this.resourcePath = `${this.methode} ${this.path}`;\n this.request = parseHttpRequest(event);\n this.requestBody = this.request.body;\n this.event = event;\n this.resource = event.resource || \"\";\n this.entityId = event.pathParameters?.id || \"\";\n\n //DEV\n // const host = this.request.headers[\"Host\"] || \"\";\n // const isLocalhost = host.includes(\"localhost\");\n //\n // const profileId = this.request.headers[\"profileId\"];\n //\n // if (profileId && isLocalhost) this.profileId = profileId;\n // else if (isLocalhost) {\n // this.isAdmin = true;\n // this.requestType = RequestType.ADMIN;\n // }\n\n // if (process.env.SERVERLESS_STAGE === \"dev\") {\n // log.debug(\"profileId:\" + profileId);\n // log.debug(`isLocalhost: ${isLocalhost}`);\n // log.debug(`isAdmin: ${this.isAdmin}`);\n // }\n }\n\n private parseEntity(): Record<string, unknown> {\n if (!this.requestBody) return {};\n return typeof this.requestBody === \"string\" ? JSON.parse(this.requestBody) : this.requestBody;\n }\n\n private validateRequest(schema: any) {\n if (!schema) return;\n\n try {\n validateWithSchema(schema, this.requestBody);\n } catch (error) {\n const formattedErrors = formatErrors(error);\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, formattedErrors);\n }\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,17 +4,4 @@ export * from "./utils";
|
|
|
4
4
|
export * from "./controller";
|
|
5
5
|
export * from "./provider";
|
|
6
6
|
export * from "./model";
|
|
7
|
-
|
|
8
|
-
private isProd;
|
|
9
|
-
info(message: any, ...args: unknown[]): void;
|
|
10
|
-
warn(message: any, ...args: unknown[]): void;
|
|
11
|
-
error(message: any, ...args: unknown[]): void;
|
|
12
|
-
debug(message: any, ...args: unknown[]): void;
|
|
13
|
-
group(label: string): void;
|
|
14
|
-
groupEnd(): void;
|
|
15
|
-
private formatArgs;
|
|
16
|
-
}
|
|
17
|
-
declare global {
|
|
18
|
-
var log: Logger;
|
|
19
|
-
}
|
|
20
|
-
export {};
|
|
7
|
+
export * from "./exception";
|
package/dist/index.js
CHANGED
|
@@ -20,36 +20,5 @@ __exportStar(require("./utils"), exports);
|
|
|
20
20
|
__exportStar(require("./controller"), exports);
|
|
21
21
|
__exportStar(require("./provider"), exports);
|
|
22
22
|
__exportStar(require("./model"), exports);
|
|
23
|
-
|
|
24
|
-
class Logger {
|
|
25
|
-
constructor() {
|
|
26
|
-
var _a;
|
|
27
|
-
this.isProd = (_a = process.env.NODE_ENV) === null || _a === void 0 ? void 0 : _a.toUpperCase().includes("PROD");
|
|
28
|
-
}
|
|
29
|
-
info(message, ...args) {
|
|
30
|
-
console.info(`[INFO] ${message}`, ...this.formatArgs(args));
|
|
31
|
-
}
|
|
32
|
-
warn(message, ...args) {
|
|
33
|
-
console.warn(`[WARN] ${message}`, ...this.formatArgs(args));
|
|
34
|
-
}
|
|
35
|
-
error(message, ...args) {
|
|
36
|
-
console.error(`[ERROR] ${message}`, ...this.formatArgs(args));
|
|
37
|
-
}
|
|
38
|
-
debug(message, ...args) {
|
|
39
|
-
if (this.isProd)
|
|
40
|
-
return;
|
|
41
|
-
const msg = typeof message === "string" ? message : JSON.stringify(message, null, 2);
|
|
42
|
-
console.debug(msg, ...this.formatArgs(args));
|
|
43
|
-
}
|
|
44
|
-
group(label) {
|
|
45
|
-
console.group(`[GROUP] ${label}`);
|
|
46
|
-
}
|
|
47
|
-
groupEnd() {
|
|
48
|
-
console.groupEnd();
|
|
49
|
-
}
|
|
50
|
-
formatArgs(args) {
|
|
51
|
-
return args.map((arg) => (typeof arg === "object" ? JSON.stringify(arg, null, 2) : arg));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
globalThis.log = new Logger();
|
|
23
|
+
__exportStar(require("./exception"), exports);
|
|
55
24
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,4CAA0B;AAC1B,0CAAwB;AACxB,+CAA6B;AAC7B,6CAA2B;AAC3B,0CAAwB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,4CAA0B;AAC1B,0CAAwB;AACxB,+CAA6B;AAC7B,6CAA2B;AAC3B,0CAAwB;AACxB,8CAA4B","sourcesContent":["export * from \"./repositories\";\nexport * from \"./service\";\nexport * from \"./utils\";\nexport * from \"./controller\";\nexport * from \"./provider\";\nexport * from \"./model\";\nexport * from \"./exception\";\n"]}
|
|
@@ -18,7 +18,7 @@ export interface EntityConfig {
|
|
|
18
18
|
DYNAMO_DB: DynamoDBConfig;
|
|
19
19
|
OPEN_SEARCH: OpenSearchConfig;
|
|
20
20
|
ENDPOINT_POLICY: EndpointPolicy[];
|
|
21
|
-
ADMIN_GROUP_NAME: string;
|
|
21
|
+
ADMIN_GROUP_NAME: string[];
|
|
22
22
|
OWNER_ID_FIELD_NAME?: string;
|
|
23
23
|
}
|
|
24
24
|
/** Generic Entity Configuration Class **/
|
|
@@ -27,9 +27,9 @@ export declare class EntityConfigImpl implements EntityConfig {
|
|
|
27
27
|
DYNAMO_DB: DynamoDBConfig;
|
|
28
28
|
OPEN_SEARCH: OpenSearchConfig;
|
|
29
29
|
ENDPOINT_POLICY: EndpointPolicy[];
|
|
30
|
-
ADMIN_GROUP_NAME: string;
|
|
30
|
+
ADMIN_GROUP_NAME: string[];
|
|
31
31
|
OWNER_ID_FIELD_NAME: string;
|
|
32
|
-
constructor(basePath: string, adminGroupName?: string);
|
|
32
|
+
constructor(basePath: string, adminGroupName?: string[]);
|
|
33
33
|
/** Set DynamoDB configuration */
|
|
34
34
|
setDynamoDB(tableName: string, ownerFieldName: string, indexMap: DynamoIndexMap): this;
|
|
35
35
|
/** Set OpenSearch configuration */
|
|
@@ -22,7 +22,7 @@ exports.OpenSearchConfig = OpenSearchConfig;
|
|
|
22
22
|
class EntityConfigImpl {
|
|
23
23
|
constructor(basePath, adminGroupName) {
|
|
24
24
|
this.BASE_PATH = basePath;
|
|
25
|
-
this.ADMIN_GROUP_NAME =
|
|
25
|
+
this.ADMIN_GROUP_NAME = adminGroupName || ["admin"];
|
|
26
26
|
this.ENDPOINT_POLICY = [];
|
|
27
27
|
}
|
|
28
28
|
/** Set DynamoDB configuration */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.config.js","sourceRoot":"","sources":["../../src/model/base.config.ts"],"names":[],"mappings":";;;AAEA,qCAAqC;AACrC,MAAa,cAAc;IAKzB,YAAY,SAAiB,EAAE,cAAsB,EAAE,QAAwB;QAC7E,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;QACvC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;IACtB,CAAC;CACF;AAVD,wCAUC;AAED,uCAAuC;AACvC,MAAa,gBAAgB;IAI3B,YAAY,MAAc,EAAE,SAAiB;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;CACF;AARD,4CAQC;AAYD,0CAA0C;AAC1C,MAAa,gBAAgB;IAS3B,YAAY,QAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"base.config.js","sourceRoot":"","sources":["../../src/model/base.config.ts"],"names":[],"mappings":";;;AAEA,qCAAqC;AACrC,MAAa,cAAc;IAKzB,YAAY,SAAiB,EAAE,cAAsB,EAAE,QAAwB;QAC7E,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;QACvC,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;IACtB,CAAC;CACF;AAVD,wCAUC;AAED,uCAAuC;AACvC,MAAa,gBAAgB;IAI3B,YAAY,MAAc,EAAE,SAAiB;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;CACF;AARD,4CAQC;AAYD,0CAA0C;AAC1C,MAAa,gBAAgB;IAS3B,YAAY,QAAgB,EAAE,cAAyB;QACrD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,cAAc,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,iCAAiC;IACjC,WAAW,CAAC,SAAiB,EAAE,cAAsB,EAAE,QAAwB;QAC7E,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,aAAa,CAAC,MAAc,EAAE,KAAa;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,WAAW,CAAC,QAA0B;QACpC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,QAAQ;QACN,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAC;IACJ,CAAC;CACF;AA5CD,4CA4CC","sourcesContent":["import { DynamoIndexMap, EndpointPolicy } from \"@chinggis/core\";\n\n/** Generic DynamoDB Configuration */\nexport class DynamoDBConfig {\n NAME: string; // DynamoDB table name\n OWNER_FIELD_NAME: string; // DynamoDB index map for queries\n MAP: DynamoIndexMap;\n\n constructor(tableName: string, ownerFieldName: string, indexMap: DynamoIndexMap) {\n this.NAME = tableName;\n this.OWNER_FIELD_NAME = ownerFieldName;\n this.MAP = indexMap;\n }\n}\n\n/** Generic OpenSearch Configuration */\nexport class OpenSearchConfig {\n DOMAIN: string;\n INDEX: string;\n\n constructor(domain: string, indexName: string) {\n this.DOMAIN = domain;\n this.INDEX = indexName;\n }\n}\n\n/** Configuration interface for type safety */\nexport interface EntityConfig {\n BASE_PATH: string;\n DYNAMO_DB: DynamoDBConfig;\n OPEN_SEARCH: OpenSearchConfig;\n ENDPOINT_POLICY: EndpointPolicy[];\n ADMIN_GROUP_NAME: string[];\n OWNER_ID_FIELD_NAME?: string;\n}\n\n/** Generic Entity Configuration Class **/\nexport class EntityConfigImpl implements EntityConfig {\n BASE_PATH: string; //Entity name for logging and debugging\n DYNAMO_DB: DynamoDBConfig; // DynamoDB configuration\n OPEN_SEARCH: OpenSearchConfig; // OpenSearch configuration\n ENDPOINT_POLICY: EndpointPolicy[]; // Path-based permission configuration\n ADMIN_GROUP_NAME: string[]; // Admin group name for Cognito\n\n OWNER_ID_FIELD_NAME: string;\n\n constructor(basePath: string, adminGroupName?: string[]) {\n this.BASE_PATH = basePath;\n this.ADMIN_GROUP_NAME = adminGroupName || [\"admin\"];\n this.ENDPOINT_POLICY = [];\n }\n\n /** Set DynamoDB configuration */\n setDynamoDB(tableName: string, ownerFieldName: string, indexMap: DynamoIndexMap): this {\n this.DYNAMO_DB = new DynamoDBConfig(tableName, ownerFieldName, indexMap);\n return this;\n }\n\n /** Set OpenSearch configuration */\n setOpenSearch(domain: string, index: string): this {\n this.OPEN_SEARCH = new OpenSearchConfig(domain, index);\n return this;\n }\n\n /** Set path-based policies */\n setPolicies(policies: EndpointPolicy[]): this {\n this.ENDPOINT_POLICY = policies;\n return this;\n }\n\n /** Get configuration as a plain object (for BaseController compatibility) */\n toObject(): EntityConfig {\n return {\n BASE_PATH: this.BASE_PATH,\n DYNAMO_DB: this.DYNAMO_DB,\n OPEN_SEARCH: this.OPEN_SEARCH,\n ENDPOINT_POLICY: this.ENDPOINT_POLICY,\n ADMIN_GROUP_NAME: this.ADMIN_GROUP_NAME,\n OWNER_ID_FIELD_NAME: this.OWNER_ID_FIELD_NAME,\n };\n }\n}\n"]}
|
|
@@ -97,7 +97,7 @@ class BaseServiceImpl extends socket_service_1.BaseSocketServiceIml {
|
|
|
97
97
|
}
|
|
98
98
|
updateAll(entities, fields, requestUserId, isTransactional) {
|
|
99
99
|
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
log.warn("cannot check ownership by updateAll");
|
|
100
|
+
log.warn("this methode is under development, cannot check ownership by updateAll");
|
|
101
101
|
return yield this.repoDB.updateMany(entities, fields, isTransactional);
|
|
102
102
|
});
|
|
103
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../src/service/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionDynamoDB,\n addDates,\n addDatesAndId,\n BaseEntity,\n BaseRepoDB,\n BaseRepoDBImpl,\n BaseRepoES,\n BaseRepoESImpl,\n BaseService,\n DynamoIndexMap,\n Filter,\n List,\n parseIndexFilter,\n} from \"../index\";\nimport { BaseSocketServiceIml } from \"./socket.service\";\nimport { ErrorBase, ErrorDynamoDB, ErrorHttp, ErrorValidation } from \"../exception/errors\";\n\nimport { EntityConfig } from \"../model/base.config\";\n\nexport abstract class BaseServiceImpl<T extends BaseEntity, D extends BaseRepoDB<T>, S extends BaseRepoES<T>, R = any>\n extends BaseSocketServiceIml<R>\n implements BaseService<T, R>\n{\n protected repoDB: D;\n protected repoES: S;\n protected config: EntityConfig;\n\n protected constructor(repoDB: D, repoES: S) {\n super();\n if (repoDB != null && !(repoDB instanceof BaseRepoDBImpl))\n console.error(\"repoDB is not an instance of BaseRepoDBImpl\");\n\n if (repoES != null && !(repoES instanceof BaseRepoESImpl))\n console.error(\"repoES is not an instance of BaseRepoESImpl\");\n\n if (repoDB == null && repoES == null) console.error(\"repo initialization is required\");\n\n this.repoDB = repoDB;\n this.repoES = repoES;\n }\n\n getTableName(): string {\n return this.repoDB.getTableName();\n }\n\n abstract processChanges(itemOld: T, itemNew: T, action: ActionDynamoDB, tableName: string): Promise<any>;\n\n async findQuery(queryParams: string): Promise<List<Partial<T>>> {\n const filter = parseIndexFilter(queryParams, this.getIndexMapDB());\n this.checkIsIndexedField(filter);\n return await this.find(filter);\n }\n\n async searchQuery(queryParams: string): Promise<Partial<T>[]> {\n const filter = parseIndexFilter(queryParams);\n this.checkIsIndexedField(filter);\n return await this.search(filter);\n }\n\n async incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return await this.repoDB.incrementValueByField(entityId, fieldName, value);\n }\n\n async decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return await this.repoDB.decrementValueByField(entityId, fieldName, value);\n }\n\n async search(filter: Filter): Promise<T[]> {\n return (await this.repoES.find(filter)).items as T[];\n }\n\n async searchFieldNotExist(fieldName: string, from: number, size: number): Promise<Partial<T>[]> {\n return await this.repoES.fieldNotExists(fieldName, from, size);\n }\n\n async save(entity: Partial<T>, ownerId: string, createdByUserId?: string): Promise<T> {\n addDatesAndId(entity);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n entity.createdBy = createdByUserId || ownerId;\n\n return await this.repoDB.save(entity);\n }\n\n async saveAll(\n entities: Partial<T>[],\n ownerId: string,\n createdByUserId?: string,\n isTransactional?: boolean,\n ): Promise<Partial<T>[]> {\n const entitiesUpdated = [];\n\n for (const item of entities) {\n const entity = addDatesAndId(item);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n entity.createdBy = createdByUserId || ownerId;\n\n entitiesUpdated.push(entity);\n }\n\n return await this.repoDB.saveMany(entitiesUpdated, isTransactional);\n }\n\n async update(entity: T, requestUserId?: string): Promise<T> {\n if (requestUserId) {\n const item = await this.repoDB.findById(entity.id);\n if (item[this.config.OWNER_ID_FIELD_NAME] !== requestUserId)\n throw new ErrorHttp({ code: 403, error: \"PermissionDenied\" }, `No permission to resource: ${entity.id}`);\n entity.updatedBy = requestUserId;\n }\n entity = addDates(entity) as T;\n\n // if (!hasPermission(entity, userId, Permission.UPDATE)) throw new Error(\"Unauthorized access\");\n return await this.repoDB.update(entity);\n }\n\n async updateAll(\n entities: Partial<T>[],\n fields: string[],\n requestUserId?: string,\n isTransactional?: boolean,\n ): Promise<boolean> {\n log.warn(\"cannot check ownership by updateAll\");\n\n return await this.repoDB.updateMany(entities, fields, isTransactional);\n }\n\n async remove(entityId: string, ownerId?: string): Promise<boolean> {\n const entity = await this.repoDB.findById(entityId);\n if (!entity) throw new Error(\"Entity not found\");\n\n if (ownerId && entity[this.config.OWNER_ID_FIELD_NAME] !== ownerId) return null;\n\n return await this.repoDB.delete(entityId);\n }\n\n async removeAll(entityIds: string[], ownerId?: string): Promise<boolean> {\n return await this.repoDB.deleteMany(entityIds);\n }\n\n async changeOwner(entityId: string, ownerId: string): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n return this.repoDB.update(entity);\n }\n\n setTable(tableName: string, dynamoIndexMap: DynamoIndexMap): boolean {\n this.repoDB.setTable(tableName);\n this.repoDB.setIndexMap(dynamoIndexMap);\n return true;\n }\n\n setOpensearch(indexName: string, opensearchEndpoint: string): boolean {\n this.repoES.setIndexName(indexName);\n this.repoES.setEndpoint(opensearchEndpoint);\n return true;\n }\n\n getIndexES(): string {\n return this.repoES.getIndexName();\n }\n\n getIndexMapDB(): DynamoIndexMap {\n return this.repoDB.getIndexMap();\n }\n\n async findAll(): Promise<T[]> {\n const result: T[] = [];\n\n const filter = parseIndexFilter(\"size=250\");\n\n do {\n const response = await this.repoDB.find(filter);\n result.push(...(response.items as T[]));\n filter.lastKey = response.lastKey;\n } while (filter.lastKey);\n\n return result;\n }\n\n async findAllMatch(filter: Filter): Promise<T[]> {\n this.checkIsIndexedField(filter);\n return await this.fetchAll(filter);\n }\n\n async findAllByIndex(indexName: string, indexValue: any): Promise<T[]> {\n // Create a filter object for validation\n const filter = { indexName: indexName, indexValue: indexValue };\n this.checkIsIndexedField(filter);\n\n const parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return this.fetchAll(parsedFilter);\n }\n\n async findByField(fieldName: string, fieldValue: any): Promise<List<T>> {\n // Create a filter object for validation\n const filter = { [fieldName]: fieldValue, size: 100 };\n this.checkIsIndexedField(filter);\n const parsedFilter = parseIndexFilter(fieldName + \"=\" + fieldValue + \"&size=100\", this.getIndexMapDB());\n return (await this.find(parsedFilter)) as List<T>;\n }\n\n async findFirst(fieldName: string, fieldValue: string | boolean | number | Date): Promise<T> {\n // Validate that the field name exists in the index map\n const filter = { [fieldName]: fieldValue };\n this.checkIsIndexedField(filter);\n\n const result = await this.findByField(fieldName, fieldValue);\n return result.items.length > 0 ? result.items[0] : null;\n }\n\n async find(filter: Filter): Promise<List<Partial<T>>> {\n // Validate that all field names in the filter exist in the index map\n this.checkIsIndexedField(filter);\n\n const parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return await this.repoDB.find(parsedFilter);\n }\n\n async findById(entityId: string, profileId?: string): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n\n if (profileId && entity[this.config.OWNER_ID_FIELD_NAME] !== profileId) return null;\n\n return entity;\n }\n\n async findByIds(entityIds: string[], profileId?: string): Promise<T[]> {\n if (entityIds.length > 25) throw new ErrorDynamoDB(this.getTableName(), \"findByIds\", \"Too many entities\");\n\n const entities = await this.repoDB.findByIds(entityIds);\n if (!profileId) return entities;\n const ownEntities = [];\n for (const entity of entities) {\n if (entity[this.config.OWNER_ID_FIELD_NAME] !== profileId) continue;\n ownEntities.push(entity);\n }\n return ownEntities;\n }\n\n async scan(filter: Filter): Promise<List<Partial<T>>> {\n this.checkIsIndexedField(filter);\n const parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return await this.repoDB.scan(parsedFilter);\n }\n\n throwErrorHttp(error: { message: string; code: number }, message?: string, errorContent?: any): void {\n throw new ErrorHttp({ code: error.code, error: error.message }, message, errorContent);\n }\n\n throwErrorDatabase(tableName: string, command: any, errorContent?: any): void {\n throw new ErrorDynamoDB(tableName, command, errorContent);\n }\n\n throwErrorValidation(entityName: string, validation: Map<string, any>, errorContent?: any): void {\n throw new ErrorValidation(entityName, validation, errorContent);\n }\n\n throwError(code: number, message: string, errorContent?: any): void {\n throw new ErrorBase(code, message, errorContent);\n }\n\n setConfig(config: EntityConfig) {\n this.config = config;\n\n this.setTable(config.DYNAMO_DB.NAME, config.DYNAMO_DB.MAP);\n\n if (this.repoDB) {\n this.repoDB.setIndexMap(config.DYNAMO_DB.MAP);\n this.repoDB.setTable(config.DYNAMO_DB.NAME);\n }\n\n if (this.repoES) {\n this.repoES.setEndpoint(config.OPEN_SEARCH.DOMAIN);\n this.repoES.setIndexName(config.OPEN_SEARCH.INDEX);\n }\n }\n\n /**\n * Validates that all field names in the filter exist in the index map.\n * Throws a Bad Request error if any field is not found in the available indexes.\n *\n * @param filter - The filter object containing field names to validate\n * @throws ErrorHttp with 400 status if validation fails\n */\n private checkIsIndexedField(filter: Filter): void {\n if (!filter || typeof filter !== \"object\") {\n return; // Skip validation for invalid filters\n }\n\n const indexMap = this.getIndexMapDB();\n if (!indexMap || indexMap.size === 0) {\n throw new ErrorHttp({ code: 400, error: \"Bad Request\" }, \"No indexes configured for this table\");\n }\n\n // Get all valid field names from all indexes\n const validFields = new Set<string>();\n\n // Add a partition key\n if (indexMap.partitionKey) {\n validFields.add(indexMap.partitionKey);\n }\n\n // Add fields from all indexes\n for (const [indexName, indexConfig] of indexMap.entries()) {\n if (indexConfig.field) {\n validFields.add(indexConfig.field);\n }\n if (indexConfig.rFields) {\n indexConfig.rFields.forEach((field) => validFields.add(field));\n }\n if (indexConfig.sortKeyField) {\n validFields.add(indexConfig.sortKeyField);\n }\n }\n\n // Check each field in the filter\n const invalidFields: string[] = [];\n for (const fieldName of Object.keys(filter)) {\n // Skip special filter properties that are not field names\n if (\n [\"indexName\", \"indexValue\", \"size\", \"lastKey\", \"fieldsInclude\", \"fieldsExclude\", \"rangeFilters\"].includes(\n fieldName,\n )\n ) {\n continue;\n }\n\n // Skip range filter fields (ageMin, ageMax, etc.)\n const rangeSuffixes = [\"Min\", \"Max\", \"From\", \"To\", \"Start\", \"End\"];\n const isRangeField = rangeSuffixes.some((suffix) => fieldName.endsWith(suffix));\n if (isRangeField) {\n continue;\n }\n\n if (!validFields.has(fieldName)) {\n invalidFields.push(fieldName);\n }\n }\n\n if (invalidFields.length > 0) {\n const availableFields = Array.from(validFields).sort();\n throw new ErrorHttp(\n { code: 400, error: \"Bad Request\" },\n `Invalid field names in filter: ${invalidFields.join(\", \")}. Available fields: ${availableFields.join(\", \")}`,\n );\n }\n }\n\n private async fetchAll(filter: Filter): Promise<T[]> {\n const result: Partial<T>[] = [];\n do {\n const response = await this.repoDB.find(filter);\n result.push(...response.items);\n filter.lastKey = response.lastKey;\n } while (filter.lastKey);\n\n return result as T[];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../src/service/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionDynamoDB,\n addDates,\n addDatesAndId,\n BaseEntity,\n BaseRepoDB,\n BaseRepoDBImpl,\n BaseRepoES,\n BaseRepoESImpl,\n BaseService,\n DynamoIndexMap,\n Filter,\n List,\n parseIndexFilter,\n} from \"../index\";\nimport { BaseSocketServiceIml } from \"./socket.service\";\nimport { ErrorBase, ErrorDynamoDB, ErrorHttp, ErrorValidation } from \"../exception/errors\";\n\nimport { EntityConfig } from \"../model/base.config\";\n\nexport abstract class BaseServiceImpl<T extends BaseEntity, D extends BaseRepoDB<T>, S extends BaseRepoES<T>, R = any>\n extends BaseSocketServiceIml<R>\n implements BaseService<T, R>\n{\n protected repoDB: D;\n protected repoES: S;\n protected config: EntityConfig;\n\n protected constructor(repoDB: D, repoES: S) {\n super();\n if (repoDB != null && !(repoDB instanceof BaseRepoDBImpl))\n console.error(\"repoDB is not an instance of BaseRepoDBImpl\");\n\n if (repoES != null && !(repoES instanceof BaseRepoESImpl))\n console.error(\"repoES is not an instance of BaseRepoESImpl\");\n\n if (repoDB == null && repoES == null) console.error(\"repo initialization is required\");\n\n this.repoDB = repoDB;\n this.repoES = repoES;\n }\n\n getTableName(): string {\n return this.repoDB.getTableName();\n }\n\n abstract processChanges(itemOld: T, itemNew: T, action: ActionDynamoDB, tableName: string): Promise<any>;\n\n async findQuery(queryParams: string): Promise<List<Partial<T>>> {\n const filter = parseIndexFilter(queryParams, this.getIndexMapDB());\n this.checkIsIndexedField(filter);\n return await this.find(filter);\n }\n\n async searchQuery(queryParams: string): Promise<Partial<T>[]> {\n const filter = parseIndexFilter(queryParams);\n this.checkIsIndexedField(filter);\n return await this.search(filter);\n }\n\n async incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return await this.repoDB.incrementValueByField(entityId, fieldName, value);\n }\n\n async decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return await this.repoDB.decrementValueByField(entityId, fieldName, value);\n }\n\n async search(filter: Filter): Promise<T[]> {\n return (await this.repoES.find(filter)).items as T[];\n }\n\n async searchFieldNotExist(fieldName: string, from: number, size: number): Promise<Partial<T>[]> {\n return await this.repoES.fieldNotExists(fieldName, from, size);\n }\n\n async save(entity: Partial<T>, ownerId: string, createdByUserId?: string): Promise<T> {\n addDatesAndId(entity);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n entity.createdBy = createdByUserId || ownerId;\n\n return await this.repoDB.save(entity);\n }\n\n async saveAll(\n entities: Partial<T>[],\n ownerId: string,\n createdByUserId?: string,\n isTransactional?: boolean,\n ): Promise<Partial<T>[]> {\n const entitiesUpdated = [];\n\n for (const item of entities) {\n const entity = addDatesAndId(item);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n entity.createdBy = createdByUserId || ownerId;\n\n entitiesUpdated.push(entity);\n }\n\n return await this.repoDB.saveMany(entitiesUpdated, isTransactional);\n }\n\n async update(entity: T, requestUserId?: string): Promise<T> {\n if (requestUserId) {\n const item = await this.repoDB.findById(entity.id);\n if (item[this.config.OWNER_ID_FIELD_NAME] !== requestUserId)\n throw new ErrorHttp({ code: 403, error: \"PermissionDenied\" }, `No permission to resource: ${entity.id}`);\n entity.updatedBy = requestUserId;\n }\n entity = addDates(entity) as T;\n\n // if (!hasPermission(entity, userId, Permission.UPDATE)) throw new Error(\"Unauthorized access\");\n return await this.repoDB.update(entity);\n }\n\n async updateAll(\n entities: Partial<T>[],\n fields: string[],\n requestUserId?: string,\n isTransactional?: boolean,\n ): Promise<boolean> {\n log.warn(\"this methode is under development, cannot check ownership by updateAll\");\n\n return await this.repoDB.updateMany(entities, fields, isTransactional);\n }\n\n async remove(entityId: string, ownerId?: string): Promise<boolean> {\n const entity = await this.repoDB.findById(entityId);\n if (!entity) throw new Error(\"Entity not found\");\n\n if (ownerId && entity[this.config.OWNER_ID_FIELD_NAME] !== ownerId) return null;\n\n return await this.repoDB.delete(entityId);\n }\n\n async removeAll(entityIds: string[], ownerId?: string): Promise<boolean> {\n return await this.repoDB.deleteMany(entityIds);\n }\n\n async changeOwner(entityId: string, ownerId: string): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n return this.repoDB.update(entity);\n }\n\n setTable(tableName: string, dynamoIndexMap: DynamoIndexMap): boolean {\n this.repoDB.setTable(tableName);\n this.repoDB.setIndexMap(dynamoIndexMap);\n return true;\n }\n\n setOpensearch(indexName: string, opensearchEndpoint: string): boolean {\n this.repoES.setIndexName(indexName);\n this.repoES.setEndpoint(opensearchEndpoint);\n return true;\n }\n\n getIndexES(): string {\n return this.repoES.getIndexName();\n }\n\n getIndexMapDB(): DynamoIndexMap {\n return this.repoDB.getIndexMap();\n }\n\n async findAll(): Promise<T[]> {\n const result: T[] = [];\n\n const filter = parseIndexFilter(\"size=250\");\n\n do {\n const response = await this.repoDB.find(filter);\n result.push(...(response.items as T[]));\n filter.lastKey = response.lastKey;\n } while (filter.lastKey);\n\n return result;\n }\n\n async findAllMatch(filter: Filter): Promise<T[]> {\n this.checkIsIndexedField(filter);\n return await this.fetchAll(filter);\n }\n\n async findAllByIndex(indexName: string, indexValue: any): Promise<T[]> {\n // Create a filter object for validation\n const filter = { indexName: indexName, indexValue: indexValue };\n this.checkIsIndexedField(filter);\n\n const parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return this.fetchAll(parsedFilter);\n }\n\n async findByField(fieldName: string, fieldValue: any): Promise<List<T>> {\n // Create a filter object for validation\n const filter = { [fieldName]: fieldValue, size: 100 };\n this.checkIsIndexedField(filter);\n const parsedFilter = parseIndexFilter(fieldName + \"=\" + fieldValue + \"&size=100\", this.getIndexMapDB());\n return (await this.find(parsedFilter)) as List<T>;\n }\n\n async findFirst(fieldName: string, fieldValue: string | boolean | number | Date): Promise<T> {\n // Validate that the field name exists in the index map\n const filter = { [fieldName]: fieldValue };\n this.checkIsIndexedField(filter);\n\n const result = await this.findByField(fieldName, fieldValue);\n return result.items.length > 0 ? result.items[0] : null;\n }\n\n async find(filter: Filter): Promise<List<Partial<T>>> {\n // Validate that all field names in the filter exist in the index map\n this.checkIsIndexedField(filter);\n\n const parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return await this.repoDB.find(parsedFilter);\n }\n\n async findById(entityId: string, profileId?: string): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n\n if (profileId && entity[this.config.OWNER_ID_FIELD_NAME] !== profileId) return null;\n\n return entity;\n }\n\n async findByIds(entityIds: string[], profileId?: string): Promise<T[]> {\n if (entityIds.length > 25) throw new ErrorDynamoDB(this.getTableName(), \"findByIds\", \"Too many entities\");\n\n const entities = await this.repoDB.findByIds(entityIds);\n if (!profileId) return entities;\n const ownEntities = [];\n for (const entity of entities) {\n if (entity[this.config.OWNER_ID_FIELD_NAME] !== profileId) continue;\n ownEntities.push(entity);\n }\n return ownEntities;\n }\n\n async scan(filter: Filter): Promise<List<Partial<T>>> {\n this.checkIsIndexedField(filter);\n const parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return await this.repoDB.scan(parsedFilter);\n }\n\n throwErrorHttp(error: { message: string; code: number }, message?: string, errorContent?: any): void {\n throw new ErrorHttp({ code: error.code, error: error.message }, message, errorContent);\n }\n\n throwErrorDatabase(tableName: string, command: any, errorContent?: any): void {\n throw new ErrorDynamoDB(tableName, command, errorContent);\n }\n\n throwErrorValidation(entityName: string, validation: Map<string, any>, errorContent?: any): void {\n throw new ErrorValidation(entityName, validation, errorContent);\n }\n\n throwError(code: number, message: string, errorContent?: any): void {\n throw new ErrorBase(code, message, errorContent);\n }\n\n setConfig(config: EntityConfig) {\n this.config = config;\n\n this.setTable(config.DYNAMO_DB.NAME, config.DYNAMO_DB.MAP);\n\n if (this.repoDB) {\n this.repoDB.setIndexMap(config.DYNAMO_DB.MAP);\n this.repoDB.setTable(config.DYNAMO_DB.NAME);\n }\n\n if (this.repoES) {\n this.repoES.setEndpoint(config.OPEN_SEARCH.DOMAIN);\n this.repoES.setIndexName(config.OPEN_SEARCH.INDEX);\n }\n }\n\n /**\n * Validates that all field names in the filter exist in the index map.\n * Throws a Bad Request error if any field is not found in the available indexes.\n *\n * @param filter - The filter object containing field names to validate\n * @throws ErrorHttp with 400 status if validation fails\n */\n private checkIsIndexedField(filter: Filter): void {\n if (!filter || typeof filter !== \"object\") {\n return; // Skip validation for invalid filters\n }\n\n const indexMap = this.getIndexMapDB();\n if (!indexMap || indexMap.size === 0) {\n throw new ErrorHttp({ code: 400, error: \"Bad Request\" }, \"No indexes configured for this table\");\n }\n\n // Get all valid field names from all indexes\n const validFields = new Set<string>();\n\n // Add a partition key\n if (indexMap.partitionKey) {\n validFields.add(indexMap.partitionKey);\n }\n\n // Add fields from all indexes\n for (const [indexName, indexConfig] of indexMap.entries()) {\n if (indexConfig.field) {\n validFields.add(indexConfig.field);\n }\n if (indexConfig.rFields) {\n indexConfig.rFields.forEach((field) => validFields.add(field));\n }\n if (indexConfig.sortKeyField) {\n validFields.add(indexConfig.sortKeyField);\n }\n }\n\n // Check each field in the filter\n const invalidFields: string[] = [];\n for (const fieldName of Object.keys(filter)) {\n // Skip special filter properties that are not field names\n if (\n [\"indexName\", \"indexValue\", \"size\", \"lastKey\", \"fieldsInclude\", \"fieldsExclude\", \"rangeFilters\"].includes(\n fieldName,\n )\n ) {\n continue;\n }\n\n // Skip range filter fields (ageMin, ageMax, etc.)\n const rangeSuffixes = [\"Min\", \"Max\", \"From\", \"To\", \"Start\", \"End\"];\n const isRangeField = rangeSuffixes.some((suffix) => fieldName.endsWith(suffix));\n if (isRangeField) {\n continue;\n }\n\n if (!validFields.has(fieldName)) {\n invalidFields.push(fieldName);\n }\n }\n\n if (invalidFields.length > 0) {\n const availableFields = Array.from(validFields).sort();\n throw new ErrorHttp(\n { code: 400, error: \"Bad Request\" },\n `Invalid field names in filter: ${invalidFields.join(\", \")}. Available fields: ${availableFields.join(\", \")}`,\n );\n }\n }\n\n private async fetchAll(filter: Filter): Promise<T[]> {\n const result: Partial<T>[] = [];\n do {\n const response = await this.repoDB.find(filter);\n result.push(...response.items);\n filter.lastKey = response.lastKey;\n } while (filter.lastKey);\n\n return result as T[];\n }\n}\n"]}
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -22,4 +22,5 @@ __exportStar(require("./auth.util"), exports);
|
|
|
22
22
|
__exportStar(require("./env.util"), exports);
|
|
23
23
|
__exportStar(require("./opensearch.utils"), exports);
|
|
24
24
|
__exportStar(require("./dynamodb.utils"), exports);
|
|
25
|
+
__exportStar(require("./logger"), exports);
|
|
25
26
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,8CAA4B;AAC5B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,6CAA2B;AAC3B,qDAAmC;AACnC,mDAAiC","sourcesContent":["export * from \"./error.util\";\nexport * from \"./http.util\";\nexport * from \"./reflection.util\";\nexport * from \"./validation.util\";\nexport * from \"./auth.util\";\nexport * from \"./env.util\";\nexport * from \"./opensearch.utils\";\nexport * from \"./dynamodb.utils\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,8CAA4B;AAC5B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,6CAA2B;AAC3B,qDAAmC;AACnC,mDAAiC;AACjC,2CAAyB","sourcesContent":["export * from \"./error.util\";\nexport * from \"./http.util\";\nexport * from \"./reflection.util\";\nexport * from \"./validation.util\";\nexport * from \"./auth.util\";\nexport * from \"./env.util\";\nexport * from \"./opensearch.utils\";\nexport * from \"./dynamodb.utils\";\nexport * from \"./logger\";\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare class Logger {
|
|
2
|
+
private isProd;
|
|
3
|
+
info(message: any, ...args: unknown[]): void;
|
|
4
|
+
warn(message: any, ...args: unknown[]): void;
|
|
5
|
+
error(message: any, ...args: unknown[]): void;
|
|
6
|
+
debug(message: any, ...args: unknown[]): void;
|
|
7
|
+
group(label: string): void;
|
|
8
|
+
groupEnd(): void;
|
|
9
|
+
private formatArgs;
|
|
10
|
+
}
|
|
11
|
+
declare global {
|
|
12
|
+
var log: Logger;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// logger.ts
|
|
4
|
+
class Logger {
|
|
5
|
+
constructor() {
|
|
6
|
+
var _a;
|
|
7
|
+
this.isProd = (_a = process.env.NODE_ENV) === null || _a === void 0 ? void 0 : _a.toUpperCase().includes("PROD");
|
|
8
|
+
}
|
|
9
|
+
info(message, ...args) {
|
|
10
|
+
console.info(`[INFO] ${message}`, ...this.formatArgs(args));
|
|
11
|
+
}
|
|
12
|
+
warn(message, ...args) {
|
|
13
|
+
console.warn(`[WARN] ${message}`, ...this.formatArgs(args));
|
|
14
|
+
}
|
|
15
|
+
error(message, ...args) {
|
|
16
|
+
console.error(`[ERROR] ${message}`, ...this.formatArgs(args));
|
|
17
|
+
}
|
|
18
|
+
debug(message, ...args) {
|
|
19
|
+
if (this.isProd)
|
|
20
|
+
return;
|
|
21
|
+
const msg = typeof message === "string" ? message : JSON.stringify(message, null, 2);
|
|
22
|
+
console.debug(msg, ...this.formatArgs(args));
|
|
23
|
+
}
|
|
24
|
+
group(label) {
|
|
25
|
+
console.group(`[GROUP] ${label}`);
|
|
26
|
+
}
|
|
27
|
+
groupEnd() {
|
|
28
|
+
console.groupEnd();
|
|
29
|
+
}
|
|
30
|
+
formatArgs(args) {
|
|
31
|
+
return args.map((arg) => (typeof arg === "object" ? JSON.stringify(arg, null, 2) : arg));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
globalThis.log = new Logger();
|
|
35
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;AAAA,YAAY;AACZ,MAAM,MAAM;IAAZ;;QACU,WAAM,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,0CAAE,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IA+BxE,CAAC;IA7BC,IAAI,CAAC,OAAY,EAAE,GAAG,IAAe;QACnC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,OAAY,EAAE,GAAG,IAAe;QACnC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,OAAY,EAAE,GAAG,IAAe;QACpC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,OAAY,EAAE,GAAG,IAAe;QACpC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC;IAEO,UAAU,CAAC,IAAe;QAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3F,CAAC;CACF;AAOD,UAAU,CAAC,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC","sourcesContent":["// logger.ts\nclass Logger {\n private isProd = process.env.NODE_ENV?.toUpperCase().includes(\"PROD\");\n\n info(message: any, ...args: unknown[]) {\n console.info(`[INFO] ${message}`, ...this.formatArgs(args));\n }\n\n warn(message: any, ...args: unknown[]) {\n console.warn(`[WARN] ${message}`, ...this.formatArgs(args));\n }\n\n error(message: any, ...args: unknown[]) {\n console.error(`[ERROR] ${message}`, ...this.formatArgs(args));\n }\n\n debug(message: any, ...args: unknown[]) {\n if (this.isProd) return;\n const msg = typeof message === \"string\" ? message : JSON.stringify(message, null, 2);\n console.debug(msg, ...this.formatArgs(args));\n }\n\n group(label: string) {\n console.group(`[GROUP] ${label}`);\n }\n\n groupEnd() {\n console.groupEnd();\n }\n\n private formatArgs(args: unknown[]): unknown[] {\n return args.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg, null, 2) : arg));\n }\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var log: Logger;\n}\n\nglobalThis.log = new Logger();\n\nexport {};\n"]}
|