aws-service-stack 0.18.421 → 0.18.425
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/local-task-controller.d.ts +17 -0
- package/dist/_examples/controller/local-task-controller.d.ts.map +1 -0
- package/dist/_examples/controller/local-task-controller.js +87 -0
- package/dist/_examples/controller/local-task-controller.js.map +1 -0
- package/dist/_examples/controller/order/order-config.d.ts +7 -0
- package/dist/_examples/controller/order/order-config.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-config.js +54 -0
- package/dist/_examples/controller/order/order-config.js.map +1 -0
- package/dist/_examples/controller/order/order-controller-cron.d.ts +8 -0
- package/dist/_examples/controller/order/order-controller-cron.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-controller-cron.js +58 -0
- package/dist/_examples/controller/order/order-controller-cron.js.map +1 -0
- package/dist/_examples/controller/order/order-controller-streamer.d.ts +7 -0
- package/dist/_examples/controller/order/order-controller-streamer.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-controller-streamer.js +60 -0
- package/dist/_examples/controller/order/order-controller-streamer.js.map +1 -0
- package/dist/_examples/controller/order/order-controller.d.ts +15 -0
- package/dist/_examples/controller/order/order-controller.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-controller.js +121 -0
- package/dist/_examples/controller/order/order-controller.js.map +1 -0
- package/dist/_examples/controller/order/order-cron.d.ts +6 -0
- package/dist/_examples/controller/order/order-cron.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-cron.js +57 -0
- package/dist/_examples/controller/order/order-cron.js.map +1 -0
- package/dist/_examples/controller/order/order-crud.d.ts +5 -0
- package/dist/_examples/controller/order/order-crud.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-crud.js +57 -0
- package/dist/_examples/controller/order/order-crud.js.map +1 -0
- package/dist/_examples/controller/order/order-streamer.d.ts +5 -0
- package/dist/_examples/controller/order/order-streamer.d.ts.map +1 -0
- package/dist/_examples/controller/order/order-streamer.js +57 -0
- package/dist/_examples/controller/order/order-streamer.js.map +1 -0
- package/dist/_examples/controller/order-item/order-item-config.d.ts +7 -0
- package/dist/_examples/controller/order-item/order-item-config.d.ts.map +1 -0
- package/dist/_examples/controller/order-item/order-item-config.js +43 -0
- package/dist/_examples/controller/order-item/order-item-config.js.map +1 -0
- package/dist/_examples/controller/order-item/order-item-controller-streamer.d.ts +7 -0
- package/dist/_examples/controller/order-item/order-item-controller-streamer.d.ts.map +1 -0
- package/dist/_examples/controller/order-item/order-item-controller-streamer.js +60 -0
- package/dist/_examples/controller/order-item/order-item-controller-streamer.js.map +1 -0
- package/dist/_examples/controller/order-item/order-item-controller.d.ts +12 -0
- package/dist/_examples/controller/order-item/order-item-controller.d.ts.map +1 -0
- package/dist/_examples/controller/order-item/order-item-controller.js +78 -0
- package/dist/_examples/controller/order-item/order-item-controller.js.map +1 -0
- package/dist/_examples/controller/order-item/order-item-crud.d.ts +5 -0
- package/dist/_examples/controller/order-item/order-item-crud.d.ts.map +1 -0
- package/dist/_examples/controller/order-item/order-item-crud.js +57 -0
- package/dist/_examples/controller/order-item/order-item-crud.js.map +1 -0
- package/dist/_examples/controller/order-item/order-item-streamer.d.ts +5 -0
- package/dist/_examples/controller/order-item/order-item-streamer.d.ts.map +1 -0
- package/dist/_examples/controller/order-item/order-item-streamer.js +57 -0
- package/dist/_examples/controller/order-item/order-item-streamer.js.map +1 -0
- package/dist/_examples/controller/profile/profile-crud-simple.d.ts +1 -0
- package/dist/_examples/controller/profile/profile-crud-simple.d.ts.map +1 -0
- package/dist/_examples/controller/profile/profile-crud.d.ts +2 -1
- package/dist/_examples/controller/profile/profile-crud.d.ts.map +1 -0
- package/dist/_examples/controller/profile/profile.config.d.ts +1 -0
- package/dist/_examples/controller/profile/profile.config.d.ts.map +1 -0
- package/dist/_examples/controller/profile/profile.config.js +20 -45
- package/dist/_examples/controller/profile/profile.config.js.map +1 -1
- package/dist/_examples/controller/profile/profile.controller.d.ts +4 -3
- package/dist/_examples/controller/profile/profile.controller.d.ts.map +1 -0
- package/dist/_examples/controller/profile/profile.controller.js +10 -3
- package/dist/_examples/controller/profile/profile.controller.js.map +1 -1
- package/dist/_examples/model-shared/example.model.d.ts +1 -0
- package/dist/_examples/model-shared/example.model.d.ts.map +1 -0
- package/dist/_examples/model-shared/order.model.d.ts +74 -0
- package/dist/_examples/model-shared/order.model.d.ts.map +1 -0
- package/dist/_examples/model-shared/order.model.js +12 -0
- package/dist/_examples/model-shared/order.model.js.map +1 -0
- package/dist/_examples/repositories/order/order-db.repo.d.ts +8 -0
- package/dist/_examples/repositories/order/order-db.repo.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-db.repo.interface.d.ts +5 -0
- package/dist/_examples/repositories/order/order-db.repo.interface.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-db.repo.interface.js +3 -0
- package/dist/_examples/repositories/order/order-db.repo.interface.js.map +1 -0
- package/dist/_examples/repositories/order/order-db.repo.js +20 -0
- package/dist/_examples/repositories/order/order-db.repo.js.map +1 -0
- package/dist/_examples/repositories/order/order-item-db.repo.d.ts +8 -0
- package/dist/_examples/repositories/order/order-item-db.repo.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-item-db.repo.interface.d.ts +5 -0
- package/dist/_examples/repositories/order/order-item-db.repo.interface.d.ts.map +1 -0
- package/dist/_examples/repositories/order/order-item-db.repo.interface.js +3 -0
- package/dist/_examples/repositories/order/order-item-db.repo.interface.js.map +1 -0
- package/dist/_examples/repositories/order/order-item-db.repo.js +20 -0
- package/dist/_examples/repositories/order/order-item-db.repo.js.map +1 -0
- package/dist/_examples/repositories/profile/profile-repo-db.d.ts +1 -0
- package/dist/_examples/repositories/profile/profile-repo-db.d.ts.map +1 -0
- package/dist/_examples/repositories/profile/profile-repo-db.interface.d.ts +1 -0
- package/dist/_examples/repositories/profile/profile-repo-db.interface.d.ts.map +1 -0
- package/dist/_examples/service/order/order-item-service-stream.d.ts +13 -0
- package/dist/_examples/service/order/order-item-service-stream.d.ts.map +1 -0
- package/dist/_examples/service/order/order-item-service-stream.interface.d.ts +5 -0
- package/dist/_examples/service/order/order-item-service-stream.interface.d.ts.map +1 -0
- package/dist/_examples/service/order/order-item-service-stream.interface.js +3 -0
- package/dist/_examples/service/order/order-item-service-stream.interface.js.map +1 -0
- package/dist/_examples/service/order/order-item-service-stream.js +81 -0
- package/dist/_examples/service/order/order-item-service-stream.js.map +1 -0
- package/dist/_examples/service/order/order-item-service.d.ts +16 -0
- package/dist/_examples/service/order/order-item-service.d.ts.map +1 -0
- package/dist/_examples/service/order/order-item-service.interface.d.ts +14 -0
- package/dist/_examples/service/order/order-item-service.interface.d.ts.map +1 -0
- package/dist/_examples/service/order/order-item-service.interface.js +3 -0
- package/dist/_examples/service/order/order-item-service.interface.js.map +1 -0
- package/dist/_examples/service/order/order-item-service.js +120 -0
- package/dist/_examples/service/order/order-item-service.js.map +1 -0
- package/dist/_examples/service/order/order-service-stream.d.ts +12 -0
- package/dist/_examples/service/order/order-service-stream.d.ts.map +1 -0
- package/dist/_examples/service/order/order-service-stream.interface.d.ts +5 -0
- package/dist/_examples/service/order/order-service-stream.interface.d.ts.map +1 -0
- package/dist/_examples/service/order/order-service-stream.interface.js +3 -0
- package/dist/_examples/service/order/order-service-stream.interface.js.map +1 -0
- package/dist/_examples/service/order/order-service-stream.js +80 -0
- package/dist/_examples/service/order/order-service-stream.js.map +1 -0
- package/dist/_examples/service/order/order-service.d.ts +19 -0
- package/dist/_examples/service/order/order-service.d.ts.map +1 -0
- package/dist/_examples/service/order/order-service.interface.d.ts +14 -0
- package/dist/_examples/service/order/order-service.interface.d.ts.map +1 -0
- package/dist/_examples/service/order/order-service.interface.js +3 -0
- package/dist/_examples/service/order/order-service.interface.js.map +1 -0
- package/dist/_examples/service/order/order-service.js +127 -0
- package/dist/_examples/service/order/order-service.js.map +1 -0
- package/dist/_examples/service/profile-service.d.ts +3 -3
- package/dist/_examples/service/profile-service.d.ts.map +1 -0
- package/dist/_examples/service/profile-service.interface.d.ts +2 -1
- package/dist/_examples/service/profile-service.interface.d.ts.map +1 -0
- package/dist/_examples/service/profile-service.interface.js.map +1 -1
- package/dist/_examples/service/profile-service.js +14 -14
- package/dist/_examples/service/profile-service.js.map +1 -1
- package/dist/controller/base-controller.d.ts +1 -0
- package/dist/controller/base-controller.d.ts.map +1 -0
- package/dist/controller/base-controller.js +14 -13
- package/dist/controller/base-controller.js.map +1 -1
- package/dist/controller/controller-api.d.ts +1 -0
- package/dist/controller/controller-api.d.ts.map +1 -0
- package/dist/controller/controller-api.js +14 -14
- package/dist/controller/controller-api.js.map +1 -1
- package/dist/controller/controller-request.d.ts +1 -0
- package/dist/controller/controller-request.d.ts.map +1 -0
- package/dist/controller/controller-request.js +2 -2
- package/dist/controller/controller-request.js.map +1 -1
- package/dist/controller/controller-role.d.ts +1 -0
- package/dist/controller/controller-role.d.ts.map +1 -0
- package/dist/controller/controller-role.js +7 -5
- package/dist/controller/controller-role.js.map +1 -1
- package/dist/controller/controller-stream.d.ts +1 -0
- package/dist/controller/controller-stream.d.ts.map +1 -0
- package/dist/controller/index.d.ts +1 -0
- package/dist/controller/index.d.ts.map +1 -0
- package/dist/exception/errors.d.ts +28 -11
- package/dist/exception/errors.d.ts.map +1 -0
- package/dist/exception/errors.js +35 -8
- package/dist/exception/errors.js.map +1 -1
- package/dist/exception/exception-handler.d.ts +6 -0
- package/dist/exception/exception-handler.d.ts.map +1 -0
- package/dist/exception/exception-handler.js +3 -1
- package/dist/exception/exception-handler.js.map +1 -1
- package/dist/exception/index.d.ts +1 -0
- package/dist/exception/index.d.ts.map +1 -0
- package/dist/function/cognito/cognito.function.d.ts +1 -0
- package/dist/function/cognito/cognito.function.d.ts.map +1 -0
- package/dist/function/cognito/index.d.ts +1 -0
- package/dist/function/cognito/index.d.ts.map +1 -0
- package/dist/function/index.d.ts +1 -0
- package/dist/function/index.d.ts.map +1 -0
- package/dist/function/logger.d.ts +1 -0
- package/dist/function/logger.d.ts.map +1 -0
- package/dist/function/s3/index.d.ts +1 -0
- package/dist/function/s3/index.d.ts.map +1 -0
- package/dist/function/s3/s3.function.d.ts +1 -0
- package/dist/function/s3/s3.function.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/model/base.config.d.ts +1 -0
- package/dist/model/base.config.d.ts.map +1 -0
- package/dist/model/base.model.d.ts +1 -0
- package/dist/model/base.model.d.ts.map +1 -0
- package/dist/model/cognito-user.model.d.ts +1 -0
- package/dist/model/cognito-user.model.d.ts.map +1 -0
- package/dist/model/dynamodb.model.d.ts +1 -0
- package/dist/model/dynamodb.model.d.ts.map +1 -0
- package/dist/model/filter.model.d.ts +2 -0
- package/dist/model/filter.model.d.ts.map +1 -0
- package/dist/model/filter.model.js.map +1 -1
- package/dist/model/http.model.d.ts +1 -0
- package/dist/model/http.model.d.ts.map +1 -0
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/role.model.d.ts +6 -5
- package/dist/model/role.model.d.ts.map +1 -0
- package/dist/model/role.model.js.map +1 -1
- package/dist/model/validation.model.d.ts +1 -0
- package/dist/model/validation.model.d.ts.map +1 -0
- package/dist/provider/apigateway.d.ts +1 -0
- package/dist/provider/apigateway.d.ts.map +1 -0
- package/dist/provider/dynamodb.d.ts +1 -0
- package/dist/provider/dynamodb.d.ts.map +1 -0
- package/dist/provider/index.d.ts +1 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/opensearch.d.ts +1 -0
- package/dist/provider/opensearch.d.ts.map +1 -0
- package/dist/repositories/base-core.repo.interface.d.ts +10 -4
- package/dist/repositories/base-core.repo.interface.d.ts.map +1 -0
- package/dist/repositories/base-core.repo.interface.js.map +1 -1
- package/dist/repositories/base-db.repo.d.ts +14 -8
- package/dist/repositories/base-db.repo.d.ts.map +1 -0
- package/dist/repositories/base-db.repo.interface.d.ts +25 -4
- package/dist/repositories/base-db.repo.interface.d.ts.map +1 -0
- package/dist/repositories/base-db.repo.interface.js.map +1 -1
- package/dist/repositories/base-db.repo.js +70 -26
- package/dist/repositories/base-db.repo.js.map +1 -1
- package/dist/repositories/base-es.repo.d.ts +2 -1
- package/dist/repositories/base-es.repo.d.ts.map +1 -0
- package/dist/repositories/base-es.repo.interface.d.ts +1 -0
- package/dist/repositories/base-es.repo.interface.d.ts.map +1 -0
- package/dist/repositories/base-es.repo.js +2 -2
- package/dist/repositories/base-es.repo.js.map +1 -1
- package/dist/repositories/index.d.ts +1 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/service/api.services/api.service.d.ts +1 -0
- package/dist/service/api.services/api.service.d.ts.map +1 -0
- package/dist/service/api.services/api.service.interface.d.ts +1 -0
- package/dist/service/api.services/api.service.interface.d.ts.map +1 -0
- package/dist/service/api.services/index.d.ts +1 -0
- package/dist/service/api.services/index.d.ts.map +1 -0
- package/dist/service/auth.service.d.ts +1 -0
- package/dist/service/auth.service.d.ts.map +1 -0
- package/dist/service/auth.service.interface.d.ts +1 -0
- package/dist/service/auth.service.interface.d.ts.map +1 -0
- package/dist/service/base.service.d.ts +5 -3
- package/dist/service/base.service.d.ts.map +1 -0
- package/dist/service/base.service.interface.d.ts +21 -10
- package/dist/service/base.service.interface.d.ts.map +1 -0
- package/dist/service/base.service.interface.js.map +1 -1
- package/dist/service/base.service.js +14 -11
- package/dist/service/base.service.js.map +1 -1
- package/dist/service/crud-operations.d.ts +103 -0
- package/dist/service/crud-operations.d.ts.map +1 -0
- package/dist/service/crud-operations.js +459 -0
- package/dist/service/crud-operations.js.map +1 -0
- package/dist/service/crud.service.d.ts +12 -18
- package/dist/service/crud.service.d.ts.map +1 -0
- package/dist/service/crud.service.interface.d.ts +55 -13
- package/dist/service/crud.service.interface.d.ts.map +1 -0
- package/dist/service/crud.service.interface.js.map +1 -1
- package/dist/service/crud.service.js +53 -351
- package/dist/service/crud.service.js.map +1 -1
- package/dist/service/index.d.ts +2 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +1 -0
- package/dist/service/index.js.map +1 -1
- package/dist/service/key-aws.services.d.ts +1 -0
- package/dist/service/key-aws.services.d.ts.map +1 -0
- package/dist/service/key.services.interface.d.ts +1 -0
- package/dist/service/key.services.interface.d.ts.map +1 -0
- package/dist/service/permission.cache.d.ts +1 -0
- package/dist/service/permission.cache.d.ts.map +1 -0
- package/dist/service/permission.repo.d.ts +1 -0
- package/dist/service/permission.repo.d.ts.map +1 -0
- package/dist/service/permission.service.d.ts +3 -0
- package/dist/service/permission.service.d.ts.map +1 -0
- package/dist/service/permission.service.js +30 -14
- package/dist/service/permission.service.js.map +1 -1
- package/dist/service/socket.service.d.ts +1 -0
- package/dist/service/socket.service.d.ts.map +1 -0
- package/dist/service/socket.service.interface.d.ts +1 -0
- package/dist/service/socket.service.interface.d.ts.map +1 -0
- package/dist/service/stream.service.d.ts +1 -0
- package/dist/service/stream.service.d.ts.map +1 -0
- package/dist/service/stream.service.interface.d.ts +1 -0
- package/dist/service/stream.service.interface.d.ts.map +1 -0
- package/dist/service/validation.service.interface.d.ts +1 -0
- package/dist/service/validation.service.interface.d.ts.map +1 -0
- package/dist/utils/array.util.d.ts +1 -0
- package/dist/utils/array.util.d.ts.map +1 -0
- package/dist/utils/auth.util.d.ts +1 -0
- package/dist/utils/auth.util.d.ts.map +1 -0
- package/dist/utils/data.util.d.ts +1 -0
- package/dist/utils/data.util.d.ts.map +1 -0
- package/dist/utils/date.util.d.ts +1 -0
- package/dist/utils/date.util.d.ts.map +1 -0
- package/dist/utils/dynamodb.utils.d.ts +2 -1
- package/dist/utils/dynamodb.utils.d.ts.map +1 -0
- package/dist/utils/dynamodb.utils.js +105 -30
- package/dist/utils/dynamodb.utils.js.map +1 -1
- package/dist/utils/env.util.d.ts +1 -0
- package/dist/utils/env.util.d.ts.map +1 -0
- package/dist/utils/error.util.d.ts +1 -0
- package/dist/utils/error.util.d.ts.map +1 -0
- package/dist/utils/http/http-request.d.ts +1 -0
- package/dist/utils/http/http-request.d.ts.map +1 -0
- package/dist/utils/http/http.util.d.ts +1 -0
- package/dist/utils/http/http.util.d.ts.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/json.util.d.ts +1 -0
- package/dist/utils/json.util.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.aggs.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.aggs.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.keyword.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.keyword.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.query.map.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.query.map.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.sort.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.sort.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.parser.utils.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.parser.utils.d.ts.map +1 -0
- package/dist/utils/opensearch/opensearch.transform.d.ts +1 -0
- package/dist/utils/opensearch/opensearch.transform.d.ts.map +1 -0
- package/dist/utils/opensearch.utils.d.ts +1 -0
- package/dist/utils/opensearch.utils.d.ts.map +1 -0
- package/dist/utils/reflection.util.d.ts +1 -0
- package/dist/utils/reflection.util.d.ts.map +1 -0
- package/dist/utils/reflection.util.js +7 -8
- package/dist/utils/reflection.util.js.map +1 -1
- package/dist/utils/string.util.d.ts +1 -0
- package/dist/utils/string.util.d.ts.map +1 -0
- package/dist/utils/validation.util.d.ts +1 -0
- package/dist/utils/validation.util.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.CrudServiceImpl = void 0;
|
|
7
4
|
const index_1 = require("../index");
|
|
8
5
|
const exception_1 = require("../exception");
|
|
9
|
-
const
|
|
10
|
-
const opensearch_parser_1 = require("../utils/opensearch/opensearch.parser");
|
|
6
|
+
const crud_operations_1 = require("./crud-operations");
|
|
11
7
|
class CrudServiceImpl {
|
|
12
8
|
repoDB;
|
|
13
9
|
repoES;
|
|
14
10
|
config;
|
|
11
|
+
writeOps;
|
|
12
|
+
findOps;
|
|
13
|
+
scanOps;
|
|
14
|
+
searchOps;
|
|
15
15
|
constructor(repoDB, repoES) {
|
|
16
16
|
if (repoDB != null && !(repoDB instanceof index_1.BaseRepoDBImpl))
|
|
17
17
|
console.error("repoDB is not an instance of BaseRepoDBImpl");
|
|
@@ -21,113 +21,55 @@ class CrudServiceImpl {
|
|
|
21
21
|
console.error("repo initialization is required");
|
|
22
22
|
this.repoDB = repoDB;
|
|
23
23
|
this.repoES = repoES;
|
|
24
|
+
this.initializeOperations();
|
|
24
25
|
}
|
|
25
26
|
getTableName() {
|
|
26
27
|
return this.repoDB.getTableName();
|
|
27
28
|
}
|
|
28
29
|
async findQuery(queryParams) {
|
|
29
|
-
|
|
30
|
-
this.checkIsIndexedField(filter);
|
|
31
|
-
return await this.find(filter);
|
|
30
|
+
return this.findOps.findQuery(queryParams);
|
|
32
31
|
}
|
|
33
32
|
async deleteFields(entityId, fields) {
|
|
34
|
-
return this.
|
|
33
|
+
return this.writeOps.deleteFields(entityId, fields);
|
|
35
34
|
}
|
|
36
35
|
async searchQuery(queryParams, debug) {
|
|
37
|
-
|
|
38
|
-
return await this.repoES.search(query, debug);
|
|
36
|
+
return this.searchOps.searchQuery(queryParams, debug);
|
|
39
37
|
}
|
|
40
38
|
async searchQueryTotalCount(queryParams) {
|
|
41
|
-
|
|
42
|
-
return this.repoES.count(query);
|
|
39
|
+
return this.searchOps.searchQueryTotalCount(queryParams);
|
|
43
40
|
}
|
|
44
41
|
async incrementValueByField(entityId, fieldName, value) {
|
|
45
|
-
return
|
|
42
|
+
return this.writeOps.incrementValueByField(entityId, fieldName, value);
|
|
46
43
|
}
|
|
47
44
|
async decrementValueByField(entityId, fieldName, value) {
|
|
48
|
-
return
|
|
45
|
+
return this.writeOps.decrementValueByField(entityId, fieldName, value);
|
|
49
46
|
}
|
|
50
|
-
async search(filter) {
|
|
51
|
-
|
|
52
|
-
filter = (0, index_1.parseIndexFilter)(filter, this.getIndexMapDB());
|
|
53
|
-
let parsedFilter = this.parseOwnerFields(filter, this.config);
|
|
54
|
-
parsedFilter = this.setIndexField(parsedFilter, this.config);
|
|
55
|
-
return this.repoES.find(parsedFilter);
|
|
47
|
+
async search(filter, debug) {
|
|
48
|
+
return this.searchOps.search(filter, debug);
|
|
56
49
|
}
|
|
57
50
|
async searchFieldNotExist(fieldName, from, size) {
|
|
58
|
-
return
|
|
51
|
+
return this.searchOps.searchFieldNotExist(fieldName, from, size);
|
|
59
52
|
}
|
|
60
53
|
async save(entity, ownerId, parentId, createdByUser) {
|
|
61
|
-
|
|
62
|
-
if (ownerId && this.config.OWNER_ID_FIELD_NAME)
|
|
63
|
-
entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;
|
|
64
|
-
if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME)
|
|
65
|
-
entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;
|
|
66
|
-
return await this.repoDB.save(entity);
|
|
54
|
+
return this.writeOps.save(entity, ownerId, parentId, createdByUser);
|
|
67
55
|
}
|
|
68
56
|
async saveAll(entities, ownerId, parentId, createdByUser, isTransactional) {
|
|
69
|
-
|
|
70
|
-
for (const item of entities) {
|
|
71
|
-
// const entity = addDatesAndId(item);
|
|
72
|
-
const entity = this.setSystemData(item, index_1.Action.CREATE, createdByUser || ownerId);
|
|
73
|
-
if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME)
|
|
74
|
-
entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;
|
|
75
|
-
if (ownerId && this.config.OWNER_ID_FIELD_NAME)
|
|
76
|
-
entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;
|
|
77
|
-
entitiesUpdated.push(entity);
|
|
78
|
-
}
|
|
79
|
-
return await this.repoDB.saveMany(entitiesUpdated, isTransactional);
|
|
57
|
+
return this.writeOps.saveAll(entities, ownerId, parentId, createdByUser, isTransactional);
|
|
80
58
|
}
|
|
81
59
|
async update(entity, requestUser, fields) {
|
|
82
|
-
|
|
83
|
-
if (fields && fields.length > 0)
|
|
84
|
-
fields.push(fieldName);
|
|
85
|
-
if (fields && fields.length > 0)
|
|
86
|
-
entity = (0, index_1.removeFields)([entity], fields)[0];
|
|
87
|
-
if (!entity || !entity[fieldName])
|
|
88
|
-
throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, `id required`);
|
|
89
|
-
const item = await this.repoDB.findById(entity[fieldName]);
|
|
90
|
-
if (!entity || !item)
|
|
91
|
-
throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, `id not found`);
|
|
92
|
-
if (requestUser &&
|
|
93
|
-
!requestUser.isScope &&
|
|
94
|
-
!requestUser.isAdmin &&
|
|
95
|
-
(item[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||
|
|
96
|
-
item[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId))
|
|
97
|
-
throw new exception_1.ErrorHttp({ code: 403, error: "PermissionDenied" }, `No permission to resource: ${entity.id}`);
|
|
98
|
-
entity = this.setSystemData(entity, index_1.Action.UPDATE, requestUser, item);
|
|
99
|
-
// if (!hasPermission(entity, userId, Permission.UPDATE)) throw new Error("Unauthorized access");
|
|
100
|
-
return this.repoDB.update(entity);
|
|
60
|
+
return this.writeOps.update(entity, requestUser, fields);
|
|
101
61
|
}
|
|
102
62
|
async updateAll(entities, fields, requestUser, isTransactional) {
|
|
103
|
-
|
|
104
|
-
log.warn("this methode is under development, cannot check ownership by updateAll");
|
|
105
|
-
return this.repoDB.updateMany(entities, fields, isTransactional);
|
|
63
|
+
return this.writeOps.updateAll(entities, fields, requestUser, isTransactional);
|
|
106
64
|
}
|
|
107
65
|
async updateFields(entity, fields, requestUser) {
|
|
108
|
-
|
|
109
|
-
return entity;
|
|
110
|
-
return this.repoDB.updateFields(entity, [...fields]);
|
|
66
|
+
return this.writeOps.updateFields(entity, fields);
|
|
111
67
|
}
|
|
112
68
|
async remove(entityId, requestUser) {
|
|
113
|
-
|
|
114
|
-
throw new Error("Entity id required");
|
|
115
|
-
if (requestUser && requestUser.isAdmin)
|
|
116
|
-
return await this.repoDB.delete(entityId);
|
|
117
|
-
const entity = await this.repoDB.findById(entityId);
|
|
118
|
-
if (!entity)
|
|
119
|
-
throw new Error("Entity not found");
|
|
120
|
-
if (requestUser &&
|
|
121
|
-
!requestUser.isScope &&
|
|
122
|
-
(entity[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||
|
|
123
|
-
entity[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId))
|
|
124
|
-
throw new exception_1.ErrorHttp({ code: 403, error: "PermissionDenied" }, `No permission to resource: ${entity.id}`);
|
|
125
|
-
return await this.repoDB.delete(entityId);
|
|
69
|
+
return this.writeOps.remove(entityId, requestUser);
|
|
126
70
|
}
|
|
127
71
|
async removeAll(entityIds, requestUser) {
|
|
128
|
-
|
|
129
|
-
log.warn("this methode is under development, cannot check ownership by removeAll");
|
|
130
|
-
return await this.repoDB.deleteMany(entityIds);
|
|
72
|
+
return this.writeOps.removeAll(entityIds, requestUser);
|
|
131
73
|
}
|
|
132
74
|
async removeMatch(filter, requestUser) {
|
|
133
75
|
const { items } = await this.find(filter);
|
|
@@ -136,9 +78,7 @@ class CrudServiceImpl {
|
|
|
136
78
|
return this.removeAll(items.map((item) => item.id), requestUser);
|
|
137
79
|
}
|
|
138
80
|
async changeOwner(entityId, ownerId) {
|
|
139
|
-
|
|
140
|
-
entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;
|
|
141
|
-
return this.repoDB.update(entity);
|
|
81
|
+
return this.writeOps.changeOwner(entityId, ownerId);
|
|
142
82
|
}
|
|
143
83
|
setTable(tableName, dynamoIndexMap) {
|
|
144
84
|
this.repoDB.setTable(tableName);
|
|
@@ -161,121 +101,49 @@ class CrudServiceImpl {
|
|
|
161
101
|
return true;
|
|
162
102
|
}
|
|
163
103
|
async findAll() {
|
|
164
|
-
|
|
165
|
-
const filter = (0, index_1.parseIndexFilter)("size=250");
|
|
166
|
-
do {
|
|
167
|
-
const response = await this.repoDB.find(filter);
|
|
168
|
-
result.push(...response.items);
|
|
169
|
-
filter.lastKey = response.lastKey;
|
|
170
|
-
} while (filter.lastKey);
|
|
171
|
-
return result;
|
|
104
|
+
return this.findOps.findAll();
|
|
172
105
|
}
|
|
173
106
|
async findAllMatch(filter) {
|
|
174
|
-
|
|
175
|
-
filter = (0, index_1.parseIndexFilter)(filter, this.getIndexMapDB());
|
|
176
|
-
this.checkIsIndexedField(filter);
|
|
177
|
-
return await this.fetchAll(filter);
|
|
107
|
+
return this.findOps.findAllMatch(filter);
|
|
178
108
|
}
|
|
179
109
|
async findAllByIndex(indexName, indexValue) {
|
|
180
|
-
|
|
181
|
-
const filter = { indexName: indexName, indexValue: indexValue };
|
|
182
|
-
this.checkIsIndexedField(filter);
|
|
183
|
-
const parsedFilter = (0, index_1.parseIndexFilter)(filter, this.getIndexMapDB());
|
|
184
|
-
return this.fetchAll(parsedFilter);
|
|
110
|
+
return this.findOps.findAllByIndex(indexName, indexValue);
|
|
185
111
|
}
|
|
186
112
|
async findByField(fieldName, fieldValue) {
|
|
187
|
-
|
|
188
|
-
const filter = { [fieldName]: fieldValue, size: 100 };
|
|
189
|
-
this.checkIsIndexedField(filter);
|
|
190
|
-
const parsedFilter = (0, index_1.parseIndexFilter)(fieldName + "=" + fieldValue + "&size=100", this.getIndexMapDB());
|
|
191
|
-
return (await this.find(parsedFilter));
|
|
113
|
+
return this.findOps.findByField(fieldName, fieldValue);
|
|
192
114
|
}
|
|
193
115
|
async findFirst(fieldName, fieldValue) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return result.items.length > 0 ? result.items[0] : null;
|
|
199
|
-
}
|
|
200
|
-
async find(filter) {
|
|
201
|
-
if (typeof filter === "string")
|
|
202
|
-
filter = (0, index_1.parseIndexFilter)(filter, this.getIndexMapDB());
|
|
203
|
-
// Validate that all field names in the filter exist in the index map
|
|
204
|
-
let parsedFilter = this.parseOwnerFields(filter, this.config);
|
|
205
|
-
this.checkIsIndexedField(parsedFilter);
|
|
206
|
-
parsedFilter = (0, index_1.parseIndexFilter)(filter, this.getIndexMapDB());
|
|
207
|
-
return await this.repoDB.find(parsedFilter);
|
|
116
|
+
return this.findOps.findFirst(fieldName, fieldValue);
|
|
117
|
+
}
|
|
118
|
+
async find(filter, debug) {
|
|
119
|
+
return this.findOps.find(filter, debug);
|
|
208
120
|
}
|
|
209
121
|
async *findStream(filter, size) {
|
|
210
|
-
|
|
211
|
-
const pageSize = size ?? 50;
|
|
212
|
-
do {
|
|
213
|
-
const filterStr = `lastkey=${lastKey}&size=${pageSize}&${filter}`;
|
|
214
|
-
const itemList = await this.findQuery(filterStr);
|
|
215
|
-
yield* itemList.items;
|
|
216
|
-
lastKey = itemList.lastKey;
|
|
217
|
-
} while (lastKey);
|
|
122
|
+
yield* this.findOps.findStream(filter, size);
|
|
218
123
|
}
|
|
219
124
|
async *searchStream(filter, size) {
|
|
220
|
-
|
|
221
|
-
const pageSize = size ?? 50;
|
|
222
|
-
while (true) {
|
|
223
|
-
const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;
|
|
224
|
-
const resultList = await this.searchQuery(filterStr);
|
|
225
|
-
yield* resultList.items;
|
|
226
|
-
if (resultList.items.length < pageSize)
|
|
227
|
-
break;
|
|
228
|
-
}
|
|
125
|
+
yield* this.searchOps.searchStream(filter, size);
|
|
229
126
|
}
|
|
230
127
|
async *searchStreamAggr(filter, size) {
|
|
231
|
-
|
|
232
|
-
const pageSize = size ?? 50;
|
|
233
|
-
while (true) {
|
|
234
|
-
const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;
|
|
235
|
-
const resultList = await this.searchQuery(filterStr);
|
|
236
|
-
yield resultList;
|
|
237
|
-
if (resultList.items.length < pageSize)
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
128
|
+
yield* this.searchOps.searchStreamAggr(filter, size);
|
|
240
129
|
}
|
|
241
130
|
async findById(entityId, requestUser) {
|
|
242
|
-
|
|
243
|
-
if (!entity)
|
|
244
|
-
return null;
|
|
245
|
-
if (!requestUser || requestUser.isAdmin)
|
|
246
|
-
return entity;
|
|
247
|
-
const isOwnerParent = entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile;
|
|
248
|
-
const isParent = entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile;
|
|
249
|
-
if (!requestUser.profile || isOwnerParent || isParent) {
|
|
250
|
-
return entity;
|
|
251
|
-
}
|
|
252
|
-
return null;
|
|
131
|
+
return this.writeOps.findById(entityId, requestUser);
|
|
253
132
|
}
|
|
254
133
|
async findByIds(entityIds, requestUser) {
|
|
255
|
-
|
|
256
|
-
throw new exception_1.ErrorDynamoDB(this.getTableName(), "findByIds", "Too many entities");
|
|
257
|
-
const entities = await this.repoDB.findByIds(entityIds);
|
|
258
|
-
if (!requestUser || requestUser.isAdmin)
|
|
259
|
-
return entities;
|
|
260
|
-
const ownEntities = [];
|
|
261
|
-
for (const entity of entities) {
|
|
262
|
-
if (entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile ||
|
|
263
|
-
entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile) {
|
|
264
|
-
ownEntities.push(entity);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
return ownEntities;
|
|
134
|
+
return this.writeOps.findByIds(entityIds, requestUser);
|
|
268
135
|
}
|
|
269
|
-
async scan(filter) {
|
|
270
|
-
this.
|
|
271
|
-
const parsedFilter = (0, index_1.parseIndexFilter)(filter, this.getIndexMapDB());
|
|
272
|
-
return await this.repoDB.scan(parsedFilter);
|
|
136
|
+
async scan(filter, debug) {
|
|
137
|
+
return this.scanOps.scan(filter, debug);
|
|
273
138
|
}
|
|
274
139
|
throwErrorHttp(error, message, errorContent) {
|
|
275
|
-
throw new exception_1.ErrorHttp({ code: error.code,
|
|
140
|
+
throw new exception_1.ErrorHttp({ code: error.code, msg: error.message }, message, errorContent);
|
|
276
141
|
}
|
|
277
142
|
throwErrorsHttp(code, message, errorContent) {
|
|
278
|
-
throw new exception_1.ErrorHttp({ code,
|
|
143
|
+
throw new exception_1.ErrorHttp({ code, msg: message }, message, errorContent);
|
|
144
|
+
}
|
|
145
|
+
throwHttpError(status, message, content, reason) {
|
|
146
|
+
throw new exception_1.ErrorHttp(status, message, content, reason);
|
|
279
147
|
}
|
|
280
148
|
throwErrorDatabase(tableName, command, errorContent) {
|
|
281
149
|
throw new exception_1.ErrorDynamoDB(tableName, command, errorContent);
|
|
@@ -292,189 +160,23 @@ class CrudServiceImpl {
|
|
|
292
160
|
this.repoDB.setIndexMap(config.DYNAMO_DB?.MAP);
|
|
293
161
|
this.repoDB.setTable(config.DYNAMO_DB?.NAME);
|
|
294
162
|
}
|
|
163
|
+
this.writeOps = new crud_operations_1.DynamoWriteOperations(this.repoDB, config);
|
|
164
|
+
this.findOps = new crud_operations_1.DynamoFindOperations(this.repoDB, config);
|
|
165
|
+
this.scanOps = new crud_operations_1.DynamoScanOperations(this.repoDB, config);
|
|
166
|
+
this.searchOps = new crud_operations_1.OpenSearchOperations(this.repoES, config);
|
|
295
167
|
if (this.repoES) {
|
|
296
168
|
this.repoES.setEndpoint(config.OPEN_SEARCH.DOMAIN);
|
|
297
169
|
this.repoES.setIndexName(config.OPEN_SEARCH.INDEX);
|
|
298
170
|
}
|
|
299
171
|
}
|
|
300
172
|
/**
|
|
301
|
-
*
|
|
302
|
-
* Throws a Bad Request error if any field is not found in the available indexes.
|
|
303
|
-
*
|
|
304
|
-
* @param filter - The filter object containing field names to validate
|
|
305
|
-
* @throws ErrorHttp with status 400 if validation fails
|
|
173
|
+
* Creates operation delegates with the current config snapshot.
|
|
306
174
|
*/
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
if (!indexMap || indexMap.size === 0) {
|
|
313
|
-
throw new exception_1.ErrorHttp({ code: 400, error: "Bad Request" }, "No indexes configured for this table");
|
|
314
|
-
}
|
|
315
|
-
// Get all valid field names from all indexes
|
|
316
|
-
const validFields = new Set();
|
|
317
|
-
// Add a partition key
|
|
318
|
-
if (indexMap.partitionKey) {
|
|
319
|
-
validFields.add(indexMap.partitionKey);
|
|
320
|
-
}
|
|
321
|
-
// Add fields from all indexes
|
|
322
|
-
for (const [indexName, indexConfig] of indexMap.entries()) {
|
|
323
|
-
if (indexConfig.field) {
|
|
324
|
-
validFields.add(indexConfig.field);
|
|
325
|
-
}
|
|
326
|
-
if (indexConfig.rFields) {
|
|
327
|
-
indexConfig.rFields.forEach((field) => validFields.add(field));
|
|
328
|
-
}
|
|
329
|
-
if (indexConfig.sortKeyField) {
|
|
330
|
-
validFields.add(indexConfig.sortKeyField);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
// Check each field in the filter
|
|
334
|
-
const invalidFields = [];
|
|
335
|
-
for (const fieldName of Object.keys(filter)) {
|
|
336
|
-
// Skip special filter properties that are not field names
|
|
337
|
-
if (["indexName", "indexValue", "size", "lastKey", "fieldsInclude", "fieldsExclude", "rangeFilters"].includes(fieldName)) {
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
// Skip range filter fields (ageMin, ageMax, etc.)
|
|
341
|
-
const rangeSuffixes = ["Min", "Max", "From", "To", "Start", "End"];
|
|
342
|
-
const isRangeField = rangeSuffixes.some((suffix) => fieldName.endsWith(suffix));
|
|
343
|
-
if (isRangeField) {
|
|
344
|
-
continue;
|
|
345
|
-
}
|
|
346
|
-
if (!validFields.has(fieldName)) {
|
|
347
|
-
invalidFields.push(fieldName);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
if (invalidFields.length > 0) {
|
|
351
|
-
const availableFields = Array.from(validFields).sort();
|
|
352
|
-
throw new exception_1.ErrorHttp({ code: 400, error: "Bad Request" }, `Invalid field names in filter: ${invalidFields.join(", ")}. Available fields: ${availableFields.join(", ")}`);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
async fetchAll(filter) {
|
|
356
|
-
if (typeof filter === "string")
|
|
357
|
-
filter = (0, index_1.parseFilter)(filter);
|
|
358
|
-
const result = [];
|
|
359
|
-
do {
|
|
360
|
-
const response = await this.repoDB.find(filter);
|
|
361
|
-
result.push(...response.items);
|
|
362
|
-
filter.lastKey = response.lastKey;
|
|
363
|
-
} while (filter.lastKey);
|
|
364
|
-
return result;
|
|
365
|
-
}
|
|
366
|
-
parseOwnerFields(filter, entityConfig) {
|
|
367
|
-
if (!filter)
|
|
368
|
-
return null;
|
|
369
|
-
const parsedFilter = filter;
|
|
370
|
-
log.debug("input filter", parsedFilter);
|
|
371
|
-
if (parsedFilter.ownerParentId && !entityConfig.OWNER_PARENT_ID_FIELD_NAME) {
|
|
372
|
-
parsedFilter.profileId = parsedFilter.ownerParentId;
|
|
373
|
-
delete parsedFilter.ownerParentId;
|
|
374
|
-
}
|
|
375
|
-
if (!parsedFilter.profileId)
|
|
376
|
-
delete parsedFilter.profileId;
|
|
377
|
-
if (parsedFilter.ownerParentId && entityConfig.OWNER_PARENT_ID_FIELD_NAME) {
|
|
378
|
-
parsedFilter[entityConfig.OWNER_PARENT_ID_FIELD_NAME] = parsedFilter.ownerParentId;
|
|
379
|
-
if (entityConfig.OWNER_PARENT_ID_FIELD_NAME !== "ownerParentId")
|
|
380
|
-
delete parsedFilter.ownerParentId;
|
|
381
|
-
}
|
|
382
|
-
if (parsedFilter.profileId && entityConfig.OWNER_ID_FIELD_NAME) {
|
|
383
|
-
parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.profileId;
|
|
384
|
-
if (entityConfig.OWNER_ID_FIELD_NAME !== "profileId")
|
|
385
|
-
delete parsedFilter.profileId;
|
|
386
|
-
}
|
|
387
|
-
if (parsedFilter.ownerId && entityConfig.OWNER_ID_FIELD_NAME) {
|
|
388
|
-
parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.ownerId;
|
|
389
|
-
if (entityConfig.OWNER_ID_FIELD_NAME !== "ownerId")
|
|
390
|
-
delete parsedFilter.ownerId;
|
|
391
|
-
}
|
|
392
|
-
log.debug("parsedFilter", parsedFilter);
|
|
393
|
-
return parsedFilter;
|
|
394
|
-
}
|
|
395
|
-
setSystemData(itemNew, action, requestUser, itemOld) {
|
|
396
|
-
if (!action || action === index_1.Action.DELETE || action === index_1.Action.READ)
|
|
397
|
-
return itemNew;
|
|
398
|
-
const date = (0, dayjs_1.default)().toISOString();
|
|
399
|
-
const user = this.extractUser(requestUser);
|
|
400
|
-
switch (action) {
|
|
401
|
-
case index_1.Action.CREATE:
|
|
402
|
-
return this.handleCreate(itemNew, user, date);
|
|
403
|
-
case index_1.Action.UPDATE:
|
|
404
|
-
return this.handleUpdate(itemNew, itemOld, user, date);
|
|
405
|
-
default:
|
|
406
|
-
return itemNew;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
extractUser(requestUser) {
|
|
410
|
-
if (!requestUser)
|
|
411
|
-
return undefined;
|
|
412
|
-
if (typeof requestUser === "string")
|
|
413
|
-
return requestUser;
|
|
414
|
-
return requestUser.username;
|
|
415
|
-
}
|
|
416
|
-
handleCreate(entity, user, date) {
|
|
417
|
-
const dayjsData = (0, dayjs_1.default)(new Date(date));
|
|
418
|
-
const noIdExist = entity[this.config.DYNAMO_DB.MAP.partitionKey ?? "id"] === undefined;
|
|
419
|
-
if (noIdExist)
|
|
420
|
-
entity[this.config.DYNAMO_DB.MAP.partitionKey ?? "id"] = crypto.randomUUID();
|
|
421
|
-
entity.createdAt = date;
|
|
422
|
-
if (user)
|
|
423
|
-
entity.createdBy = user;
|
|
424
|
-
entity.year = dayjsData.year().toString();
|
|
425
|
-
entity.yearMonth = dayjsData.format("YYYY-MM");
|
|
426
|
-
if (!entity.updatedAt) {
|
|
427
|
-
entity.updatedAt = entity.createdAt;
|
|
428
|
-
}
|
|
429
|
-
if (!this.config.TRACE_CHANGE?.fields)
|
|
430
|
-
return entity;
|
|
431
|
-
entity.history = this.addHistory(entity.history, { action: index_1.Action.CREATE, user, date });
|
|
432
|
-
return entity;
|
|
433
|
-
}
|
|
434
|
-
handleUpdate(entity, itemOld, user, date) {
|
|
435
|
-
if (user)
|
|
436
|
-
entity.updatedBy = user;
|
|
437
|
-
entity.history = entity.history || itemOld?.history;
|
|
438
|
-
entity.updatedAt = date;
|
|
439
|
-
if (!this.config.TRACE_CHANGE?.fields || !itemOld) {
|
|
440
|
-
return entity;
|
|
441
|
-
}
|
|
442
|
-
const changes = (0, index_1.computeChangedFields)(itemOld, entity, this.config.TRACE_CHANGE);
|
|
443
|
-
if (changes.length > 0) {
|
|
444
|
-
entity.history = this.addHistory(entity.history, {
|
|
445
|
-
action: index_1.Action.UPDATE,
|
|
446
|
-
user,
|
|
447
|
-
date,
|
|
448
|
-
changes,
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
return entity;
|
|
452
|
-
}
|
|
453
|
-
addHistory(history, entry) {
|
|
454
|
-
// skip empty or invalid history entries
|
|
455
|
-
if (!entry.changes || entry.changes.length === 0) {
|
|
456
|
-
return history || [];
|
|
457
|
-
}
|
|
458
|
-
// clone to avoid accidental mutation
|
|
459
|
-
const newHistory = [...(history || [])];
|
|
460
|
-
// optional: limit max history size (e.g., last 100 changes)
|
|
461
|
-
const MAX_HISTORY_ENTRIES = 100;
|
|
462
|
-
if (newHistory.length >= MAX_HISTORY_ENTRIES) {
|
|
463
|
-
newHistory.shift(); // remove oldest
|
|
464
|
-
}
|
|
465
|
-
newHistory.push(entry);
|
|
466
|
-
return newHistory;
|
|
467
|
-
}
|
|
468
|
-
setIndexField(filter, config) {
|
|
469
|
-
if (!filter.indexName || !filter.indexValue)
|
|
470
|
-
return filter;
|
|
471
|
-
const indexMap = config.DYNAMO_DB.MAP;
|
|
472
|
-
if (!indexMap || indexMap.size === 0)
|
|
473
|
-
return filter;
|
|
474
|
-
const indexConfig = indexMap.get(filter.indexName);
|
|
475
|
-
if (!indexConfig)
|
|
476
|
-
return filter;
|
|
477
|
-
filter.indexName = indexConfig.field;
|
|
175
|
+
initializeOperations() {
|
|
176
|
+
this.writeOps = new crud_operations_1.DynamoWriteOperations(this.repoDB, this.config);
|
|
177
|
+
this.findOps = new crud_operations_1.DynamoFindOperations(this.repoDB, this.config);
|
|
178
|
+
this.scanOps = new crud_operations_1.DynamoScanOperations(this.repoDB, this.config);
|
|
179
|
+
this.searchOps = new crud_operations_1.OpenSearchOperations(this.repoES, this.config);
|
|
478
180
|
}
|
|
479
181
|
}
|
|
480
182
|
exports.CrudServiceImpl = CrudServiceImpl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.service.js","sourceRoot":"","sources":["../../src/service/crud.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Action,\n BaseEntity,\n BaseRepoDB,\n BaseRepoDBImpl,\n BaseRepoES,\n BaseRepoESImpl,\n ChangeHistory,\n CognitoUser,\n computeChangedFields,\n DynamoIndexMap,\n Filter,\n List,\n parseFilter,\n parseIndexFilter,\n removeFields,\n} from \"../index\";\nimport { ErrorBase, ErrorDynamoDB, ErrorHttp, ErrorValidation } from \"../exception\";\n\nimport { EntityConfig } from \"@chinggis/types\";\nimport { CrudService } from \"./crud.service.interface\";\nimport dayjs from \"dayjs\";\nimport { buildSearchQueryOS } from \"../utils/opensearch/opensearch.parser\";\n\nexport abstract class CrudServiceImpl<\n T extends BaseEntity,\n D extends BaseRepoDB<T>,\n S extends BaseRepoES<T>,\n> implements CrudService<T> {\n protected repoDB: D;\n protected repoES: S;\n protected config: EntityConfig;\n\n protected constructor(repoDB: D, repoES: S) {\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 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 deleteFields(entityId: string, fields: string[]): Promise<Partial<T>> {\n return this.repoDB.deleteFields(entityId, fields);\n }\n\n async searchQuery(\n queryParams: any,\n debug?: boolean,\n ): Promise<{ items: Partial<T>[]; total: number; aggs?: Record<string, any> }> {\n const query = buildSearchQueryOS(queryParams, this.config);\n\n return await this.repoES.search(query, debug);\n }\n\n async searchQueryTotalCount(queryParams: any): Promise<number> {\n const query = buildSearchQueryOS(queryParams, this.config);\n\n return this.repoES.count(query);\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 | string): Promise<List<Partial<T>>> {\n if (typeof filter === \"string\") filter = parseIndexFilter(filter, this.getIndexMapDB());\n\n let parsedFilter = this.parseOwnerFields(filter, this.config);\n parsedFilter = this.setIndexField(parsedFilter, this.config);\n\n return this.repoES.find(parsedFilter);\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, parentId?: string, createdByUser?: string | CognitoUser): Promise<T> {\n entity = this.setSystemData(entity, Action.CREATE, createdByUser);\n\n if (ownerId && this.config.OWNER_ID_FIELD_NAME) entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n\n if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME) entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;\n\n return await this.repoDB.save(entity);\n }\n\n async saveAll(\n entities: Partial<T>[],\n ownerId: string,\n parentId?: string,\n createdByUser?: string | CognitoUser,\n isTransactional?: boolean,\n ): Promise<Partial<T>[]> {\n const entitiesUpdated = [];\n\n for (const item of entities) {\n // const entity = addDatesAndId(item);\n const entity = this.setSystemData(item, Action.CREATE, createdByUser || ownerId);\n\n if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME) entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;\n\n if (ownerId && this.config.OWNER_ID_FIELD_NAME) entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n\n entitiesUpdated.push(entity);\n }\n\n return await this.repoDB.saveMany(entitiesUpdated, isTransactional);\n }\n\n async update(entity: Partial<T>, requestUser?: CognitoUser, fields?: string[]): Promise<T> {\n const fieldName = this.config.DYNAMO_DB?.MAP?.partitionKey ?? \"id\";\n if (fields && fields.length > 0) fields.push(fieldName);\n if (fields && fields.length > 0) entity = removeFields([entity], fields)[0];\n\n if (!entity || !entity[fieldName]) throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, `id required`);\n\n const item = await this.repoDB.findById(entity[fieldName]);\n\n if (!entity || !item) throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, `id not found`);\n\n if (\n requestUser &&\n !requestUser.isScope &&\n !requestUser.isAdmin &&\n (item[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||\n item[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId)\n )\n throw new ErrorHttp({ code: 403, error: \"PermissionDenied\" }, `No permission to resource: ${entity.id}`);\n\n entity = this.setSystemData(entity, Action.UPDATE, requestUser, item);\n\n // if (!hasPermission(entity, userId, Permission.UPDATE)) throw new Error(\"Unauthorized access\");\n return this.repoDB.update(entity);\n }\n\n async updateAll(\n entities: Partial<T>[],\n fields: string[],\n requestUser?: CognitoUser,\n isTransactional?: boolean,\n ): Promise<boolean> {\n if (requestUser) log.warn(\"this methode is under development, cannot check ownership by updateAll\");\n\n return this.repoDB.updateMany(entities, fields, isTransactional);\n }\n\n async updateFields(entity: Partial<T>, fields: string[], requestUser?: CognitoUser): Promise<Partial<T>> {\n if (!entity || !fields?.length) return entity;\n return this.repoDB.updateFields(entity, [...fields]);\n }\n\n async remove(entityId: string, requestUser?: CognitoUser): Promise<boolean> {\n if (!entityId) throw new Error(\"Entity id required\");\n\n if (requestUser && requestUser.isAdmin) return await this.repoDB.delete(entityId);\n\n const entity = await this.repoDB.findById(entityId);\n if (!entity) throw new Error(\"Entity not found\");\n\n if (\n requestUser &&\n !requestUser.isScope &&\n (entity[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||\n entity[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId)\n )\n throw new ErrorHttp({ code: 403, error: \"PermissionDenied\" }, `No permission to resource: ${entity.id}`);\n\n return await this.repoDB.delete(entityId);\n }\n\n async removeAll(entityIds: string[], requestUser?: CognitoUser): Promise<boolean> {\n if (requestUser) log.warn(\"this methode is under development, cannot check ownership by removeAll\");\n return await this.repoDB.deleteMany(entityIds);\n }\n\n async removeMatch(filter: Filter | string, requestUser?: CognitoUser): Promise<boolean> {\n const { items } = await this.find(filter);\n if (items.length === 0) return true;\n\n return this.removeAll(\n items.map((item) => item.id),\n requestUser,\n );\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 setIndexMapDB(indexMap: DynamoIndexMap): boolean {\n this.repoDB.setIndexMap(indexMap);\n return true;\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 | string): Promise<T[]> {\n if (typeof filter === \"string\") filter = parseIndexFilter(filter, this.getIndexMapDB());\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 | string): Promise<List<Partial<T>>> {\n if (typeof filter === \"string\") filter = parseIndexFilter(filter, this.getIndexMapDB());\n // Validate that all field names in the filter exist in the index map\n let parsedFilter = this.parseOwnerFields(filter, this.config);\n\n this.checkIsIndexedField(parsedFilter);\n\n parsedFilter = parseIndexFilter(filter, this.getIndexMapDB());\n return await this.repoDB.find(parsedFilter);\n }\n\n async *findStream(filter: string, size?: number): AsyncGenerator<T> {\n let lastKey: string = \"\";\n const pageSize = size ?? 50;\n\n do {\n const filterStr = `lastkey=${lastKey}&size=${pageSize}&${filter}`;\n const itemList = await this.findQuery(filterStr);\n\n yield* itemList.items as T[];\n\n lastKey = itemList.lastKey;\n } while (lastKey);\n }\n\n async *searchStream(filter: string, size?: number): AsyncGenerator<T> {\n let pageNumber = 1;\n const pageSize = size ?? 50;\n\n while (true) {\n const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;\n const resultList = await this.searchQuery(filterStr);\n yield* resultList.items as T[];\n if (resultList.items.length < pageSize) break;\n }\n }\n\n async *searchStreamAggr(\n filter: string,\n size?: number,\n ): AsyncGenerator<{ items: Partial<T>[]; total: number; aggs?: Record<string, any> }> {\n let pageNumber = 1;\n const pageSize = size ?? 50;\n\n while (true) {\n const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;\n const resultList = await this.searchQuery(filterStr);\n yield resultList;\n if (resultList.items.length < pageSize) break;\n }\n }\n\n async findById(entityId: string, requestUser?: CognitoUser): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n\n if (!entity) return null;\n\n if (!requestUser || requestUser.isAdmin) return entity;\n\n const isOwnerParent = entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile;\n const isParent = entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile;\n\n if (!requestUser.profile || isOwnerParent || isParent) {\n return entity;\n }\n\n return null;\n }\n\n async findByIds(entityIds: string[], requestUser?: CognitoUser): 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\n if (!requestUser || requestUser.isAdmin) return entities;\n\n const ownEntities = [];\n for (const entity of entities) {\n if (\n entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile ||\n entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile\n ) {\n ownEntities.push(entity);\n }\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 throwErrorsHttp(code: number, message: string, errorContent?: any): void {\n throw new ErrorHttp({ code, 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 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 status 400 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 | string): Promise<T[]> {\n if (typeof filter === \"string\") filter = parseFilter(filter);\n\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 private parseOwnerFields(filter: Filter, entityConfig: EntityConfig) {\n if (!filter) return null;\n\n const parsedFilter = filter;\n\n log.debug(\"input filter\", parsedFilter);\n\n if (parsedFilter.ownerParentId && !entityConfig.OWNER_PARENT_ID_FIELD_NAME) {\n parsedFilter.profileId = parsedFilter.ownerParentId;\n delete parsedFilter.ownerParentId;\n }\n if (!parsedFilter.profileId) delete parsedFilter.profileId;\n\n if (parsedFilter.ownerParentId && entityConfig.OWNER_PARENT_ID_FIELD_NAME) {\n parsedFilter[entityConfig.OWNER_PARENT_ID_FIELD_NAME] = parsedFilter.ownerParentId;\n if (entityConfig.OWNER_PARENT_ID_FIELD_NAME !== \"ownerParentId\") delete parsedFilter.ownerParentId;\n }\n\n if (parsedFilter.profileId && entityConfig.OWNER_ID_FIELD_NAME) {\n parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.profileId;\n if (entityConfig.OWNER_ID_FIELD_NAME !== \"profileId\") delete parsedFilter.profileId;\n }\n\n if (parsedFilter.ownerId && entityConfig.OWNER_ID_FIELD_NAME) {\n parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.ownerId;\n if (entityConfig.OWNER_ID_FIELD_NAME !== \"ownerId\") delete parsedFilter.ownerId;\n }\n log.debug(\"parsedFilter\", parsedFilter);\n\n return parsedFilter;\n }\n private setSystemData(itemNew: Partial<T>, action: Action, requestUser?: string | CognitoUser, itemOld?: T): T {\n if (!action || action === Action.DELETE || action === Action.READ) return itemNew as T;\n\n const date = dayjs().toISOString();\n const user = this.extractUser(requestUser);\n\n switch (action) {\n case Action.CREATE:\n return this.handleCreate(itemNew, user, date);\n case Action.UPDATE:\n return this.handleUpdate(itemNew, itemOld, user, date);\n default:\n return itemNew as T;\n }\n }\n\n private extractUser(requestUser: string | CognitoUser): string {\n if (!requestUser) return undefined;\n\n if (typeof requestUser === \"string\") return requestUser;\n\n return requestUser.username;\n }\n\n private handleCreate(entity: Partial<T>, user: string, date: string): T {\n const dayjsData = dayjs(new Date(date));\n\n const noIdExist = entity[this.config.DYNAMO_DB.MAP.partitionKey ?? \"id\"] === undefined;\n if (noIdExist) entity[this.config.DYNAMO_DB.MAP.partitionKey ?? \"id\"] = crypto.randomUUID();\n\n entity.createdAt = date;\n if (user) entity.createdBy = user;\n entity.year = dayjsData.year().toString();\n entity.yearMonth = dayjsData.format(\"YYYY-MM\");\n\n if (!entity.updatedAt) {\n entity.updatedAt = entity.createdAt;\n }\n\n if (!this.config.TRACE_CHANGE?.fields) return entity as T;\n\n entity.history = this.addHistory(entity.history, { action: Action.CREATE, user, date });\n return entity as T;\n }\n\n private handleUpdate(entity: Partial<T>, itemOld: T | undefined, user: string, date: string): T {\n if (user) entity.updatedBy = user;\n entity.history = entity.history || itemOld?.history;\n\n entity.updatedAt = date;\n\n if (!this.config.TRACE_CHANGE?.fields || !itemOld) {\n return entity as T;\n }\n\n const changes = computeChangedFields(itemOld, entity, this.config.TRACE_CHANGE);\n if (changes.length > 0) {\n entity.history = this.addHistory(entity.history, {\n action: Action.UPDATE,\n user,\n date,\n changes,\n });\n }\n\n return entity as T;\n }\n\n private addHistory(history: ChangeHistory[] | undefined, entry: ChangeHistory): ChangeHistory[] {\n // skip empty or invalid history entries\n if (!entry.changes || entry.changes.length === 0) {\n return history || [];\n }\n\n // clone to avoid accidental mutation\n const newHistory = [...(history || [])];\n\n // optional: limit max history size (e.g., last 100 changes)\n const MAX_HISTORY_ENTRIES = 100;\n if (newHistory.length >= MAX_HISTORY_ENTRIES) {\n newHistory.shift(); // remove oldest\n }\n\n newHistory.push(entry);\n return newHistory;\n }\n\n private setIndexField(filter: Filter, config: EntityConfig) {\n if (!filter.indexName || !filter.indexValue) return filter;\n\n const indexMap = config.DYNAMO_DB.MAP;\n if (!indexMap || indexMap.size === 0) return filter;\n\n const indexConfig = indexMap.get(filter.indexName);\n if (!indexConfig) return filter;\n\n filter.indexName = indexConfig.field;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"crud.service.js","sourceRoot":"","sources":["../../src/service/crud.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseEntity,\n BaseRepoDB,\n BaseRepoDBImpl,\n BaseRepoES,\n BaseRepoESImpl,\n CognitoUser,\n DynamoIndexMap,\n ErrorReason,\n Filter,\n HttpStatus,\n List,\n} from \"../index\";\nimport { ErrorBase, ErrorDynamoDB, ErrorHttp, ErrorValidation } from \"../exception\";\n\nimport { EntityConfig } from \"@chinggis/types\";\nimport { CrudService } from \"./crud.service.interface\";\nimport {\n DynamoFindOperations,\n DynamoScanOperations,\n DynamoWriteOperations,\n OpenSearchOperations,\n} from \"./crud-operations\";\n\nexport abstract class CrudServiceImpl<\n T extends BaseEntity,\n D extends BaseRepoDB<T>,\n S extends BaseRepoES<T>,\n> implements CrudService<T> {\n protected repoDB: D;\n protected repoES: S;\n protected config: EntityConfig;\n private writeOps: DynamoWriteOperations<T, D>;\n private findOps: DynamoFindOperations<T, D>;\n private scanOps: DynamoScanOperations<T, D>;\n private searchOps: OpenSearchOperations<T, S>;\n\n protected constructor(repoDB: D, repoES: S) {\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 this.initializeOperations();\n }\n\n getTableName(): string {\n return this.repoDB.getTableName();\n }\n\n async findQuery(queryParams: string): Promise<List<Partial<T>>> {\n return this.findOps.findQuery(queryParams);\n }\n\n async deleteFields(entityId: string, fields: string[]): Promise<Partial<T>> {\n return this.writeOps.deleteFields(entityId, fields);\n }\n\n async searchQuery(\n queryParams: any,\n debug?: boolean,\n ): Promise<{ items: Partial<T>[]; total: number; aggs?: Record<string, any> }> {\n return this.searchOps.searchQuery(queryParams, debug);\n }\n\n async searchQueryTotalCount(queryParams: any): Promise<number> {\n return this.searchOps.searchQueryTotalCount(queryParams);\n }\n\n async incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return this.writeOps.incrementValueByField(entityId, fieldName, value);\n }\n\n async decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return this.writeOps.decrementValueByField(entityId, fieldName, value);\n }\n\n async search(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>> {\n return this.searchOps.search(filter, debug);\n }\n\n async searchFieldNotExist(fieldName: string, from: number, size: number): Promise<Partial<T>[]> {\n return this.searchOps.searchFieldNotExist(fieldName, from, size);\n }\n\n async save(entity: Partial<T>, ownerId: string, parentId?: string, createdByUser?: string | CognitoUser): Promise<T> {\n return this.writeOps.save(entity, ownerId, parentId, createdByUser);\n }\n\n async saveAll(\n entities: Partial<T>[],\n ownerId: string,\n parentId?: string,\n createdByUser?: string | CognitoUser,\n isTransactional?: boolean,\n ): Promise<Partial<T>[]> {\n return this.writeOps.saveAll(entities, ownerId, parentId, createdByUser, isTransactional);\n }\n\n async update(entity: Partial<T>, requestUser?: CognitoUser, fields?: string[]): Promise<T> {\n return this.writeOps.update(entity, requestUser, fields);\n }\n\n async updateAll(\n entities: Partial<T>[],\n fields: string[],\n requestUser?: CognitoUser,\n isTransactional?: boolean,\n ): Promise<boolean> {\n return this.writeOps.updateAll(entities, fields, requestUser, isTransactional);\n }\n\n async updateFields(entity: Partial<T>, fields: string[], requestUser?: CognitoUser): Promise<Partial<T>> {\n return this.writeOps.updateFields(entity, fields);\n }\n\n async remove(entityId: string, requestUser?: CognitoUser): Promise<boolean> {\n return this.writeOps.remove(entityId, requestUser);\n }\n\n async removeAll(entityIds: string[], requestUser?: CognitoUser): Promise<boolean> {\n return this.writeOps.removeAll(entityIds, requestUser);\n }\n\n async removeMatch(filter: Filter | string, requestUser?: CognitoUser): Promise<boolean> {\n const { items } = await this.find(filter);\n if (items.length === 0) return true;\n\n return this.removeAll(\n items.map((item) => item.id),\n requestUser,\n );\n }\n\n async changeOwner(entityId: string, ownerId: string): Promise<T> {\n return this.writeOps.changeOwner(entityId, ownerId);\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 setIndexMapDB(indexMap: DynamoIndexMap): boolean {\n this.repoDB.setIndexMap(indexMap);\n return true;\n }\n\n async findAll(): Promise<T[]> {\n return this.findOps.findAll();\n }\n\n async findAllMatch(filter: Filter | string): Promise<T[]> {\n return this.findOps.findAllMatch(filter);\n }\n\n async findAllByIndex(indexName: string, indexValue: any): Promise<T[]> {\n return this.findOps.findAllByIndex(indexName, indexValue);\n }\n\n async findByField(fieldName: string, fieldValue: any): Promise<List<T>> {\n return this.findOps.findByField(fieldName, fieldValue);\n }\n\n async findFirst(fieldName: string, fieldValue: string | boolean | number | Date): Promise<T> {\n return this.findOps.findFirst(fieldName, fieldValue);\n }\n\n async find(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>> {\n return this.findOps.find(filter, debug);\n }\n\n async *findStream(filter: string, size?: number): AsyncGenerator<T> {\n yield* this.findOps.findStream(filter, size);\n }\n\n async *searchStream(filter: string, size?: number): AsyncGenerator<T> {\n yield* this.searchOps.searchStream(filter, size);\n }\n\n async *searchStreamAggr(\n filter: string,\n size?: number,\n ): AsyncGenerator<{ items: Partial<T>[]; total: number; aggs?: Record<string, any> }> {\n yield* this.searchOps.searchStreamAggr(filter, size);\n }\n\n async findById(entityId: string, requestUser?: CognitoUser): Promise<T> {\n return this.writeOps.findById(entityId, requestUser);\n }\n\n async findByIds(entityIds: string[], requestUser?: CognitoUser): Promise<T[]> {\n return this.writeOps.findByIds(entityIds, requestUser);\n }\n\n async scan(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>> {\n return this.scanOps.scan(filter, debug);\n }\n\n throwErrorHttp(error: { message: string; code: number }, message?: string, errorContent?: any): void {\n throw new ErrorHttp({ code: error.code, msg: error.message }, message, errorContent);\n }\n\n throwErrorsHttp(code: number, message: string, errorContent?: any): void {\n throw new ErrorHttp({ code, msg: message }, message, errorContent);\n }\n\n throwHttpError(status: HttpStatus, message: string, content?: any, reason?: ErrorReason): void {\n throw new ErrorHttp(status, message, content, reason);\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 if (this.repoDB) {\n this.repoDB.setIndexMap(config.DYNAMO_DB?.MAP);\n this.repoDB.setTable(config.DYNAMO_DB?.NAME);\n }\n\n this.writeOps = new DynamoWriteOperations(this.repoDB, config);\n this.findOps = new DynamoFindOperations(this.repoDB, config);\n this.scanOps = new DynamoScanOperations(this.repoDB, config);\n this.searchOps = new OpenSearchOperations(this.repoES, config);\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 * Creates operation delegates with the current config snapshot.\n */\n private initializeOperations(): void {\n this.writeOps = new DynamoWriteOperations(this.repoDB, this.config);\n this.findOps = new DynamoFindOperations(this.repoDB, this.config);\n this.scanOps = new DynamoScanOperations(this.repoDB, this.config);\n this.searchOps = new OpenSearchOperations(this.repoES, this.config);\n }\n}\n"]}
|
package/dist/service/index.d.ts
CHANGED
|
@@ -5,8 +5,10 @@ export * from "./socket.service";
|
|
|
5
5
|
export * from "./socket.service.interface";
|
|
6
6
|
export * from "./crud.service";
|
|
7
7
|
export * from "./crud.service.interface";
|
|
8
|
+
export * from "./crud-operations";
|
|
8
9
|
export * from "./stream.service";
|
|
9
10
|
export * from "./stream.service.interface";
|
|
10
11
|
export * from "./permission.cache";
|
|
11
12
|
export * from "./permission.repo";
|
|
12
13
|
export * from "./permission.service";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|