@qrvey/data-persistence 0.5.7 → 0.5.8
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/cjs/helpers/crudHelpers.js +3 -4
- package/dist/cjs/helpers/crudHelpers.js.map +1 -1
- package/dist/cjs/helpers/errorHelper.js +1 -2
- package/dist/cjs/helpers/errorHelper.js.map +1 -1
- package/dist/cjs/helpers/queryHelpers.js +2 -2
- package/dist/cjs/helpers/queryHelpers.js.map +1 -1
- package/dist/cjs/helpers/tableHelper.js +4 -5
- package/dist/cjs/helpers/tableHelper.js.map +1 -1
- package/dist/cjs/services/crud.service.js.map +1 -1
- package/dist/cjs/services/crudFactory.service.js +17 -7
- package/dist/cjs/services/crudFactory.service.js.map +1 -1
- package/dist/cjs/services/cruds/dynamodb/dynamoDbCrud.service.js.map +1 -1
- package/dist/cjs/services/cruds/dynamodb/queryBuilder.service.js.map +1 -1
- package/dist/cjs/services/cruds/dynamodb/queryBuilderCondition.service.js.map +1 -1
- package/dist/cjs/services/cruds/postgresql/connection.service.js.map +1 -1
- package/dist/cjs/services/cruds/postgresql/postgreSqlClient.service.js.map +1 -1
- package/dist/cjs/services/cruds/postgresql/postgreSqlCrud.service.js.map +1 -1
- package/dist/cjs/services/cruds/postgresql/query.service.js.map +1 -1
- package/dist/cjs/services/dbPool.service.js +1 -2
- package/dist/cjs/services/dbPool.service.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/utils/constants.js +2 -2
- package/dist/cjs/utils/constants.js.map +1 -1
- package/dist/esm/{chunk-DHIGNHXS.mjs → chunk-2H6RO6ZL.mjs} +4 -6
- package/dist/esm/chunk-2H6RO6ZL.mjs.map +1 -0
- package/dist/esm/{chunk-6MOAJFFY.mjs → chunk-2OYWEFNZ.mjs} +8 -15
- package/dist/esm/chunk-2OYWEFNZ.mjs.map +1 -0
- package/dist/esm/{dynamoDbCrud.service-J7ZOB5QW.mjs → dynamoDbCrud.service-NRSGRPDQ.mjs} +30 -56
- package/dist/esm/dynamoDbCrud.service-NRSGRPDQ.mjs.map +1 -0
- package/dist/esm/index.d.mts +1 -1
- package/dist/esm/index.mjs +6 -7
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/{postgreSqlCrud.service-JGJELA6R.mjs → postgreSqlCrud.service-AD2CHR2Z.mjs} +13 -22
- package/dist/esm/postgreSqlCrud.service-AD2CHR2Z.mjs.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/package.json +8 -8
- package/dist/esm/chunk-6MOAJFFY.mjs.map +0 -1
- package/dist/esm/chunk-DHIGNHXS.mjs.map +0 -1
- package/dist/esm/dynamoDbCrud.service-J7ZOB5QW.mjs.map +0 -1
- package/dist/esm/postgreSqlCrud.service-JGJELA6R.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getTableName, findIdColumnName, getPrimaryKeyColumns, PersistenceErrorWrapper } from './chunk-
|
|
2
|
-
import { __privateAdd, __spreadProps, __spreadValues, FILTER_OPERATOR_MAP, DYNAMODB_OPERATORS, __privateMethod, DYNAMO_DB_UPDATE_ACTIONS } from './chunk-
|
|
1
|
+
import { getTableName, findIdColumnName, getPrimaryKeyColumns, PersistenceErrorWrapper } from './chunk-2H6RO6ZL.mjs';
|
|
2
|
+
import { __privateAdd, __spreadProps, __spreadValues, FILTER_OPERATOR_MAP, DYNAMODB_OPERATORS, __privateMethod, DYNAMO_DB_UPDATE_ACTIONS } from './chunk-2OYWEFNZ.mjs';
|
|
3
3
|
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
4
4
|
import { DynamoDBDocumentClient, GetCommand, QueryCommand, ScanCommand, PutCommand, UpdateCommand, DeleteCommand, BatchWriteCommand } from '@aws-sdk/lib-dynamodb';
|
|
5
5
|
|
|
@@ -40,8 +40,7 @@ var DynamoDbClientService = class {
|
|
|
40
40
|
TableName: this.tableName
|
|
41
41
|
}, options);
|
|
42
42
|
const result = await this.dynamoDBClient.send(new QueryCommand(params));
|
|
43
|
-
if (result.$metadata)
|
|
44
|
-
delete result.$metadata;
|
|
43
|
+
if (result.$metadata) delete result.$metadata;
|
|
45
44
|
return result;
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
@@ -54,8 +53,7 @@ var DynamoDbClientService = class {
|
|
|
54
53
|
});
|
|
55
54
|
const command = new ScanCommand(params);
|
|
56
55
|
const response = await this.dynamoDBClient.send(command);
|
|
57
|
-
if (response.$metadata)
|
|
58
|
-
delete response.$metadata;
|
|
56
|
+
if (response.$metadata) delete response.$metadata;
|
|
59
57
|
return response;
|
|
60
58
|
}
|
|
61
59
|
/**
|
|
@@ -122,8 +120,7 @@ var DynamoDbClientService = class {
|
|
|
122
120
|
return deleteRequestKeys;
|
|
123
121
|
}
|
|
124
122
|
async batchRemove(filterGroups) {
|
|
125
|
-
if (!(filterGroups == null ? void 0 : filterGroups.length))
|
|
126
|
-
return;
|
|
123
|
+
if (!(filterGroups == null ? void 0 : filterGroups.length)) return;
|
|
127
124
|
const deleteRequests = filterGroups.map((filterGroup) => ({
|
|
128
125
|
DeleteRequest: {
|
|
129
126
|
Key: this.buildDeleteRequestKeys(filterGroup)
|
|
@@ -314,8 +311,7 @@ var QueryBuilderConditionService = class {
|
|
|
314
311
|
const valueExpressions = value.map((val, index) => {
|
|
315
312
|
let valueExpression = `:${this.tempKey}${index + 1}1`;
|
|
316
313
|
for (const [i] of Object.entries(this.attributeValues)) {
|
|
317
|
-
if (i === valueExpression)
|
|
318
|
-
valueExpression += "1";
|
|
314
|
+
if (i === valueExpression) valueExpression += "1";
|
|
319
315
|
}
|
|
320
316
|
this.attributeValues[valueExpression] = val;
|
|
321
317
|
return valueExpression;
|
|
@@ -328,8 +324,7 @@ var QueryBuilderConditionService = class {
|
|
|
328
324
|
let valueExpression = `:${this.tempKey}1`;
|
|
329
325
|
if (valueExpression in this.attributeValues) {
|
|
330
326
|
for (const [index] of Object.entries(this.attributeValues)) {
|
|
331
|
-
if (index === valueExpression)
|
|
332
|
-
valueExpression += "1";
|
|
327
|
+
if (index === valueExpression) valueExpression += "1";
|
|
333
328
|
}
|
|
334
329
|
}
|
|
335
330
|
if (!omitAttributeValues)
|
|
@@ -350,8 +345,7 @@ var QueryBuilderConditionService = class {
|
|
|
350
345
|
if (filter == null ? void 0 : filter.logicOperator) {
|
|
351
346
|
if ((_a2 = filter == null ? void 0 : filter.config) == null ? void 0 : _a2.openExpression) {
|
|
352
347
|
filterExpression = filterExpression.replace(/\s+(AND|OR)\s*$/, ` ${filter.config.parentKey} (`);
|
|
353
|
-
if (filterExpression === "")
|
|
354
|
-
filterExpression += "(";
|
|
348
|
+
if (filterExpression === "") filterExpression += "(";
|
|
355
349
|
filterExpression += `${filter.expression} ${filter.logicOperator} `;
|
|
356
350
|
} else if ((_b = filter == null ? void 0 : filter.config) == null ? void 0 : _b.closeExpression) {
|
|
357
351
|
filterExpression += `${filter.expression}) ${filter.config.parentKey} `;
|
|
@@ -394,13 +388,11 @@ var QueryBuilderService = class {
|
|
|
394
388
|
return this;
|
|
395
389
|
}
|
|
396
390
|
ascending() {
|
|
397
|
-
if (!this.useScan)
|
|
398
|
-
this.command.ScanIndexForward = true;
|
|
391
|
+
if (!this.useScan) this.command.ScanIndexForward = true;
|
|
399
392
|
return this;
|
|
400
393
|
}
|
|
401
394
|
descending() {
|
|
402
|
-
if (!this.useScan)
|
|
403
|
-
this.command.ScanIndexForward = false;
|
|
395
|
+
if (!this.useScan) this.command.ScanIndexForward = false;
|
|
404
396
|
return this;
|
|
405
397
|
}
|
|
406
398
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -409,8 +401,7 @@ var QueryBuilderService = class {
|
|
|
409
401
|
return this;
|
|
410
402
|
}
|
|
411
403
|
projection(fields = []) {
|
|
412
|
-
if (!fields.length)
|
|
413
|
-
return this;
|
|
404
|
+
if (!fields.length) return this;
|
|
414
405
|
const expression = [];
|
|
415
406
|
fields.forEach((field) => {
|
|
416
407
|
const key = this.condition.project(field);
|
|
@@ -445,15 +436,11 @@ var QueryBuilderService = class {
|
|
|
445
436
|
};
|
|
446
437
|
|
|
447
438
|
// src/services/cruds/dynamodb/dynamoDbCrud.service.ts
|
|
448
|
-
var
|
|
439
|
+
var _DynamoDbCrudService_instances, prepareAndExecuteUpdateExpression_fn, buildUpdateExpressionQuery_fn, getKeyObjectForUpdateExpression_fn, getUpdateExpressionOptions_fn, extractUpdateExpressionAttributesAndNames_fn;
|
|
449
440
|
var DynamoDbCrudService = class {
|
|
450
441
|
constructor(tableSchema) {
|
|
451
442
|
this.tableSchema = tableSchema;
|
|
452
|
-
__privateAdd(this,
|
|
453
|
-
__privateAdd(this, _buildUpdateExpressionQuery);
|
|
454
|
-
__privateAdd(this, _getKeyObjectForUpdateExpression);
|
|
455
|
-
__privateAdd(this, _getUpdateExpressionOptions);
|
|
456
|
-
__privateAdd(this, _extractUpdateExpressionAttributesAndNames);
|
|
443
|
+
__privateAdd(this, _DynamoDbCrudService_instances);
|
|
457
444
|
this.dynamoDbClientService = new DynamoDbClientService(this.tableName);
|
|
458
445
|
}
|
|
459
446
|
get tableName() {
|
|
@@ -490,8 +477,7 @@ var DynamoDbCrudService = class {
|
|
|
490
477
|
this.applyPagination(query, options.pagination);
|
|
491
478
|
if (options.consistentRead)
|
|
492
479
|
query.consistentRead(options.consistentRead);
|
|
493
|
-
if (options.fields)
|
|
494
|
-
query.projection(options.fields);
|
|
480
|
+
if (options.fields) query.projection(options.fields);
|
|
495
481
|
this.applyFilters(query, options);
|
|
496
482
|
if (options.aggregateFunction === "COUNT" /* COUNT */)
|
|
497
483
|
query.count();
|
|
@@ -502,8 +488,7 @@ var DynamoDbCrudService = class {
|
|
|
502
488
|
).then((res) => {
|
|
503
489
|
var _a2, _b2;
|
|
504
490
|
const pagination = {};
|
|
505
|
-
if (res.lastEvaluatedKey)
|
|
506
|
-
pagination.from = res.lastEvaluatedKey;
|
|
491
|
+
if (res.lastEvaluatedKey) pagination.from = res.lastEvaluatedKey;
|
|
507
492
|
if ((_a2 = options.pagination) == null ? void 0 : _a2.limit)
|
|
508
493
|
pagination.limit = (_b2 = options.pagination) == null ? void 0 : _b2.limit;
|
|
509
494
|
return {
|
|
@@ -549,8 +534,7 @@ var DynamoDbCrudService = class {
|
|
|
549
534
|
return result;
|
|
550
535
|
}
|
|
551
536
|
applyPagination(query, pagination) {
|
|
552
|
-
if (pagination == null ? void 0 : pagination.limit)
|
|
553
|
-
query.limit(pagination.limit);
|
|
537
|
+
if (pagination == null ? void 0 : pagination.limit) query.limit(pagination.limit);
|
|
554
538
|
if (pagination == null ? void 0 : pagination.from)
|
|
555
539
|
query.startKey(this.decryptPaginationKey(pagination.from));
|
|
556
540
|
}
|
|
@@ -580,8 +564,7 @@ var DynamoDbCrudService = class {
|
|
|
580
564
|
buildFindItemQuery(options) {
|
|
581
565
|
var _a;
|
|
582
566
|
const query = new QueryBuilderService();
|
|
583
|
-
if ((_a = options.index) == null ? void 0 : _a.indexName)
|
|
584
|
-
query.usingIndex(options.index.indexName);
|
|
567
|
+
if ((_a = options.index) == null ? void 0 : _a.indexName) query.usingIndex(options.index.indexName);
|
|
585
568
|
this.applyFilters(query, options);
|
|
586
569
|
query.projection(options.fields);
|
|
587
570
|
query.limit(1);
|
|
@@ -591,10 +574,8 @@ var DynamoDbCrudService = class {
|
|
|
591
574
|
const query = this.buildFindItemQuery(options);
|
|
592
575
|
return this.dynamoDbClientService.query(query.get()).then((result) => {
|
|
593
576
|
var _a;
|
|
594
|
-
if ((_a = result.Items) == null ? void 0 : _a.length)
|
|
595
|
-
|
|
596
|
-
if (options.throwErrorIfNull)
|
|
597
|
-
throw new Error("NOT_FOUND");
|
|
577
|
+
if ((_a = result.Items) == null ? void 0 : _a.length) return result.Items[0];
|
|
578
|
+
if (options.throwErrorIfNull) throw new Error("NOT_FOUND");
|
|
598
579
|
return null;
|
|
599
580
|
});
|
|
600
581
|
}
|
|
@@ -627,8 +608,7 @@ var DynamoDbCrudService = class {
|
|
|
627
608
|
});
|
|
628
609
|
}
|
|
629
610
|
applyCompoundFilters(query, options) {
|
|
630
|
-
if (!options.filters)
|
|
631
|
-
return;
|
|
611
|
+
if (!options.filters) return;
|
|
632
612
|
this.buildFilterExpression(query, options);
|
|
633
613
|
}
|
|
634
614
|
buildFilterExpression(query, options, parentKey) {
|
|
@@ -672,8 +652,7 @@ var DynamoDbCrudService = class {
|
|
|
672
652
|
}
|
|
673
653
|
applySorting(query, sorting, sortIndex) {
|
|
674
654
|
if (sorting == null ? void 0 : sorting.length) {
|
|
675
|
-
if (sortIndex)
|
|
676
|
-
query.usingIndex(sortIndex);
|
|
655
|
+
if (sortIndex) query.usingIndex(sortIndex);
|
|
677
656
|
if (sorting[0].direction === "DESC") {
|
|
678
657
|
query.descending();
|
|
679
658
|
} else {
|
|
@@ -716,7 +695,7 @@ var DynamoDbCrudService = class {
|
|
|
716
695
|
}
|
|
717
696
|
async updateExpressions(filters, actions, options) {
|
|
718
697
|
try {
|
|
719
|
-
return await __privateMethod(this,
|
|
698
|
+
return await __privateMethod(this, _DynamoDbCrudService_instances, prepareAndExecuteUpdateExpression_fn).call(this, filters, actions, options);
|
|
720
699
|
} catch (error) {
|
|
721
700
|
PersistenceErrorWrapper(error);
|
|
722
701
|
}
|
|
@@ -726,19 +705,19 @@ var DynamoDbCrudService = class {
|
|
|
726
705
|
throw new Error("Method not implemented.");
|
|
727
706
|
}
|
|
728
707
|
};
|
|
729
|
-
|
|
708
|
+
_DynamoDbCrudService_instances = new WeakSet();
|
|
730
709
|
prepareAndExecuteUpdateExpression_fn = async function(filters, actions, options) {
|
|
731
|
-
const queryObject = __privateMethod(this,
|
|
710
|
+
const queryObject = __privateMethod(this, _DynamoDbCrudService_instances, buildUpdateExpressionQuery_fn).call(this, { filters }).get();
|
|
732
711
|
const primaryKeys = this.defaultPrimaryKeys;
|
|
733
|
-
const keyObject = __privateMethod(this,
|
|
712
|
+
const keyObject = __privateMethod(this, _DynamoDbCrudService_instances, getKeyObjectForUpdateExpression_fn).call(this, queryObject, primaryKeys);
|
|
734
713
|
const updateExpressions = [];
|
|
735
714
|
Object.keys(actions).forEach((action) => {
|
|
736
|
-
const actionUpdateExpression = __privateMethod(this,
|
|
715
|
+
const actionUpdateExpression = __privateMethod(this, _DynamoDbCrudService_instances, extractUpdateExpressionAttributesAndNames_fn).call(this, actions, action);
|
|
737
716
|
updateExpressions.push(actionUpdateExpression);
|
|
738
717
|
});
|
|
739
718
|
const dbParams = __spreadValues({
|
|
740
719
|
UpdateExpression: updateExpressions.join(" ")
|
|
741
|
-
}, __privateMethod(this,
|
|
720
|
+
}, __privateMethod(this, _DynamoDbCrudService_instances, getUpdateExpressionOptions_fn).call(this, options));
|
|
742
721
|
const { ExpressionAttributeValues, ExpressionAttributeNames } = queryObject;
|
|
743
722
|
if (Object.keys(ExpressionAttributeValues).length > 0) {
|
|
744
723
|
dbParams["ExpressionAttributeValues"] = __spreadValues(__spreadValues({}, ExpressionAttributeValues), dbParams.ExpressionAttributeValues);
|
|
@@ -753,16 +732,13 @@ prepareAndExecuteUpdateExpression_fn = async function(filters, actions, options)
|
|
|
753
732
|
dbParams
|
|
754
733
|
);
|
|
755
734
|
};
|
|
756
|
-
_buildUpdateExpressionQuery = new WeakSet();
|
|
757
735
|
buildUpdateExpressionQuery_fn = function(options) {
|
|
758
736
|
var _a;
|
|
759
737
|
const query = new QueryBuilderService();
|
|
760
|
-
if ((_a = options.index) == null ? void 0 : _a.indexName)
|
|
761
|
-
query.usingIndex(options.index.indexName);
|
|
738
|
+
if ((_a = options.index) == null ? void 0 : _a.indexName) query.usingIndex(options.index.indexName);
|
|
762
739
|
this.applyFilters(query, options);
|
|
763
740
|
return query;
|
|
764
741
|
};
|
|
765
|
-
_getKeyObjectForUpdateExpression = new WeakSet();
|
|
766
742
|
getKeyObjectForUpdateExpression_fn = function(queryObject, primaryKeys) {
|
|
767
743
|
const keyObject = {};
|
|
768
744
|
Object.keys(queryObject.ExpressionAttributeNames).forEach(
|
|
@@ -778,7 +754,6 @@ getKeyObjectForUpdateExpression_fn = function(queryObject, primaryKeys) {
|
|
|
778
754
|
);
|
|
779
755
|
return keyObject;
|
|
780
756
|
};
|
|
781
|
-
_getUpdateExpressionOptions = new WeakSet();
|
|
782
757
|
getUpdateExpressionOptions_fn = function(options) {
|
|
783
758
|
const updateExprOptions = {
|
|
784
759
|
ReturnValues: options.returnValues
|
|
@@ -789,7 +764,6 @@ getUpdateExpressionOptions_fn = function(options) {
|
|
|
789
764
|
updateExprOptions.ExpressionAttributeValues = options.expressionAttributeValues;
|
|
790
765
|
return updateExprOptions;
|
|
791
766
|
};
|
|
792
|
-
_extractUpdateExpressionAttributesAndNames = new WeakSet();
|
|
793
767
|
extractUpdateExpressionAttributesAndNames_fn = function(actions, actionType) {
|
|
794
768
|
const actionUpdateExpressions = [];
|
|
795
769
|
actions[actionType].forEach((action) => {
|
|
@@ -818,5 +792,5 @@ extractUpdateExpressionAttributesAndNames_fn = function(actions, actionType) {
|
|
|
818
792
|
};
|
|
819
793
|
|
|
820
794
|
export { DynamoDbCrudService };
|
|
821
|
-
//# sourceMappingURL=
|
|
822
|
-
//# sourceMappingURL=dynamoDbCrud.service-
|
|
795
|
+
//# sourceMappingURL=dynamoDbCrud.service-NRSGRPDQ.mjs.map
|
|
796
|
+
//# sourceMappingURL=dynamoDbCrud.service-NRSGRPDQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/cruds/dynamodb/dynamoDbClient.service.ts","../../src/services/cruds/dynamodb/queryBuilderCondition.service.ts","../../src/services/cruds/dynamodb/queryBuilder.service.ts","../../src/services/cruds/dynamodb/dynamoDbCrud.service.ts"],"names":["_a","_b"],"mappings":"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","file":"dynamoDbCrud.service-NRSGRPDQ.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n QueryCommand,\n PutCommand,\n UpdateCommand,\n DeleteCommand,\n GetCommandInput,\n QueryCommandInput,\n PutCommandInput,\n UpdateCommandInput,\n DeleteCommandInput,\n QueryCommandOutput,\n ScanCommandInput,\n ScanCommand,\n BatchWriteCommandInput,\n BatchWriteCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { IFilter } from '../../../interfaces';\n\nconst AWS_REGION = process.env.AWS_DEFAULT_REGION;\n\n/**\n * Ref:\n * - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html\n * - https://www.fernandomc.com/posts/eight-examples-of-fetching-data-from-dynamodb-with-node/\n */\nexport default class DynamoDbClientService {\n private tableName: string;\n protected dynamoDBClient: DynamoDBDocumentClient;\n\n constructor(tableName: string) {\n if (!tableName)\n throw new Error(\n 'The \"tableName\" is required to use a DynamoDbClientService.',\n );\n this.tableName = tableName;\n const client = new DynamoDBClient({ region: AWS_REGION });\n this.dynamoDBClient = DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n },\n });\n }\n\n /**\n * Get an item by key\n * @param {Object} keyObject - Ex: { jobId: 1234 }\n * @param {GetCommandInput} options\n */\n public async getByKey(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<GetCommandInput> = {},\n ) {\n const params: GetCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ...options,\n };\n const result = await this.dynamoDBClient.send(new GetCommand(params));\n return result.Item;\n }\n\n /**\n * Query a table\n * @param {QueryCommandInput} options\n */\n public async query(\n options: Omit<QueryCommandInput, 'TableName'> = {},\n ): Promise<Omit<QueryCommandOutput, '$metadata'>> {\n const params: QueryCommandInput = {\n TableName: this.tableName,\n ...options,\n };\n const result: Partial<QueryCommandOutput> =\n await this.dynamoDBClient.send(new QueryCommand(params));\n\n if (result.$metadata) delete result.$metadata;\n return result;\n }\n\n /**\n * Scan a table\n * @param {ScanInput} options\n */\n public async scan(\n input: ScanCommandInput,\n ): Promise<Omit<QueryCommandOutput, '$metadata'>> {\n const params: ScanCommandInput = {\n ...input,\n TableName: this.tableName,\n };\n\n const command = new ScanCommand(params);\n const response: Partial<QueryCommandOutput> =\n await this.dynamoDBClient.send(command);\n if (response.$metadata) delete response.$metadata;\n return response;\n }\n\n /**\n * Create/Replace a item object\n * To take care:\n * - https://stackoverflow.com/questions/43667229/difference-between-dynamodb-putitem-vs-updateitem\n * @param {Object} input\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async put(input: Record<string, any>) {\n const params: PutCommandInput = {\n TableName: this.tableName,\n Item: input,\n ReturnValues: 'NONE',\n };\n return await this.dynamoDBClient.send(new PutCommand(params));\n }\n\n /**\n * Update a item object\n * To take care:\n * - https://stackoverflow.com/questions/43667229/difference-between-dynamodb-putitem-vs-updateitem\n * @param {Object} keyObject - Ex: { jobId: 1234 }\n * @param {UpdateCommandInput} updateObject\n */\n public async update(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<UpdateCommandInput> = {},\n ) {\n const params: UpdateCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ReturnValues: 'NONE',\n ...options,\n };\n return await this.dynamoDBClient.send(new UpdateCommand(params));\n }\n\n /**\n * Delete/Remove an item object\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async remove(keyObject: Record<string, any>) {\n const params: DeleteCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ReturnValues: 'NONE',\n };\n return await this.dynamoDBClient.send(new DeleteCommand(params));\n }\n\n public batchWrittenPut(data: Record<string, any>) {\n const putRequests = data.map((item: any) => ({\n PutRequest: {\n Item: item,\n },\n }));\n const params = {\n RequestItems: {\n [this.tableName]: putRequests,\n },\n } as BatchWriteCommandInput;\n const insertCommand = new BatchWriteCommand(params);\n return this.dynamoDBClient.send(insertCommand);\n }\n\n private buildDeleteRequestKeys(filters: IFilter[]) {\n const deleteRequestKeys: any = {};\n filters.forEach((filter) => {\n deleteRequestKeys[filter.attribute] = filter.value;\n });\n return deleteRequestKeys;\n }\n\n async batchRemove(filterGroups: IFilter[][]): Promise<void> {\n if (!filterGroups?.length) return;\n\n const deleteRequests = filterGroups.map((filterGroup: IFilter[]) => ({\n DeleteRequest: {\n Key: this.buildDeleteRequestKeys(filterGroup),\n },\n }));\n\n const params = {\n RequestItems: {\n [this.tableName]: deleteRequests,\n },\n } as BatchWriteCommandInput;\n\n await this.dynamoDBClient.send(new BatchWriteCommand(params));\n }\n\n public async updateExpressions(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyObject: Record<string, any>,\n options: Partial<UpdateCommandInput> = {},\n ) {\n const params: UpdateCommandInput = {\n TableName: this.tableName,\n Key: keyObject,\n ...options,\n };\n\n return await this.dynamoDBClient.send(new UpdateCommand(params));\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueryCommandInput } from '@aws-sdk/client-dynamodb';\nimport { UpdateCommandInput } from '@aws-sdk/lib-dynamodb';\nimport { IQueryBuilder } from '../../../interfaces/queryBuilder.interface';\nimport { METHOD_TO_QUERY } from '../../../helpers/queryHelpers';\nimport { IQueryBuilderCondition } from '../../../interfaces/queryBuilderCondition.interface';\n\nexport default class QueryBuilderConditionService\n implements IQueryBuilderCondition\n{\n private query;\n private command: Pick<\n QueryCommandInput,\n | 'FilterExpression'\n | 'KeyConditionExpression'\n | 'ExpressionAttributeNames'\n | 'ExpressionAttributeValues'\n > &\n Pick<UpdateCommandInput, 'UpdateExpression'>;\n private queryFrom: METHOD_TO_QUERY | undefined;\n private tempKey: string = '';\n private tempLogicOperator: string | null = null;\n private config: any;\n private wheres: string[] = [];\n private filters: string[] = [];\n private updates: string[] = [];\n private attributeNames: Record<string, string> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private attributeValues: Record<string, any> = {};\n\n constructor(query: IQueryBuilder) {\n this.query = query;\n this.command = {};\n }\n\n public get() {\n this.build();\n return this.command;\n }\n\n public setKey(key: string) {\n this.tempKey = key;\n return this;\n }\n setTmpLogicOp(logicOp: string) {\n this.tempLogicOperator = logicOp;\n return this;\n }\n\n setConfig(config: any) {\n this.config = config;\n return this;\n }\n\n public from(methodName: METHOD_TO_QUERY) {\n this.queryFrom = methodName;\n return this;\n }\n\n eq(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} = ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n notEq(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} <> ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n contains(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `contains(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n notContains(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `NOT contains(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n in(keyValue: any) {\n const keyValues = Array.isArray(keyValue) ? keyValue : [keyValue];\n const { key, value } = this.generateKeyValue(keyValues);\n let expression: any = `${key} IN (${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n beginsWith(keyValue: string) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `begins_with(${key}, ${value})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n project(keyValue: string): string {\n const key = `#${keyValue}`;\n this.attributeNames[key] = keyValue;\n return key;\n }\n\n gt(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} > ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n gte(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} >= ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n lte(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} <= ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n lt(keyValue: any) {\n const { key, value } = this.generateKeyValue(keyValue);\n let expression: any = `${key} < ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n attribute_exists(keyValue: string) {\n const { key } = this.generateKeyValue(keyValue, null, true);\n let expression: any = `attribute_exists(${key})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n attribute_not_exists(keyValue: string) {\n const { key } = this.generateKeyValue(keyValue, null, true);\n let expression: any = `attribute_not_exists(${key})`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n between(keyValues: any) {\n const isValidValues =\n Array.isArray(keyValues) && keyValues?.length === 2;\n if (!isValidValues)\n throw new Error(\n 'The value for between filter operator should be an Array with 2 values.',\n );\n\n const { key, value } = this.generateKeyValue(keyValues, ' AND');\n let expression: any = `${key} between ${value}`;\n if (this.tempLogicOperator)\n expression = { expression, logicOperator: this.tempLogicOperator, config: this.config };\n this.setExpression(expression);\n return this.query;\n }\n\n private setExpression(expression: string): void {\n switch (this.queryFrom) {\n case METHOD_TO_QUERY.filter:\n this.filters.push(expression);\n break;\n case METHOD_TO_QUERY.update:\n this.updates.push(expression);\n break;\n default:\n this.wheres.push(expression);\n break;\n }\n }\n\n private generateKeyValue(\n value: string[] | string,\n separatorCharacter: string | null = ',',\n omitAttributeValues: boolean = false,\n ): {\n key: string;\n value: string;\n } {\n const keyExpression = `#${this.tempKey}1`;\n\n this.attributeNames[keyExpression] = this.tempKey;\n\n if (Array.isArray(value)) {\n const valueExpressions = value.map((val, index) => {\n let valueExpression = `:${this.tempKey}${index + 1}1`;\n for (const [i] of Object.entries(this.attributeValues)) {\n if (i === valueExpression) valueExpression += '1';\n }\n this.attributeValues[valueExpression] = val;\n return valueExpression;\n });\n return {\n key: keyExpression,\n value: valueExpressions.join(`${separatorCharacter} `),\n };\n } else {\n let valueExpression = `:${this.tempKey}1`;\n if (valueExpression in this.attributeValues) {\n for (const [index] of Object.entries(this.attributeValues)) {\n if (index === valueExpression) valueExpression += '1';\n }\n }\n if (!omitAttributeValues)\n this.attributeValues[valueExpression] = value;\n return { key: keyExpression, value: valueExpression };\n }\n }\n\n private build(): void {\n if (this.wheres.length > 0) {\n const keyConditionExpression = this.wheres.join(' AND ');\n this.command['KeyConditionExpression'] = keyConditionExpression;\n }\n if (this.filters.length > 0) {\n let filterExpression = '';\n\n this.filters?.forEach((filter: any, index) => {\n if (filter?.logicOperator) {\n if (filter?.config?.openExpression) {\n filterExpression = filterExpression.replace(/\\s+(AND|OR)\\s*$/, ` ${filter.config.parentKey} (`);\n if (filterExpression === '') filterExpression += '('\n filterExpression += `${filter.expression} ${filter.logicOperator} `;\n } else if (filter?.config?.closeExpression) {\n filterExpression += `${filter.expression}) ${filter.config.parentKey} `; \n } else {\n filterExpression += `${filter.expression} ${filter.logicOperator} `;\n }\n }\n });\n filterExpression = filterExpression.replace(/\\s+(AND|OR)\\s*$/, '');\n this.command['FilterExpression'] = filterExpression;\n }\n if (this.updates.length > 0) {\n const filterExpression = this.updates.join(', ');\n this.command['UpdateExpression'] = `SET ${filterExpression}`;\n }\n if (Object.values(this.attributeNames).length > 0)\n this.command['ExpressionAttributeNames'] = this.attributeNames;\n\n if (Object.values(this.attributeValues).length > 0)\n this.command['ExpressionAttributeValues'] = this.attributeValues;\n }\n}\n","import { QueryCommandInput, ScanCommandInput } from '@aws-sdk/client-dynamodb';\nimport { IQueryBuilderCondition } from '../../../interfaces/queryBuilderCondition.interface';\nimport QueryBuilderConditionService from './queryBuilderCondition.service';\nimport { METHOD_TO_QUERY } from '../../../helpers/queryHelpers';\nimport { IQueryBuilder } from '../../../interfaces/queryBuilder.interface';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\n\nexport default class QueryBuilderService implements IQueryBuilder {\n private command: Omit<QueryCommandInput & ScanCommandInput, 'TableName'>;\n private condition: IQueryBuilderCondition;\n\n constructor(private useScan = false) {\n this.command = {};\n\n this.condition = new QueryBuilderConditionService(this);\n }\n\n get() {\n const condition = this.condition.get();\n return { ...this.command, ...condition };\n }\n\n limit(num: number): IQueryBuilder {\n this.command.Limit = num;\n return this;\n }\n\n usingIndex(indexName: string): IQueryBuilder {\n this.command.IndexName = indexName;\n return this;\n }\n\n ascending(): IQueryBuilder {\n if (!this.useScan) this.command.ScanIndexForward = true;\n return this;\n }\n\n descending(): IQueryBuilder {\n if (!this.useScan) this.command.ScanIndexForward = false;\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n startKey(lastEvaluatedKey: Record<string, any>): IQueryBuilder {\n this.command.ExclusiveStartKey = lastEvaluatedKey;\n return this;\n }\n\n projection(fields: string[] = []) {\n if (!fields.length) return this;\n\n const expression: string[] = [];\n fields.forEach((field) => {\n const key = this.condition.project(field);\n expression.push(key);\n });\n this.command.ProjectionExpression = expression.join(',');\n return this;\n }\n\n where(keyName: string): IQueryBuilderCondition {\n this.condition\n .setKey(keyName)\n .setTmpLogicOp(null)\n .from(METHOD_TO_QUERY.where);\n return this.condition;\n }\n\n filter(\n keyName: string,\n logicOperator: string = 'AND',\n config?: any\n ): IQueryBuilderCondition {\n this.condition\n .setKey(keyName)\n .setTmpLogicOp(logicOperator)\n .setConfig(config)\n .from(METHOD_TO_QUERY.filter);\n return this.condition;\n }\n\n update(attribute: Record<string, string>): IQueryBuilder {\n for (const [key, value] of Object.entries(attribute)) {\n this.condition.setKey(key).from(METHOD_TO_QUERY.update);\n this.condition.eq(value);\n }\n return this;\n }\n\n consistentRead(consistentRead: boolean): IQueryBuilder {\n this.command.ConsistentRead = consistentRead;\n return this;\n }\n\n count(): IQueryBuilder {\n this.command.Select = AGGREGATE_FUNCTIONS.COUNT;\n return this;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport DynamoDbClientService from './dynamoDbClient.service';\nimport QueryBuilderService from './queryBuilder.service';\n\nimport {\n AGGREGATE_FUNCTIONS,\n DYNAMODB_OPERATORS,\n FILTER_OPERATOR_MAP,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindPagination,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas/crudSchema';\nimport {\n findIdColumnName,\n getPrimaryKeyColumns,\n getTableName,\n} from '../../../helpers/tableHelper';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nimport {\n QueryCommandInput,\n QueryCommandOutput,\n ScanCommandInput,\n} from '@aws-sdk/lib-dynamodb';\n\nexport class DynamoDbCrudService<T> implements ICrudService<T> {\n private dynamoDbClientService: DynamoDbClientService;\n\n constructor(private tableSchema: typeof CrudSchema) {\n this.dynamoDbClientService = new DynamoDbClientService(this.tableName);\n }\n\n private get tableName(): string {\n return getTableName(this.tableSchema.table);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n private get defaultPrimaryKeys(): string[] {\n return getPrimaryKeyColumns(this.tableSchema.columns);\n }\n\n async create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const response =\n await this.dynamoDbClientService.batchWrittenPut(data);\n return {\n unprocessedItems: response.UnprocessedItems ?? [],\n };\n } else {\n await this.dynamoDbClientService.put(data as Record<string, any>);\n return data as T;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars\n runQuery(queryCommand: any): Promise<any> {\n throw new Error('Method not implemented.');\n }\n\n find(options: IFindOptions = {}): Promise<any> {\n const query = new QueryBuilderService(options.useScan);\n\n if (options.index?.indexName)\n query.usingIndex(options.index?.indexName);\n\n this.applySorting(query, options.sorting, options.index?.indexName);\n this.applyPagination(query, options.pagination);\n\n if (options.consistentRead)\n query.consistentRead(options.consistentRead);\n\n if (options.fields) query.projection(options.fields);\n\n this.applyFilters(query, options);\n\n if (options.aggregateFunction === AGGREGATE_FUNCTIONS.COUNT)\n query.count();\n\n return this.fetchResults(\n query.get(),\n options.pagination?.limit,\n options.useScan,\n ).then((res: any) => {\n const pagination: IFindPagination = {};\n if (res.lastEvaluatedKey) pagination.from = res.lastEvaluatedKey;\n if (options.pagination?.limit)\n pagination.limit = options.pagination?.limit;\n return {\n items: res.items,\n pagination,\n count: res.count,\n };\n });\n }\n\n async fetchResults(\n command: ScanCommandInput | QueryCommandInput,\n limit: number = 100,\n useScan: boolean = false,\n ): Promise<unknown> {\n let results: unknown[] = [];\n let lastEvaluatedKey: Record<string, unknown> = {};\n let rowsCount = 0;\n\n do {\n const result = await this.fetchBatch(\n command,\n useScan,\n lastEvaluatedKey,\n );\n const rows = result.Items ?? [];\n results = results.concat(rows);\n lastEvaluatedKey = result.LastEvaluatedKey ?? {};\n rowsCount += result.Count || rows.length;\n } while (rowsCount < limit && this.isNotEmptyObject(lastEvaluatedKey));\n\n const encryptedLastEvaluatedKey = this.isNotEmptyObject(\n lastEvaluatedKey,\n )\n ? this.encryptPaginationKey(lastEvaluatedKey)\n : null;\n return {\n items: results,\n lastEvaluatedKey: encryptedLastEvaluatedKey,\n count: rowsCount,\n };\n }\n\n async fetchBatch(\n command: ScanCommandInput | QueryCommandInput,\n useScan: boolean,\n lastEvaluatedKey: Record<string, unknown>,\n ): Promise<Partial<QueryCommandOutput>> {\n if (this.isNotEmptyObject(lastEvaluatedKey))\n command.ExclusiveStartKey = lastEvaluatedKey;\n\n const result = await (useScan\n ? this.dynamoDbClientService.scan(command)\n : this.dynamoDbClientService.query(command));\n\n if (command.Select !== AGGREGATE_FUNCTIONS.COUNT) {\n command.Limit = (command.Limit ?? 0) - (result.Items?.length ?? 0);\n }\n\n return result;\n }\n\n applyPagination(\n query: QueryBuilderService,\n pagination: IFindPagination | undefined,\n ) {\n if (pagination?.limit) query.limit(pagination.limit);\n if (pagination?.from)\n query.startKey(this.decryptPaginationKey(pagination.from));\n }\n\n async findAll(\n options: IFindOptions = {},\n allResults: any[] = [],\n rowsCount: number = 0,\n ): Promise<any> {\n const { items, pagination, count } = await this.find(options);\n allResults.push(...items);\n rowsCount += count;\n\n if (pagination?.from)\n await this.findAll({ ...options, pagination }, allResults);\n\n return {\n items: allResults,\n pagination: null,\n count: rowsCount,\n };\n }\n\n async findCount(options: IFindOptions = {}): Promise<number> {\n const findOptions = {\n ...options,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n };\n if (options.pagination?.from) {\n return this.find(findOptions).then((res) => res.count);\n } else {\n return this.findAll(findOptions).then((res) => res.count);\n }\n }\n\n buildFindItemQuery(options: IFindOptions): QueryBuilderService {\n const query = new QueryBuilderService();\n\n if (options.index?.indexName) query.usingIndex(options.index.indexName);\n\n this.applyFilters(query, options);\n query.projection(options.fields);\n query.limit(1);\n\n return query;\n }\n\n findItem(options: IFindOptions): Promise<T | null> {\n const query = this.buildFindItemQuery(options);\n return this.dynamoDbClientService.query(query.get()).then((result) => {\n if (result.Items?.length) return result.Items[0] as T;\n if (options.throwErrorIfNull) throw new Error('NOT_FOUND');\n return null;\n });\n }\n\n applyWhereFilter(query: QueryBuilderService, filter: IFilter) {\n const operator =\n FILTER_OPERATOR_MAP[\n filter.operator?.toUpperCase() ?? DYNAMODB_OPERATORS.EQUAL\n ];\n (query.where(filter.attribute) as any)[operator](filter.value);\n }\n\n applyFilterFilter(\n query: QueryBuilderService,\n filter: IFilter,\n logicOperator: string = 'AND',\n config?: any,\n ) {\n const operator =\n FILTER_OPERATOR_MAP[\n filter.operator?.toUpperCase() ?? DYNAMODB_OPERATORS.EQUAL\n ];\n (query.filter(filter.attribute, logicOperator, config) as any)[\n operator\n ](filter.value);\n }\n\n applyFilters(query: QueryBuilderService, options: IFindOptions) {\n if (Array.isArray(options.filters)) {\n this.applySimpleFilters(query, options);\n } else {\n this.applyCompoundFilters(query, options);\n }\n }\n\n applySimpleFilters(query: QueryBuilderService, options: IFindOptions) {\n const queryIndexColumns = options.index?.columns ?? [];\n const defaultWhereProperties = this.defaultPrimaryKeys;\n\n const whereProperties: string[] = queryIndexColumns?.length\n ? queryIndexColumns\n : defaultWhereProperties;\n const filters = options.filters as IFilter[];\n filters.forEach((filter: IFilter) => {\n const isWhereProperty = whereProperties.includes(filter.attribute);\n isWhereProperty && !options.useScan\n ? this.applyWhereFilter(query, filter)\n : this.applyFilterFilter(query, filter);\n });\n }\n\n applyCompoundFilters(query: QueryBuilderService, options: IFindOptions) {\n if (!options.filters) return;\n this.buildFilterExpression(query, options);\n }\n\n buildFilterExpression(\n query: QueryBuilderService,\n options: IFindOptions,\n parentKey?: string,\n ) {\n const compositeFilters = options.filters as ICompositeFilter;\n const queryIndexColumns = options.index?.columns || [];\n const defaultWhereProperties = this.defaultPrimaryKeys;\n\n const whereProperties = queryIndexColumns?.length\n ? queryIndexColumns\n : defaultWhereProperties;\n\n for (const [key, value] of Object.entries(compositeFilters)) {\n value.forEach(\n (filter: IFilter | ICompositeFilter, index: number) => {\n const isCompositeFilter = 'OR' in filter || 'AND' in filter;\n if (isCompositeFilter) {\n const newOptions = {\n ...options,\n filters: filter,\n };\n this.buildFilterExpression(query, newOptions, key);\n } else {\n const simpleFilter = filter as IFilter;\n const isWhereProperty = whereProperties.includes(\n simpleFilter.attribute,\n );\n let config;\n if (parentKey) {\n config = {\n parentKey,\n openExpression: index === 0,\n closeExpression: index === value.length - 1,\n };\n }\n\n isWhereProperty && !options.useScan\n ? this.applyWhereFilter(query, simpleFilter)\n : this.applyFilterFilter(\n query,\n simpleFilter,\n key,\n config,\n );\n }\n },\n );\n }\n }\n\n applySorting(query: QueryBuilderService, sorting: any, sortIndex?: string) {\n if (sorting?.length) {\n if (sortIndex) query.usingIndex(sortIndex);\n if (sorting[0].direction === 'DESC') {\n query.descending();\n } else {\n query.ascending();\n }\n }\n }\n\n isNotEmptyObject(obj: unknown) {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n Object.keys(obj).length > 0\n );\n }\n\n encryptPaginationKey(key: Record<string, any>): string {\n const jsonKey = JSON.stringify(key);\n return Buffer.from(jsonKey).toString('base64');\n }\n\n decryptPaginationKey(encodedKey: string): Record<string, any> {\n const decodedKey = Buffer.from(encodedKey, 'base64').toString('utf-8');\n return JSON.parse(decodedKey);\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n { replace = false },\n ): Promise<any> {\n const savedRecord = await this.findItem({\n filters: filters as IFilter[],\n });\n\n if (replace) {\n //delete all attributes of savedRecord except those that as marked as primary columns in the schema\n }\n\n const newData: any = {\n ...savedRecord,\n ...data,\n };\n\n await this.dynamoDbClientService.put(newData);\n return newData;\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ) {\n if (options?.filterGroups) {\n await this.dynamoDbClientService.batchRemove(\n filters as IFilter[][],\n );\n } else {\n const key = (filters as IFilter[]).reduce((obj: any, item: any) => {\n const property = item.attribute;\n obj[property] = item.value;\n return obj;\n }, {});\n await this.dynamoDbClientService.remove(key);\n }\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n try {\n return await this.#prepareAndExecuteUpdateExpression(\n filters,\n actions,\n options,\n );\n } catch (error: any) {\n PersistenceErrorWrapper(error);\n }\n }\n\n async #prepareAndExecuteUpdateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ) {\n const queryObject = this.#buildUpdateExpressionQuery({ filters }).get();\n const primaryKeys = this.defaultPrimaryKeys;\n\n const keyObject: any = this.#getKeyObjectForUpdateExpression(\n queryObject,\n primaryKeys,\n );\n\n const updateExpressions: any = [];\n\n Object.keys(actions).forEach((action: string) => {\n const actionUpdateExpression =\n this.#extractUpdateExpressionAttributesAndNames(\n actions,\n action,\n );\n updateExpressions.push(actionUpdateExpression);\n });\n\n const dbParams = {\n UpdateExpression: updateExpressions.join(' '),\n ...this.#getUpdateExpressionOptions(options),\n };\n\n const { ExpressionAttributeValues, ExpressionAttributeNames } =\n queryObject;\n if (Object.keys(ExpressionAttributeValues).length > 0) {\n dbParams['ExpressionAttributeValues'] = {\n ...ExpressionAttributeValues,\n ...dbParams.ExpressionAttributeValues,\n };\n }\n\n if (Object.keys(ExpressionAttributeNames).length > 0) {\n dbParams['ExpressionAttributeNames'] = {\n ...ExpressionAttributeNames,\n ...dbParams.ExpressionAttributeNames,\n };\n }\n if (queryObject.FilterExpression)\n dbParams['ConditionExpression'] = queryObject.FilterExpression;\n\n return this.dynamoDbClientService.updateExpressions(\n keyObject,\n dbParams,\n );\n }\n\n #buildUpdateExpressionQuery(options: IFindOptions): QueryBuilderService {\n const query = new QueryBuilderService();\n\n if (options.index?.indexName) query.usingIndex(options.index.indexName);\n this.applyFilters(query, options);\n\n return query;\n }\n\n #getKeyObjectForUpdateExpression(queryObject: any, primaryKeys: any) {\n const keyObject: any = {};\n\n Object.keys(queryObject.ExpressionAttributeNames).forEach(\n (attribute) => {\n const sanitizedAttribute = attribute\n .replace('#', '')\n .replace('1', '');\n if (primaryKeys.includes(sanitizedAttribute)) {\n const valueName = `:${sanitizedAttribute}1`;\n keyObject[sanitizedAttribute] =\n queryObject.ExpressionAttributeValues[valueName];\n delete queryObject.ExpressionAttributeValues[valueName];\n delete queryObject.ExpressionAttributeNames[attribute];\n }\n },\n );\n\n return keyObject;\n }\n\n #getUpdateExpressionOptions(options: IUpdateExpressionsOptions) {\n const updateExprOptions: any = {\n ReturnValues: options.returnValues,\n };\n\n if (options.expressionAttributeNames)\n updateExprOptions.ExpressionAttributeNames =\n options.expressionAttributeNames;\n if (options.expressionAttributeValues)\n updateExprOptions.ExpressionAttributeValues =\n options.expressionAttributeValues;\n\n return updateExprOptions;\n }\n\n #extractUpdateExpressionAttributesAndNames(\n actions: any,\n actionType: string,\n ) {\n const actionUpdateExpressions: any = [];\n\n actions[actionType].forEach((action: any) => {\n switch (actionType) {\n case DYNAMO_DB_UPDATE_ACTIONS.DELETE:\n case DYNAMO_DB_UPDATE_ACTIONS.REMOVE:\n actionUpdateExpressions.push(`${action.path}`);\n break;\n\n case DYNAMO_DB_UPDATE_ACTIONS.ADD:\n case DYNAMO_DB_UPDATE_ACTIONS.SET:\n {\n let operator = '';\n if (actionType == DYNAMO_DB_UPDATE_ACTIONS.SET)\n operator = '=';\n actionUpdateExpressions.push(\n `${action.path} ${operator}${action.value}`,\n );\n }\n break;\n }\n });\n\n const actionUpdateExpression = `${actionType} ${actionUpdateExpressions.join(\n ', ',\n )}`;\n\n return actionUpdateExpression;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n runRawQuery(query: string, params: any[]): Promise<any> {\n throw new Error('Method not implemented.');\n }\n}\n"]}
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -178,4 +178,4 @@ declare function buildSort(column: string, direction?: string): ISorting;
|
|
|
178
178
|
|
|
179
179
|
declare function getDbPool(poolConfig?: PoolConfig): Pool | undefined;
|
|
180
180
|
|
|
181
|
-
export { AggregateFunction, CrudSchema, CrudService, FilterInput, ICrudService, IFilter, IFindOptions, IFindPagination, ISorting, SortDirection, buildFilter, buildQueryIndex, buildSort, getDbPool };
|
|
181
|
+
export { type AggregateFunction, CrudSchema, CrudService, type FilterInput, type ICrudService, type IFilter, type IFindOptions, type IFindPagination, type ISorting, type SortDirection, buildFilter, buildQueryIndex, buildSort, getDbPool };
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FILTER_LOGIC_OPERATORS, CONNECTION_CLOSING_MODES,
|
|
1
|
+
import { FILTER_LOGIC_OPERATORS, CONNECTION_CLOSING_MODES, __spreadValues, __objRest, isMultiPlatformMode, __spreadProps } from './chunk-2OYWEFNZ.mjs';
|
|
2
2
|
import { Pool } from 'pg';
|
|
3
3
|
|
|
4
4
|
// src/helpers/crudHelpers.ts
|
|
@@ -30,10 +30,10 @@ var CrudFactory = class {
|
|
|
30
30
|
const isMultiPlatformMode2 = ((_a = process.env.PLATFORM_TYPE) == null ? void 0 : _a.toLowerCase()) === "container";
|
|
31
31
|
let DatabaseCrudService;
|
|
32
32
|
if (isMultiPlatformMode2) {
|
|
33
|
-
const module = await import('./postgreSqlCrud.service-
|
|
33
|
+
const module = await import('./postgreSqlCrud.service-AD2CHR2Z.mjs');
|
|
34
34
|
DatabaseCrudService = module.PostgreSqlCrudService;
|
|
35
35
|
} else {
|
|
36
|
-
const module = await import('./dynamoDbCrud.service-
|
|
36
|
+
const module = await import('./dynamoDbCrud.service-NRSGRPDQ.mjs');
|
|
37
37
|
DatabaseCrudService = module.DynamoDbCrudService;
|
|
38
38
|
}
|
|
39
39
|
return new DatabaseCrudService(crudSchema, pool);
|
|
@@ -96,7 +96,7 @@ var CrudService = class {
|
|
|
96
96
|
);
|
|
97
97
|
}
|
|
98
98
|
findAll(options) {
|
|
99
|
-
const _a = options, findAllOptions = __objRest(_a, ["pagination"]);
|
|
99
|
+
const _a = options, { pagination } = _a, findAllOptions = __objRest(_a, ["pagination"]);
|
|
100
100
|
return this.getCrudServiceInstance().then(
|
|
101
101
|
(crudService) => crudService.findAll(findAllOptions)
|
|
102
102
|
);
|
|
@@ -143,8 +143,7 @@ Object.values(
|
|
|
143
143
|
// src/types/connectionClosingMode.type.ts
|
|
144
144
|
Object.values(CONNECTION_CLOSING_MODES);
|
|
145
145
|
function getDbPool(poolConfig) {
|
|
146
|
-
if (!isMultiPlatformMode())
|
|
147
|
-
return void 0;
|
|
146
|
+
if (!isMultiPlatformMode()) return void 0;
|
|
148
147
|
const pool = new Pool(__spreadProps(__spreadValues({}, poolConfig), {
|
|
149
148
|
connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING
|
|
150
149
|
}));
|
|
@@ -152,5 +151,5 @@ function getDbPool(poolConfig) {
|
|
|
152
151
|
}
|
|
153
152
|
|
|
154
153
|
export { CrudSchema, crud_service_default as CrudService, buildFilter, buildQueryIndex, buildSort, getDbPool };
|
|
155
|
-
//# sourceMappingURL=
|
|
154
|
+
//# sourceMappingURL=index.mjs.map
|
|
156
155
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/helpers/crudHelpers.ts","../../src/services/crudFactory.service.ts","../../src/services/crud.service.ts","../../src/schemas/crudSchema.ts","../../src/types/filterLogicOperator.type.ts","../../src/types/connectionClosingMode.type.ts","../../src/services/dbPool.service.ts"],"names":["isMultiPlatformMode"],"mappings":"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","sourcesContent":["import { ISorting } from '../interfaces';\nimport { SortDirection } from '../types';\nimport { SORT_DIRECTIONS } from '../utils/constants';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n) {\n return {\n attribute,\n operator,\n value,\n relativePath,\n };\n}\n\nexport function buildQueryIndex(indexName: string, columns: string[]) {\n return {\n indexName,\n columns,\n };\n}\n\nexport function buildSort(\n column: string,\n direction: string = SORT_DIRECTIONS.ASC,\n): ISorting {\n return {\n column,\n direction: direction as SortDirection,\n };\n}\n","import { Pool } from 'pg';\nimport { ICrudService } from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { DbPool } from '../types';\nexport class CrudFactory {\n static async databaseClientService<T>(\n crudSchema: typeof CrudSchema,\n pool?: Pool,\n ): Promise<ICrudService<T>> {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n let DatabaseCrudService: new <T>(\n schema: typeof CrudSchema,\n poolClient?: DbPool,\n ) => ICrudService<T>;\n\n if (isMultiPlatformMode) {\n const module = await import(\n './cruds/postgresql/postgreSqlCrud.service'\n );\n DatabaseCrudService = module.PostgreSqlCrudService;\n } else {\n const module = await import(\n './cruds/dynamodb/dynamoDbCrud.service'\n );\n DatabaseCrudService = module.DynamoDbCrudService;\n }\n\n return new DatabaseCrudService(crudSchema, pool);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\nimport {\n buildQueryIndex,\n buildFilter,\n buildSort,\n} from '../helpers/crudHelpers';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n IFilter,\n IFindOptions,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { CrudFactory } from './crudFactory.service';\n\nclass CrudService<T> {\n private crudSchema: typeof CrudSchema;\n\n constructor(\n crudSchema: typeof CrudSchema,\n private pool?: Pool,\n ) {\n this.crudSchema = crudSchema;\n }\n\n private async getCrudServiceInstance() {\n const crudService = await CrudFactory.databaseClientService(\n this.crudSchema,\n this.pool,\n );\n return crudService;\n }\n\n private getDefaultValue(columnName: string): any {\n const column = this.crudSchema.columns[columnName];\n return column ? column.default : undefined;\n }\n\n private setDefaultValues(data: any) {\n const defaultValues: { [key: string]: any } = {};\n const columns = this.crudSchema.columns;\n\n for (const columnName in columns) {\n const missingColumnValue = !(columnName in data);\n const columnDefaultValue = this.getDefaultValue(columnName);\n if (missingColumnValue && columnDefaultValue) {\n defaultValues[columnName] = columnDefaultValue;\n }\n }\n\n return { ...defaultValues, ...data };\n }\n\n create(data: T | T[]): Promise<unknown | ICreateMultipleResponse> {\n const processedData = Array.isArray(data)\n ? data.map(this.setDefaultValues.bind(this))\n : this.setDefaultValues(data);\n\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.create(processedData),\n );\n }\n\n find(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.find(options),\n );\n }\n\n findItem(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findItem(options),\n );\n }\n\n update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.update(filters, data, {}),\n );\n }\n\n remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions = {},\n ): Promise<void> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.remove(filters, options),\n );\n }\n\n findAll(options: IFindOptions) {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const { pagination, ...findAllOptions } = options;\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findAll(findAllOptions),\n );\n }\n\n findCount(findCountOptions: IFindOptions): Promise<number> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findCount(findCountOptions),\n );\n }\n\n buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n ) {\n return buildFilter(attribute, value, operator, relativePath);\n }\n\n buildQueryIndex(indexName: string, columns: string[]) {\n return buildQueryIndex(indexName, columns);\n }\n\n buildSort(column: string, direction: string) {\n return buildSort(column, direction);\n }\n\n updateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options?: IUpdateExpressionsOptions,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.updateExpressions(filters, actions, options),\n );\n }\n\n runRawQuery(query: string, params: any[]) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.runRawQuery(query, params),\n );\n }\n}\n\nexport default CrudService;\n","import { PoolClient } from 'pg';\nimport { ITableName, ITableColumns } from '../interfaces';\n\nexport class CrudSchema {\n static table: string | ITableName;\n static columns: ITableColumns;\n static usePool?: boolean = false;\n static schema: string | null = null;\n static poolClient?: PoolClient;\n static isTemporalTable: boolean = false;\n}\n","import { FILTER_LOGIC_OPERATORS } from '../utils/constants';\n\nconst VALID_FILTER_LOGIC_OPERATORS: FILTER_LOGIC_OPERATORS[] = Object.values(\n FILTER_LOGIC_OPERATORS,\n);\n\nexport type FilterLogicOperator = (typeof VALID_FILTER_LOGIC_OPERATORS)[number];\n","import { CONNECTION_CLOSING_MODES } from '../utils/constants';\n\nconst VALID_CONNECTION_CLOSING_MODES: CONNECTION_CLOSING_MODES[] =\n Object.values(CONNECTION_CLOSING_MODES);\n\nexport type ConnectionClosingMode =\n (typeof VALID_CONNECTION_CLOSING_MODES)[number];\n","import { Pool, PoolConfig } from 'pg';\nimport { isMultiPlatformMode } from '../utils/constants';\n\nexport function getDbPool(poolConfig?: PoolConfig) {\n if (!isMultiPlatformMode()) return undefined;\n\n const pool = new Pool({\n ...poolConfig,\n connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,\n });\n return pool;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/crudHelpers.ts","../../src/services/crudFactory.service.ts","../../src/services/crud.service.ts","../../src/schemas/crudSchema.ts","../../src/types/filterLogicOperator.type.ts","../../src/types/connectionClosingMode.type.ts","../../src/services/dbPool.service.ts"],"names":["isMultiPlatformMode"],"mappings":";;;;AAKO,SAAS,YACZ,SAAA,EACA,KAAA,EACA,QAAA,GAAW,OAAA,EACX,eAAe,MAAA,EACjB;AACE,EAAA,OAAO;AAAA,IACH,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAmB;AAClE,EAAA,OAAO;AAAA,IACH,SAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,SAAS,SAAA,CACZ,QACA,SAAA,GAAA,KAAA,YACQ;AACR,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;AC9BO,IAAM,cAAN,MAAkB;AAAA,EACrB,aAAa,qBAAA,CACT,UAAA,EACA,IAAA,EACwB;AARhC,IAAA,IAAA,EAAA;AASQ,IAAA,MAAMA,oBAAAA,GAAAA,CAAAA,CACF,EAAA,GAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,KAAZ,mBAA2B,WAAA,EAAA,MAAkB,WAAA;AAEjD,IAAA,IAAI,mBAAA;AAKJ,IAAA,IAAIA,oBAAAA,EAAqB;AACrB,MAAA,MAAM,MAAA,GAAS,MAAM,OACjB,uCACJ,CAAA;AACA,MAAA,mBAAA,GAAsB,MAAA,CAAO,qBAAA;AAAA,KACjC,MAAO;AACH,MAAA,MAAM,MAAA,GAAS,MAAM,OACjB,qCACJ,CAAA;AACA,MAAA,mBAAA,GAAsB,MAAA,CAAO,mBAAA;AAAA;AAGjC,IAAA,OAAO,IAAI,mBAAA,CAAoB,UAAA,EAAY,IAAI,CAAA;AAAA;AAEvD,CAAA;;;ACZA,IAAM,cAAN,MAAqB;AAAA,EAGjB,WAAA,CACI,YACQ,IAAA,EACV;AADU,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAER,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA;AACtB,EAEA,MAAc,sBAAA,GAAyB;AACnC,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,CAAY,qBAAA;AAAA,MAClC,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACT;AACA,IAAA,OAAO,WAAA;AAAA;AACX,EAEQ,gBAAgB,UAAA,EAAyB;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AACjD,IAAA,OAAO,MAAA,GAAS,OAAO,OAAA,GAAU,MAAA;AAAA;AACrC,EAEQ,iBAAiB,IAAA,EAAW;AAChC,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,CAAW,OAAA;AAEhC,IAAA,KAAA,MAAW,cAAc,OAAA,EAAS;AAC9B,MAAA,MAAM,kBAAA,GAAqB,EAAE,UAAA,IAAc,IAAA,CAAA;AAC3C,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAC1D,MAAA,IAAI,sBAAsB,kBAAA,EAAoB;AAC1C,QAAA,aAAA,CAAc,UAAU,CAAA,GAAI,kBAAA;AAAA;AAChC;AAGJ,IAAA,OAAO,kCAAK,aAAA,CAAA,EAAkB,IAAA,CAAA;AAAA;AAClC,EAEA,OAAO,IAAA,EAA2D;AAC9D,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,IAAI,IAClC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,KAAK,IAAI,CAAC,CAAA,GACzC,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAEhC,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,MAAA,CAAO,aAAa;AAAA,KACpC;AAAA;AACJ,EAEA,KAAK,OAAA,EAAuB;AACxB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,IAAA,CAAK,OAAO;AAAA,KAC5B;AAAA;AACJ,EAEA,SAAS,OAAA,EAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,QAAA,CAAS,OAAO;AAAA,KAChC;AAAA;AACJ,EAEA,MAAA,CACI,SACA,IAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,OAAO,OAAA,EAAS,IAAA,EAAM,EAAE;AAAA,KACxC;AAAA;AACJ,EAEA,MAAA,CACI,OAAA,EACA,OAAA,GAA0B,EAAC,EACd;AACb,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,MAAA,CAAO,SAAS,OAAO;AAAA,KACvC;AAAA;AACJ,EAEA,QAAQ,OAAA,EAAuB;AAE3B,IAAA,MAA0C,cAAlC,EAAA,UAAA,EAnGhB,GAmGkD,EAAA,EAAnB,cAAA,GAAA,SAAA,CAAmB,IAAnB,CAAf,YAAA,CAAA,CAAA;AACR,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,OAAA,CAAQ,cAAc;AAAA,KACtC;AAAA;AACJ,EAEA,UAAU,gBAAA,EAAiD;AACvD,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,SAAA,CAAU,gBAAgB;AAAA,KAC1C;AAAA;AACJ,EAEA,YACI,SAAA,EACA,KAAA,EACA,QAAA,GAAW,OAAA,EACX,eAAe,MAAA,EACjB;AACE,IAAA,OAAO,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,YAAY,CAAA;AAAA;AAC/D,EAEA,eAAA,CAAgB,WAAmB,OAAA,EAAmB;AAClD,IAAA,OAAO,eAAA,CAAgB,WAAW,OAAO,CAAA;AAAA;AAC7C,EAEA,SAAA,CAAU,QAAgB,SAAA,EAAmB;AACzC,IAAA,OAAO,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA;AACtC,EAEA,gBAAA,CACI,OAAA,EACA,OAAA,EACA,OAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,iBAAA,CAAkB,OAAA,EAAS,SAAS,OAAO;AAAA,KAC3D;AAAA;AACJ,EAEA,WAAA,CAAY,OAAe,MAAA,EAAe;AACtC,IAAA,OAAO,IAAA,CAAK,wBAAuB,CAAE,IAAA;AAAA,MAAK,CAAC,WAAA,KACvC,WAAA,CAAY,WAAA,CAAY,OAAO,MAAM;AAAA,KACzC;AAAA;AAER,CAAA;AAEA,IAAO,oBAAA,GAAQ;;;AC9IR,IAAM,aAAN,MAAiB;AAOxB;AAPa,UAAA,CAGF,OAAA,GAAoB,KAAA;AAHlB,UAAA,CAIF,MAAA,GAAwB,IAAA;AAJtB,UAAA,CAMF,eAAA,GAA2B,KAAA;;;ACPyB,MAAA,CAAO,MAAA;AAAA,EAClE;AACJ;;;ACDI,MAAA,CAAO,MAAA,CAAO,wBAAwB;ACAnC,SAAS,UAAU,UAAA,EAAyB;AAC/C,EAAA,IAAI,CAAC,mBAAA,EAAoB,EAAG,OAAO,MAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,aAAA,CAAA,cAAA,CAAA,EAAA,EACf,UAAA,CAAA,EADe;AAAA,IAElB,gBAAA,EAAkB,QAAQ,GAAA,CAAI;AAAA,GAClC,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACX","file":"index.mjs","sourcesContent":["import { ISorting } from '../interfaces';\nimport { SortDirection } from '../types';\nimport { SORT_DIRECTIONS } from '../utils/constants';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n) {\n return {\n attribute,\n operator,\n value,\n relativePath,\n };\n}\n\nexport function buildQueryIndex(indexName: string, columns: string[]) {\n return {\n indexName,\n columns,\n };\n}\n\nexport function buildSort(\n column: string,\n direction: string = SORT_DIRECTIONS.ASC,\n): ISorting {\n return {\n column,\n direction: direction as SortDirection,\n };\n}\n","import { Pool } from 'pg';\nimport { ICrudService } from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { DbPool } from '../types';\nexport class CrudFactory {\n static async databaseClientService<T>(\n crudSchema: typeof CrudSchema,\n pool?: Pool,\n ): Promise<ICrudService<T>> {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n let DatabaseCrudService: new <T>(\n schema: typeof CrudSchema,\n poolClient?: DbPool,\n ) => ICrudService<T>;\n\n if (isMultiPlatformMode) {\n const module = await import(\n './cruds/postgresql/postgreSqlCrud.service'\n );\n DatabaseCrudService = module.PostgreSqlCrudService;\n } else {\n const module = await import(\n './cruds/dynamodb/dynamoDbCrud.service'\n );\n DatabaseCrudService = module.DynamoDbCrudService;\n }\n\n return new DatabaseCrudService(crudSchema, pool);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Pool } from 'pg';\nimport {\n buildQueryIndex,\n buildFilter,\n buildSort,\n} from '../helpers/crudHelpers';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n IFilter,\n IFindOptions,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { CrudFactory } from './crudFactory.service';\n\nclass CrudService<T> {\n private crudSchema: typeof CrudSchema;\n\n constructor(\n crudSchema: typeof CrudSchema,\n private pool?: Pool,\n ) {\n this.crudSchema = crudSchema;\n }\n\n private async getCrudServiceInstance() {\n const crudService = await CrudFactory.databaseClientService(\n this.crudSchema,\n this.pool,\n );\n return crudService;\n }\n\n private getDefaultValue(columnName: string): any {\n const column = this.crudSchema.columns[columnName];\n return column ? column.default : undefined;\n }\n\n private setDefaultValues(data: any) {\n const defaultValues: { [key: string]: any } = {};\n const columns = this.crudSchema.columns;\n\n for (const columnName in columns) {\n const missingColumnValue = !(columnName in data);\n const columnDefaultValue = this.getDefaultValue(columnName);\n if (missingColumnValue && columnDefaultValue) {\n defaultValues[columnName] = columnDefaultValue;\n }\n }\n\n return { ...defaultValues, ...data };\n }\n\n create(data: T | T[]): Promise<unknown | ICreateMultipleResponse> {\n const processedData = Array.isArray(data)\n ? data.map(this.setDefaultValues.bind(this))\n : this.setDefaultValues(data);\n\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.create(processedData),\n );\n }\n\n find(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.find(options),\n );\n }\n\n findItem(options: IFindOptions) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findItem(options),\n );\n }\n\n update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.update(filters, data, {}),\n );\n }\n\n remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions = {},\n ): Promise<void> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.remove(filters, options),\n );\n }\n\n findAll(options: IFindOptions) {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const { pagination, ...findAllOptions } = options;\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findAll(findAllOptions),\n );\n }\n\n findCount(findCountOptions: IFindOptions): Promise<number> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.findCount(findCountOptions),\n );\n }\n\n buildFilter(\n attribute: string,\n value: any,\n operator = 'EQUAL',\n relativePath = undefined,\n ) {\n return buildFilter(attribute, value, operator, relativePath);\n }\n\n buildQueryIndex(indexName: string, columns: string[]) {\n return buildQueryIndex(indexName, columns);\n }\n\n buildSort(column: string, direction: string) {\n return buildSort(column, direction);\n }\n\n updateExpression(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options?: IUpdateExpressionsOptions,\n ): Promise<T | null> {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.updateExpressions(filters, actions, options),\n );\n }\n\n runRawQuery(query: string, params: any[]) {\n return this.getCrudServiceInstance().then((crudService) =>\n crudService.runRawQuery(query, params),\n );\n }\n}\n\nexport default CrudService;\n","import { PoolClient } from 'pg';\nimport { ITableName, ITableColumns } from '../interfaces';\n\nexport class CrudSchema {\n static table: string | ITableName;\n static columns: ITableColumns;\n static usePool?: boolean = false;\n static schema: string | null = null;\n static poolClient?: PoolClient;\n static isTemporalTable: boolean = false;\n}\n","import { FILTER_LOGIC_OPERATORS } from '../utils/constants';\n\nconst VALID_FILTER_LOGIC_OPERATORS: FILTER_LOGIC_OPERATORS[] = Object.values(\n FILTER_LOGIC_OPERATORS,\n);\n\nexport type FilterLogicOperator = (typeof VALID_FILTER_LOGIC_OPERATORS)[number];\n","import { CONNECTION_CLOSING_MODES } from '../utils/constants';\n\nconst VALID_CONNECTION_CLOSING_MODES: CONNECTION_CLOSING_MODES[] =\n Object.values(CONNECTION_CLOSING_MODES);\n\nexport type ConnectionClosingMode =\n (typeof VALID_CONNECTION_CLOSING_MODES)[number];\n","import { Pool, PoolConfig } from 'pg';\nimport { isMultiPlatformMode } from '../utils/constants';\n\nexport function getDbPool(poolConfig?: PoolConfig) {\n if (!isMultiPlatformMode()) return undefined;\n\n const pool = new Pool({\n ...poolConfig,\n connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,\n });\n return pool;\n}\n"]}
|
package/dist/esm/{postgreSqlCrud.service-JGJELA6R.mjs → postgreSqlCrud.service-AD2CHR2Z.mjs}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { findIdColumnName, buildAggFunctionAlias, PersistenceErrorWrapper, getTableName } from './chunk-
|
|
2
|
-
import { __spreadValues, __spreadProps, DEFAULT_PG_SCHEMA, POSTGRES_FILTER_OPERATOR_MAP, DYNAMO_DB_UPDATE_ACTIONS } from './chunk-
|
|
1
|
+
import { findIdColumnName, buildAggFunctionAlias, PersistenceErrorWrapper, getTableName } from './chunk-2H6RO6ZL.mjs';
|
|
2
|
+
import { __spreadValues, __spreadProps, DEFAULT_PG_SCHEMA, POSTGRES_FILTER_OPERATOR_MAP, DYNAMO_DB_UPDATE_ACTIONS } from './chunk-2OYWEFNZ.mjs';
|
|
3
3
|
import format from 'pg-format';
|
|
4
4
|
import { Client } from 'pg';
|
|
5
5
|
|
|
@@ -208,8 +208,7 @@ var PostgresqlClientService = class extends QueryService {
|
|
|
208
208
|
}
|
|
209
209
|
formatValue(value) {
|
|
210
210
|
if (Array.isArray(value)) {
|
|
211
|
-
if (!(value == null ? void 0 : value.length))
|
|
212
|
-
return "{}";
|
|
211
|
+
if (!(value == null ? void 0 : value.length)) return "{}";
|
|
213
212
|
const isNumberArray = typeof value[0] === "number";
|
|
214
213
|
if (isNumberArray) {
|
|
215
214
|
return `{${value.join(",")}}`;
|
|
@@ -239,32 +238,27 @@ var PostgresqlClientService = class extends QueryService {
|
|
|
239
238
|
return isValidArrayFilters || isValidCompositeFilters;
|
|
240
239
|
}
|
|
241
240
|
replaceFilterTokensInQuery(query, filters) {
|
|
242
|
-
if (!filters)
|
|
243
|
-
return query;
|
|
241
|
+
if (!filters) return query;
|
|
244
242
|
if (this.isValidFiltersInput(filters)) {
|
|
245
243
|
const filterClause = this.buildFilterClause(filters);
|
|
246
244
|
return query.replace(/{{filters}}/g, filterClause);
|
|
247
245
|
}
|
|
248
246
|
}
|
|
249
247
|
addFiltersToQuery(query, filters) {
|
|
250
|
-
if (!filters)
|
|
251
|
-
return query;
|
|
248
|
+
if (!filters) return query;
|
|
252
249
|
if (this.isValidFiltersInput(filters))
|
|
253
250
|
query += ` WHERE ${this.buildFilterClause(filters)}`;
|
|
254
251
|
return query;
|
|
255
252
|
}
|
|
256
253
|
addOrderByToQuery(query, orderBy) {
|
|
257
|
-
if (orderBy)
|
|
258
|
-
query += ` ORDER BY ${this.buildOrderByClause(orderBy)}`;
|
|
254
|
+
if (orderBy) query += ` ORDER BY ${this.buildOrderByClause(orderBy)}`;
|
|
259
255
|
return query;
|
|
260
256
|
}
|
|
261
257
|
addPaginationToQuery(query, pagination) {
|
|
262
258
|
if (pagination) {
|
|
263
259
|
const { limit, from } = pagination;
|
|
264
|
-
if (limit)
|
|
265
|
-
|
|
266
|
-
if (from)
|
|
267
|
-
query += ` OFFSET ${from}`;
|
|
260
|
+
if (limit) query += ` LIMIT ${limit}`;
|
|
261
|
+
if (from) query += ` OFFSET ${from}`;
|
|
268
262
|
}
|
|
269
263
|
return query;
|
|
270
264
|
}
|
|
@@ -273,8 +267,7 @@ var PostgresqlClientService = class extends QueryService {
|
|
|
273
267
|
return `CAST(${aggregateFunction}(1) AS INTEGER) AS "${buildAggFunctionAlias(
|
|
274
268
|
aggregateFunction
|
|
275
269
|
)}"`;
|
|
276
|
-
if (!(fields == null ? void 0 : fields.length))
|
|
277
|
-
return "*";
|
|
270
|
+
if (!(fields == null ? void 0 : fields.length)) return "*";
|
|
278
271
|
return this.parseFields(fields).join(", ");
|
|
279
272
|
}
|
|
280
273
|
parseFields(fields) {
|
|
@@ -323,8 +316,7 @@ var PostgresqlClientService = class extends QueryService {
|
|
|
323
316
|
}
|
|
324
317
|
sanitizeValue(value) {
|
|
325
318
|
if (Array.isArray(value)) {
|
|
326
|
-
if (value.length === 0)
|
|
327
|
-
;
|
|
319
|
+
if (value.length === 0) ;
|
|
328
320
|
const formattedArray = value.map((item) => {
|
|
329
321
|
if (typeof item === "string") {
|
|
330
322
|
return `'${item}'`;
|
|
@@ -766,8 +758,7 @@ var PostgreSqlCrudService = class extends PostgresqlClientService {
|
|
|
766
758
|
const schemaColumns = Object.entries(this.tableSchema.columns);
|
|
767
759
|
schemaColumns.forEach(([key, value]) => {
|
|
768
760
|
if (value.type === "big_number") {
|
|
769
|
-
if (data[key])
|
|
770
|
-
data[key] = Number(data[key]);
|
|
761
|
+
if (data[key]) data[key] = Number(data[key]);
|
|
771
762
|
}
|
|
772
763
|
});
|
|
773
764
|
const resultItem = __spreadValues(__spreadValues({}, data), data.qvAttributes);
|
|
@@ -862,5 +853,5 @@ var PostgreSqlCrudService = class extends PostgresqlClientService {
|
|
|
862
853
|
};
|
|
863
854
|
|
|
864
855
|
export { PostgreSqlCrudService };
|
|
865
|
-
//# sourceMappingURL=
|
|
866
|
-
//# sourceMappingURL=postgreSqlCrud.service-
|
|
856
|
+
//# sourceMappingURL=postgreSqlCrud.service-AD2CHR2Z.mjs.map
|
|
857
|
+
//# sourceMappingURL=postgreSqlCrud.service-AD2CHR2Z.mjs.map
|