@qrvey/data-persistence 0.3.6-bundle → 0.3.6-bundle-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  return (mod && mod.__esModule) ? mod : { "default": mod };
6
6
  };
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- const pg_format_1 = __importDefault(require("pg-format"));
8
+ const pg_format_1 = require("@scaleleap/pg-format");
9
9
  const query_service_1 = __importDefault(require("./query.service"));
10
10
  const constants_1 = require("../../../utils/constants");
11
11
  const tableHelper_1 = require("../../../helpers/tableHelper");
@@ -37,24 +37,35 @@ class PostgresqlClientService extends query_service_1.default {
37
37
  return value;
38
38
  }
39
39
  }
40
- buildClause(operator, attribute, value) {
40
+ buildClause(operator, attribute, relativePath, value) {
41
41
  var _a;
42
- const formattedValue = pg_format_1.default.literal(value);
42
+ const formattedValue = (0, pg_format_1.literal)(value);
43
43
  operator = operator
44
44
  ? operator.toUpperCase()
45
45
  : constants_1.FilterOperator.EQUAL;
46
46
  const postgresOperator = constants_1.POSTGRES_FILTER_OPERATOR_MAP[operator];
47
47
  if (!postgresOperator)
48
48
  throw new Error(`Unsupported filter operator: ${operator}`);
49
- const filterProperty = pg_format_1.default.ident(attribute);
49
+ let property;
50
+ const filterProperty = (0, pg_format_1.ident)(attribute);
50
51
  const columnExists = !!this.crudSchema.columns[attribute];
51
52
  const columnType = columnExists && ((_a = this.crudSchema.columns[attribute]) === null || _a === void 0 ? void 0 : _a.type);
52
- const property = columnExists
53
- ? filterProperty
54
- : `("qvAttributes" ->> '${attribute}')`;
53
+ if (relativePath != undefined) {
54
+ const attributePath = relativePath.split('.').join(',');
55
+ property = `("${attribute}" #> '{${attributePath}}')`;
56
+ if (value != null) {
57
+ const comparisonValueType = this.getValueTypeAsPostgresDefinition(value);
58
+ property += `::${comparisonValueType}`;
59
+ }
60
+ }
61
+ else {
62
+ property = columnExists
63
+ ? filterProperty
64
+ : `("qvAttributes" ->> '${attribute}')`;
65
+ }
55
66
  if (operator === constants_1.FilterOperator.IN) {
56
67
  const formattedValues = Array.isArray(value)
57
- ? value.map(pg_format_1.default.literal)
68
+ ? value.map(pg_format_1.literal)
58
69
  : [formattedValue];
59
70
  return `${property} ${postgresOperator} (${formattedValues.join(', ')})`;
60
71
  }
@@ -65,7 +76,7 @@ class PostgresqlClientService extends query_service_1.default {
65
76
  * ? Additional filter to avoid error when column accepts null values.
66
77
  */
67
78
  if (operator === constants_1.FilterOperator.NOT_EQUAL && value !== null) {
68
- return `(${property} ${postgresOperator} ${pg_format_1.default.literal(value)} OR ${property} IS NULL)`;
79
+ return `(${property} ${postgresOperator} ${(0, pg_format_1.literal)(value)} OR ${property} IS NULL)`;
69
80
  }
70
81
  if (operator === constants_1.FilterOperator.NOT_EXIST ||
71
82
  operator === constants_1.FilterOperator.EXIST) {
@@ -87,12 +98,12 @@ class PostgresqlClientService extends query_service_1.default {
87
98
  return filterString;
88
99
  }
89
100
  const wildcardValue = this.getWildcardValue(operator, value);
90
- return `${property} ${postgresOperator} ${pg_format_1.default.literal(wildcardValue)}`;
101
+ return `${property} ${postgresOperator} ${(0, pg_format_1.literal)(wildcardValue)}`;
91
102
  }
92
103
  buildFilterClause(filters, logicOperator) {
93
104
  if (Array.isArray(filters)) {
94
105
  const filterClauses = filters.map((filter) => {
95
- return this.buildClause(filter.operator, filter.attribute, filter.value);
106
+ return this.buildClause(filter.operator, filter.attribute, filter.relativePath, filter.value);
96
107
  });
97
108
  return filterClauses.join(` ${logicOperator !== null && logicOperator !== void 0 ? logicOperator : constants_1.FILTER_LOGIC_OPERATORS.AND} `);
98
109
  }
@@ -119,7 +130,7 @@ class PostgresqlClientService extends query_service_1.default {
119
130
  clause = `(${this.buildQueryByClause(filter)})`;
120
131
  }
121
132
  else {
122
- clause = this.buildClause(filter.operator, filter.attribute, filter.value);
133
+ clause = this.buildClause(filter.operator, filter.attribute, filter.relativePath, filter.value);
123
134
  }
124
135
  filterClauses += `${clause} ${key} `;
125
136
  });
@@ -130,7 +141,7 @@ class PostgresqlClientService extends query_service_1.default {
130
141
  return filterClauses;
131
142
  }
132
143
  formatOrderByItem(sort) {
133
- return `${pg_format_1.default.ident(sort.column)} ${sort.direction || constants_1.SORT_DIRECTIONS.ASC}`;
144
+ return `${(0, pg_format_1.ident)(sort.column)} ${sort.direction || constants_1.SORT_DIRECTIONS.ASC}`;
134
145
  }
135
146
  buildOrderByClause(querySorting) {
136
147
  try {
@@ -166,7 +177,7 @@ class PostgresqlClientService extends query_service_1.default {
166
177
  async createCommand(data) {
167
178
  const keys = Object.keys(data[0]); // Assuming all objects have the same keys
168
179
  const values = data.map((item) => keys.map((key) => this.formatValue(item[key])));
169
- const query = (0, pg_format_1.default)(`INSERT INTO ${pg_format_1.default.ident(this.dbSchema)}.${pg_format_1.default.ident(this.tableName)} (%I) VALUES %L RETURNING *;`, keys, values);
180
+ const query = (0, pg_format_1.format)(`INSERT INTO ${(0, pg_format_1.ident)(this.dbSchema)}.${(0, pg_format_1.ident)(this.tableName)} (%I) VALUES %L RETURNING *;`, keys, values);
170
181
  return this.runQuery(query);
171
182
  }
172
183
  addFiltersToQuery(query, filters) {
@@ -213,7 +224,7 @@ class PostgresqlClientService extends query_service_1.default {
213
224
  return attributes;
214
225
  }
215
226
  async findCommand(options = {}) {
216
- let query = `SELECT ${this.getSelectClause(options.aggregateFunction, options.fields)} FROM ${pg_format_1.default.ident(this.dbSchema)}.${pg_format_1.default.ident(this.tableName)}`;
227
+ let query = `SELECT ${this.getSelectClause(options.aggregateFunction, options.fields)} FROM ${(0, pg_format_1.ident)(this.dbSchema)}.${(0, pg_format_1.ident)(this.tableName)}`;
217
228
  query = this.addFiltersToQuery(query, options.filters);
218
229
  if (!options.aggregateFunction) {
219
230
  query = this.addOrderByToQuery(query, options.sorting);
@@ -241,14 +252,14 @@ class PostgresqlClientService extends query_service_1.default {
241
252
  return JSON.stringify(formattedArray);
242
253
  }
243
254
  else {
244
- return pg_format_1.default.literal(value);
255
+ return (0, pg_format_1.literal)(value);
245
256
  }
246
257
  }
247
258
  async updateCommand(filters, data) {
248
- let query = `UPDATE ${pg_format_1.default.ident(this.dbSchema)}.${pg_format_1.default.ident(this.tableName)} SET`;
259
+ let query = `UPDATE ${(0, pg_format_1.ident)(this.dbSchema)}.${(0, pg_format_1.ident)(this.tableName)} SET`;
249
260
  const updateClauses = Object.entries(data).map(([key, value]) => {
250
- const dbValue = pg_format_1.default.literal(this.formatValue(value));
251
- return `${pg_format_1.default.ident(key)} = ${dbValue}`;
261
+ const dbValue = (0, pg_format_1.literal)(this.formatValue(value));
262
+ return `${(0, pg_format_1.ident)(key)} = ${dbValue}`;
252
263
  });
253
264
  query += ` ${updateClauses.join(', ')}`;
254
265
  query += ' WHERE ';
@@ -262,7 +273,7 @@ class PostgresqlClientService extends query_service_1.default {
262
273
  return filterClauses.join(' OR ');
263
274
  }
264
275
  async deleteCommand(filters, useFilterGroups = false) {
265
- let query = `DELETE FROM ${pg_format_1.default.ident(this.dbSchema)}.${pg_format_1.default.ident(this.tableName)}`;
276
+ let query = `DELETE FROM ${(0, pg_format_1.ident)(this.dbSchema)}.${(0, pg_format_1.ident)(this.tableName)}`;
266
277
  if (filters) {
267
278
  query += ' WHERE ';
268
279
  if (useFilterGroups) {
@@ -280,7 +291,7 @@ class PostgresqlClientService extends query_service_1.default {
280
291
  async updateExpressionCommand(
281
292
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
282
293
  filters, actions, options = {}) {
283
- let query = `UPDATE ${pg_format_1.default.ident(this.dbSchema)}.${pg_format_1.default.ident(this.tableName)} SET`;
294
+ let query = `UPDATE ${(0, pg_format_1.ident)(this.dbSchema)}.${(0, pg_format_1.ident)(this.tableName)} SET`;
284
295
  const set = actions.SET || [];
285
296
  const add = actions.ADD || [];
286
297
  const columns = this.crudSchema.columns;
@@ -323,16 +334,16 @@ class PostgresqlClientService extends query_service_1.default {
323
334
  }
324
335
  break;
325
336
  case 'array':
326
- formattedValue = pg_format_1.default.literal(value);
337
+ formattedValue = (0, pg_format_1.literal)(value);
327
338
  expValue = `ARRAY[${formattedValue}]`;
328
339
  break;
329
340
  default:
330
- formattedValue = pg_format_1.default.literal(value);
341
+ formattedValue = (0, pg_format_1.literal)(value);
331
342
  expValue = formattedValue;
332
343
  break;
333
344
  }
334
345
  this.crudSchema.columns;
335
- updateClauses.push(`${pg_format_1.default.ident(path)} = ${expValue}`);
346
+ updateClauses.push(`${(0, pg_format_1.ident)(path)} = ${expValue}`);
336
347
  }
337
348
  });
338
349
  if (Object.keys(jsonSetExpressionGroup).length > 0) {
@@ -344,12 +355,13 @@ class PostgresqlClientService extends query_service_1.default {
344
355
  //This is for dynamo functions transformed to postgresql functions
345
356
  if (queryFunctions.length > 0) {
346
357
  queryFunctions.forEach((queryFunction) => {
347
- updateClauses.push(`${pg_format_1.default.ident(queryFunction.path)} = ${queryFunction.value}`);
358
+ updateClauses.push(`${(0, pg_format_1.ident)(queryFunction.path)} = ${queryFunction.value}`);
348
359
  });
349
360
  }
350
361
  query += ` ${updateClauses.join(', ')}`;
351
362
  query += ' WHERE ';
352
363
  query += this.buildFilterClause(filters);
364
+ console.log('query: ', query);
353
365
  return this.runQuery(query);
354
366
  }
355
367
  /**
@@ -536,6 +548,17 @@ class PostgresqlClientService extends query_service_1.default {
536
548
  }
537
549
  return value;
538
550
  }
551
+ getValueTypeAsPostgresDefinition(value) {
552
+ switch (typeof value) {
553
+ case 'number':
554
+ return 'number';
555
+ case 'boolean':
556
+ return 'boolean';
557
+ case 'string':
558
+ default:
559
+ return 'text';
560
+ }
561
+ }
539
562
  }
540
563
  exports.default = PostgresqlClientService;
541
564
  //# sourceMappingURL=postgreSqlClient.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgreSqlClient.service.js","sourceRoot":"","sources":["../../../../../src/services/cruds/postgresql/postgreSqlClient.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgreSqlClient.service.js","sourceRoot":"","sources":["../../../../../src/services/cruds/postgresql/postgreSqlClient.service.ts"],"names":[],"mappings":"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"}
@@ -45,11 +45,15 @@ class PostgreSqlCrudService extends postgreSqlClient_service_1.default {
45
45
  create(data) {
46
46
  if (Array.isArray(data)) {
47
47
  const inputDataArray = data.map((item) => this.prepareData(item));
48
- return this.createCommand(inputDataArray).then((result) => ({
49
- unprocessedItems: result
50
- .filter((r) => !r.success)
51
- .map((r) => r.inputData),
52
- }));
48
+ return this.createCommand(inputDataArray).then((result) => {
49
+ var _a, _b;
50
+ const items = ((_a = result === null || result === void 0 ? void 0 : result.rows) === null || _a === void 0 ? void 0 : _a.map((row) => this.getItem(row))) || [];
51
+ return {
52
+ total: (_b = result.rowCount) !== null && _b !== void 0 ? _b : 0,
53
+ items,
54
+ unprocessedItems: [],
55
+ };
56
+ });
53
57
  }
54
58
  else {
55
59
  const inputData = this.prepareData(data);
@@ -1 +1 @@
1
- {"version":3,"file":"postgreSqlCrud.service.js","sourceRoot":"","sources":["../../../../../src/services/cruds/postgresql/postgreSqlCrud.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgreSqlCrud.service.js","sourceRoot":"","sources":["../../../../../src/services/cruds/postgresql/postgreSqlCrud.service.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { PoolClient } from 'pg';
3
3
 
4
4
  interface IFilter {
5
5
  attribute: string;
6
+ relativePath?: string;
6
7
  operator?: string;
7
8
  value: unknown;
8
9
  }
@@ -13,7 +14,9 @@ interface ICompositeFilter {
13
14
  }
14
15
 
15
16
  interface ICreateMultipleResponse {
16
- unprocessedItems: Record<string, any>;
17
+ unprocessedItems?: Record<string, any>;
18
+ total?: number;
19
+ items?: any[];
17
20
  }
18
21
 
19
22
  type FilterInput = string | IFilter[] | ICompositeFilter[] | ICompositeFilter;
@@ -1,6 +1,6 @@
1
1
  import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
2
  import { DynamoDBDocumentClient, GetCommand, QueryCommand, ScanCommand, PutCommand, UpdateCommand, DeleteCommand, BatchWriteCommand } from '@aws-sdk/lib-dynamodb';
3
- import format from 'pg-format';
3
+ import { literal, ident, format } from '@scaleleap/pg-format';
4
4
  import { Pool, Client } from 'pg';
5
5
 
6
6
  var __defProp = Object.defineProperty;
@@ -1067,19 +1067,29 @@ var PostgresqlClientService = class extends QueryService {
1067
1067
  return value;
1068
1068
  }
1069
1069
  }
1070
- buildClause(operator, attribute, value) {
1070
+ buildClause(operator, attribute, relativePath, value) {
1071
1071
  var _a;
1072
- const formattedValue = format.literal(value);
1072
+ const formattedValue = literal(value);
1073
1073
  operator = operator ? operator.toUpperCase() : "EQUAL" /* EQUAL */;
1074
1074
  const postgresOperator = POSTGRES_FILTER_OPERATOR_MAP[operator];
1075
1075
  if (!postgresOperator)
1076
1076
  throw new Error(`Unsupported filter operator: ${operator}`);
1077
- const filterProperty = format.ident(attribute);
1077
+ let property;
1078
+ const filterProperty = ident(attribute);
1078
1079
  const columnExists = !!this.crudSchema.columns[attribute];
1079
1080
  const columnType = columnExists && ((_a = this.crudSchema.columns[attribute]) == null ? void 0 : _a.type);
1080
- const property = columnExists ? filterProperty : `("qvAttributes" ->> '${attribute}')`;
1081
+ if (relativePath != void 0) {
1082
+ const attributePath = relativePath.split(".").join(",");
1083
+ property = `("${attribute}" #> '{${attributePath}}')`;
1084
+ if (value != null) {
1085
+ const comparisonValueType = this.getValueTypeAsPostgresDefinition(value);
1086
+ property += `::${comparisonValueType}`;
1087
+ }
1088
+ } else {
1089
+ property = columnExists ? filterProperty : `("qvAttributes" ->> '${attribute}')`;
1090
+ }
1081
1091
  if (operator === "IN" /* IN */) {
1082
- const formattedValues = Array.isArray(value) ? value.map(format.literal) : [formattedValue];
1092
+ const formattedValues = Array.isArray(value) ? value.map(literal) : [formattedValue];
1083
1093
  return `${property} ${postgresOperator} (${formattedValues.join(
1084
1094
  ", "
1085
1095
  )})`;
@@ -1088,7 +1098,7 @@ var PostgresqlClientService = class extends QueryService {
1088
1098
  return `${property} ${postgresOperator} ${value[0]} AND ${value[1]}`;
1089
1099
  }
1090
1100
  if (operator === "NOT_EQUAL" /* NOT_EQUAL */ && value !== null) {
1091
- return `(${property} ${postgresOperator} ${format.literal(
1101
+ return `(${property} ${postgresOperator} ${literal(
1092
1102
  value
1093
1103
  )} OR ${property} IS NULL)`;
1094
1104
  }
@@ -1108,9 +1118,7 @@ var PostgresqlClientService = class extends QueryService {
1108
1118
  return filterString;
1109
1119
  }
1110
1120
  const wildcardValue = this.getWildcardValue(operator, value);
1111
- return `${property} ${postgresOperator} ${format.literal(
1112
- wildcardValue
1113
- )}`;
1121
+ return `${property} ${postgresOperator} ${literal(wildcardValue)}`;
1114
1122
  }
1115
1123
  buildFilterClause(filters, logicOperator) {
1116
1124
  if (Array.isArray(filters)) {
@@ -1118,6 +1126,7 @@ var PostgresqlClientService = class extends QueryService {
1118
1126
  return this.buildClause(
1119
1127
  filter.operator,
1120
1128
  filter.attribute,
1129
+ filter.relativePath,
1121
1130
  filter.value
1122
1131
  );
1123
1132
  });
@@ -1152,6 +1161,7 @@ var PostgresqlClientService = class extends QueryService {
1152
1161
  clause = this.buildClause(
1153
1162
  filter.operator,
1154
1163
  filter.attribute,
1164
+ filter.relativePath,
1155
1165
  filter.value
1156
1166
  );
1157
1167
  }
@@ -1164,7 +1174,7 @@ var PostgresqlClientService = class extends QueryService {
1164
1174
  return filterClauses;
1165
1175
  }
1166
1176
  formatOrderByItem(sort) {
1167
- return `${format.ident(sort.column)} ${sort.direction || "ASC" /* ASC */}`;
1177
+ return `${ident(sort.column)} ${sort.direction || "ASC" /* ASC */}`;
1168
1178
  }
1169
1179
  buildOrderByClause(querySorting) {
1170
1180
  try {
@@ -1200,7 +1210,7 @@ var PostgresqlClientService = class extends QueryService {
1200
1210
  (item) => keys.map((key) => this.formatValue(item[key]))
1201
1211
  );
1202
1212
  const query = format(
1203
- `INSERT INTO ${format.ident(this.dbSchema)}.${format.ident(
1213
+ `INSERT INTO ${ident(this.dbSchema)}.${ident(
1204
1214
  this.tableName
1205
1215
  )} (%I) VALUES %L RETURNING *;`,
1206
1216
  keys,
@@ -1255,7 +1265,7 @@ var PostgresqlClientService = class extends QueryService {
1255
1265
  let query = `SELECT ${this.getSelectClause(
1256
1266
  options.aggregateFunction,
1257
1267
  options.fields
1258
- )} FROM ${format.ident(this.dbSchema)}.${format.ident(this.tableName)}`;
1268
+ )} FROM ${ident(this.dbSchema)}.${ident(this.tableName)}`;
1259
1269
  query = this.addFiltersToQuery(query, options.filters);
1260
1270
  if (!options.aggregateFunction) {
1261
1271
  query = this.addOrderByToQuery(query, options.sorting);
@@ -1278,16 +1288,16 @@ var PostgresqlClientService = class extends QueryService {
1278
1288
  }).join(",");
1279
1289
  return JSON.stringify(formattedArray);
1280
1290
  } else {
1281
- return format.literal(value);
1291
+ return literal(value);
1282
1292
  }
1283
1293
  }
1284
1294
  async updateCommand(filters, data) {
1285
- let query = `UPDATE ${format.ident(this.dbSchema)}.${format.ident(
1295
+ let query = `UPDATE ${ident(this.dbSchema)}.${ident(
1286
1296
  this.tableName
1287
1297
  )} SET`;
1288
1298
  const updateClauses = Object.entries(data).map(([key, value]) => {
1289
- const dbValue = format.literal(this.formatValue(value));
1290
- return `${format.ident(key)} = ${dbValue}`;
1299
+ const dbValue = literal(this.formatValue(value));
1300
+ return `${ident(key)} = ${dbValue}`;
1291
1301
  });
1292
1302
  query += ` ${updateClauses.join(", ")}`;
1293
1303
  query += " WHERE ";
@@ -1301,7 +1311,7 @@ var PostgresqlClientService = class extends QueryService {
1301
1311
  return filterClauses.join(" OR ");
1302
1312
  }
1303
1313
  async deleteCommand(filters, useFilterGroups = false) {
1304
- let query = `DELETE FROM ${format.ident(this.dbSchema)}.${format.ident(
1314
+ let query = `DELETE FROM ${ident(this.dbSchema)}.${ident(
1305
1315
  this.tableName
1306
1316
  )}`;
1307
1317
  if (filters) {
@@ -1322,7 +1332,7 @@ var PostgresqlClientService = class extends QueryService {
1322
1332
  return this.runQuery(queryText, values);
1323
1333
  }
1324
1334
  async updateExpressionCommand(filters, actions, options = {}) {
1325
- let query = `UPDATE ${format.ident(this.dbSchema)}.${format.ident(
1335
+ let query = `UPDATE ${ident(this.dbSchema)}.${ident(
1326
1336
  this.tableName
1327
1337
  )} SET`;
1328
1338
  const set = actions.SET || [];
@@ -1380,16 +1390,16 @@ var PostgresqlClientService = class extends QueryService {
1380
1390
  }
1381
1391
  break;
1382
1392
  case "array":
1383
- formattedValue = format.literal(value);
1393
+ formattedValue = literal(value);
1384
1394
  expValue = `ARRAY[${formattedValue}]`;
1385
1395
  break;
1386
1396
  default:
1387
- formattedValue = format.literal(value);
1397
+ formattedValue = literal(value);
1388
1398
  expValue = formattedValue;
1389
1399
  break;
1390
1400
  }
1391
1401
  this.crudSchema.columns;
1392
- updateClauses.push(`${format.ident(path)} = ${expValue}`);
1402
+ updateClauses.push(`${ident(path)} = ${expValue}`);
1393
1403
  }
1394
1404
  });
1395
1405
  if (Object.keys(jsonSetExpressionGroup).length > 0) {
@@ -1404,13 +1414,14 @@ var PostgresqlClientService = class extends QueryService {
1404
1414
  if (queryFunctions.length > 0) {
1405
1415
  queryFunctions.forEach((queryFunction) => {
1406
1416
  updateClauses.push(
1407
- `${format.ident(queryFunction.path)} = ${queryFunction.value}`
1417
+ `${ident(queryFunction.path)} = ${queryFunction.value}`
1408
1418
  );
1409
1419
  });
1410
1420
  }
1411
1421
  query += ` ${updateClauses.join(", ")}`;
1412
1422
  query += " WHERE ";
1413
1423
  query += this.buildFilterClause(filters);
1424
+ console.log("query: ", query);
1414
1425
  return this.runQuery(query);
1415
1426
  }
1416
1427
  /**
@@ -1614,6 +1625,17 @@ var PostgresqlClientService = class extends QueryService {
1614
1625
  }
1615
1626
  return value;
1616
1627
  }
1628
+ getValueTypeAsPostgresDefinition(value) {
1629
+ switch (typeof value) {
1630
+ case "number":
1631
+ return "number";
1632
+ case "boolean":
1633
+ return "boolean";
1634
+ case "string":
1635
+ default:
1636
+ return "text";
1637
+ }
1638
+ }
1617
1639
  };
1618
1640
 
1619
1641
  // src/services/cruds/postgresql/postgreSqlCrud.service.ts
@@ -1650,9 +1672,15 @@ var PostgreSqlCrudService = class extends PostgresqlClientService {
1650
1672
  create(data) {
1651
1673
  if (Array.isArray(data)) {
1652
1674
  const inputDataArray = data.map((item) => this.prepareData(item));
1653
- return this.createCommand(inputDataArray).then((result) => ({
1654
- unprocessedItems: result.filter((r) => !r.success).map((r) => r.inputData)
1655
- }));
1675
+ return this.createCommand(inputDataArray).then((result) => {
1676
+ var _a, _b;
1677
+ const items = ((_a = result == null ? void 0 : result.rows) == null ? void 0 : _a.map((row) => this.getItem(row))) || [];
1678
+ return {
1679
+ total: (_b = result.rowCount) != null ? _b : 0,
1680
+ items,
1681
+ unprocessedItems: []
1682
+ };
1683
+ });
1656
1684
  } else {
1657
1685
  const inputData = this.prepareData(data);
1658
1686
  return this.createCommand([inputData]).then(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/constants.ts","../../src/helpers/crudHelpers.ts","../../src/services/cruds/dynamodb/dynamoDbClient.service.ts","../../src/helpers/queryHelpers.ts","../../src/services/cruds/dynamodb/queryBuilderCondition.service.ts","../../src/services/cruds/dynamodb/queryBuilder.service.ts","../../src/helpers/tableHelper.ts","../../src/error/NoRecordsAffectedException.ts","../../src/helpers/errorHelper.ts","../../src/services/cruds/dynamodb/dynamoDbCrud.service.ts","../../src/services/cruds/postgresql/postgreSqlClient.service.ts","../../src/services/cruds/postgresql/connection.service.ts","../../src/services/cruds/postgresql/query.service.ts","../../src/services/cruds/postgresql/postgreSqlCrud.service.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":["CONNECTION_CLOSING_MODES","FILTER_LOGIC_OPERATORS","_a","_b","isMultiPlatformMode"],"mappings":"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","sourcesContent":["export const FILTER_OPERATOR_MAP: { [key: string]: string } = {\n CONTAINS: 'contains',\n NOT_CONTAINS: 'notContains',\n EQUAL: 'eq',\n STARTS_WITH: 'beginsWith',\n NOT_EQUAL: 'notEq',\n IN: 'in',\n GREATER_THAN: 'gt',\n GT: 'gt',\n GREATER_THAN_EQUAL: 'gte',\n GTE: 'gte',\n LESS_THAN: 'lt',\n LT: 'lt',\n LESS_THAN_EQUAL: 'lte',\n LTE: 'lte',\n EXIST: 'attribute_exists',\n NOT_EXIST: 'attribute_not_exists',\n BETWEEN: 'between',\n};\n\nexport const DYNAMODB_OPERATORS: { [key: string]: string } = {\n EQUAL: 'EQUAL',\n};\n\nexport enum SORT_DIRECTIONS {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport enum CONNECTION_CLOSING_MODES {\n AUTO = 'AUTO',\n MANUAL = 'MANUAL',\n}\n\nexport enum FILTER_LOGIC_OPERATORS {\n AND = 'AND',\n OR = 'OR',\n}\n\nexport enum FilterOperator {\n EQUAL = 'EQUAL',\n NOT_EQUAL = 'NOT_EQUAL',\n CONTAINS = 'CONTAINS',\n GREATER_THAN = 'GREATER_THAN',\n GREATER_THAN_EQUAL = 'GREATER_THAN_EQUAL',\n LESS_THAN = 'LESS_THAN',\n LESS_THAN_EQUAL = 'LESS_THAN_EQUAL',\n IN = 'IN',\n STARTS_WITH = 'STARTS_WITH',\n NOT_CONTAINS = 'NOT_CONTAINS',\n BETWEEN = 'BETWEEN',\n EXIST = 'EXIST',\n NOT_EXIST = 'NOT_EXIST',\n}\n\nexport const POSTGRES_FILTER_OPERATOR_MAP = {\n EQUAL: '=',\n NOT_EQUAL: '<>',\n GREATER_THAN: '>',\n GT: '>',\n GTE: '>=',\n GREATER_THAN_EQUAL: '>=',\n LTE: '<=',\n LESS_THAN_EQUAL: '<=',\n LESS_THAN: '<',\n LT: '<',\n IN: 'IN',\n STARTS_WITH: 'LIKE',\n CONTAINS: 'LIKE',\n NOT_CONTAINS: 'NOT LIKE',\n BETWEEN: 'BETWEEN',\n EXIST: 'IS NOT NULL',\n NOT_EXIST: 'IS NULL',\n};\n\nexport const DEFAULT_PG_SCHEMA = 'public';\n\nexport enum AGGREGATE_FUNCTIONS {\n COUNT = 'COUNT',\n}\n\nexport const DYNAMO_DB_UPDATE_ACTIONS: { [key: string]: string } = {\n SET: 'SET',\n ADD: 'ADD',\n DELETE: 'DELETE',\n REMOVE: 'REMOVE',\n};\n\nexport function isMultiPlatformMode() {\n return process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n}\n","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(attribute: string, value: any, operator = 'EQUAL') {\n return {\n attribute,\n operator,\n value,\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","/* 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","import { AggregateFunction } from '../types';\n\nexport enum METHOD_TO_QUERY {\n where = 'where',\n filter = 'filter',\n update = 'update',\n}\n\nexport function buildAggFunctionAlias(\n aggregateFunction: AggregateFunction,\n): string {\n return `AGG_FN_${aggregateFunction}`;\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","import { ITableColumns, ITableName } from '../interfaces';\n\nexport function getTableColumnNames(columns: ITableColumns): string[] {\n return Object.keys(columns);\n}\n\nexport function findIdColumnName(columns: ITableColumns): string | undefined {\n return getTableColumnNames(columns).find(\n (columnName) => columns[columnName].columnId === true,\n );\n}\n\nexport function getTableName(\n table: string | ITableName,\n property = 'name',\n): string {\n if (!table) throw new Error('missing table property');\n\n if (typeof table === 'string') return table;\n\n const { name, alias } = table;\n return property === 'alias' && alias ? alias : name;\n}\n\nexport function getPrimaryKeyColumns(columns: ITableColumns): string[] {\n return getTableColumnNames(columns).filter(\n (columnName) => columns[columnName].primary === true,\n );\n}\n","export class NoRecordsAffectedException extends Error {\n constructor() {\n super('No records affected by update');\n this.name = 'NoRecordsAffectedException';\n }\n}\n","import { NoRecordsAffectedException } from '../error/NoRecordsAffectedException';\n\nexport function PersistenceErrorWrapper(queryResult: any) {\n const dynamoNoRecordsAffectedExceptions = [\n 'ConditionalCheckFailedException',\n ];\n\n if (queryResult instanceof Error) {\n //Checks for dynamodb errors also the ones that is included in NoRecordsAffectedExceptions list\n if (\n queryResult.name &&\n dynamoNoRecordsAffectedExceptions.includes(queryResult.name)\n ) {\n throw new NoRecordsAffectedException();\n } else {\n throw queryResult;\n }\n } else {\n //This is for Postgres scenario, where there is not error launched by updates\n if (queryResult.rowCount === 0) {\n throw new NoRecordsAffectedException();\n }\n }\n\n return queryResult;\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 @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\n\nimport format from 'pg-format';\nimport { QueryResult } from 'pg';\nimport {\n AggregateFunction,\n DbPoolClient,\n FilterLogicOperator,\n} from '../../../types';\nimport {\n ICompositeFilter,\n IFilter,\n IFindOptions,\n IFindPagination,\n ISorting,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport QueryService from './query.service';\nimport {\n FILTER_LOGIC_OPERATORS,\n SORT_DIRECTIONS,\n POSTGRES_FILTER_OPERATOR_MAP,\n DEFAULT_PG_SCHEMA,\n FilterOperator,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport { CrudSchema } from '../../../schemas';\nimport { getTableName } from '../../../helpers/tableHelper';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\n\nexport default class PostgresqlClientService<T> extends QueryService {\n private crudSchema: typeof CrudSchema;\n constructor(tableSchema: typeof CrudSchema, poolClient?: DbPoolClient) {\n super(poolClient);\n this.crudSchema = tableSchema;\n }\n\n get dbSchema() {\n return this.crudSchema.schema || DEFAULT_PG_SCHEMA;\n }\n\n get tableName() {\n return (\n getTableName(this.crudSchema.table, 'alias') ||\n getTableName(this.crudSchema.table)\n );\n }\n\n getWildcardValue(operator: FilterOperator, value: string): string {\n if (\n operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS\n ) {\n return '%' + value + '%';\n } else if (operator === FilterOperator.STARTS_WITH) {\n return value + '%';\n } else {\n return value;\n }\n }\n\n private buildClause(\n operator: FilterOperator,\n attribute: string,\n value: any,\n ): string {\n const formattedValue = format.literal(value);\n operator = operator\n ? (operator.toUpperCase() as FilterOperator)\n : FilterOperator.EQUAL;\n const postgresOperator = POSTGRES_FILTER_OPERATOR_MAP[operator];\n\n if (!postgresOperator)\n throw new Error(`Unsupported filter operator: ${operator}`);\n\n const filterProperty = format.ident(attribute);\n const columnExists = !!this.crudSchema.columns[attribute];\n const columnType =\n columnExists && this.crudSchema.columns[attribute]?.type;\n const property = columnExists\n ? filterProperty\n : `(\"qvAttributes\" ->> '${attribute}')`;\n\n if (operator === FilterOperator.IN) {\n const formattedValues = Array.isArray(value)\n ? value.map(format.literal)\n : [formattedValue];\n return `${property} ${postgresOperator} (${formattedValues.join(\n ', ',\n )})`;\n }\n\n if (operator === FilterOperator.BETWEEN) {\n return `${property} ${postgresOperator} ${value[0]} AND ${value[1]}`;\n }\n\n /**\n * ? Additional filter to avoid error when column accepts null values.\n */\n if (operator === FilterOperator.NOT_EQUAL && value !== null) {\n return `(${property} ${postgresOperator} ${format.literal(\n value,\n )} OR ${property} IS NULL)`;\n }\n\n if (\n operator === FilterOperator.NOT_EXIST ||\n operator === FilterOperator.EXIST\n ) {\n return `${property} ${postgresOperator}`;\n }\n\n if (\n (operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS) &&\n columnType === 'array'\n ) {\n const filterValue =\n typeof value === 'number' ? value : `'${value}'`;\n let filterString = `${filterValue} = ANY(${property})`;\n\n if (operator === FilterOperator.NOT_CONTAINS) {\n if (value === null) {\n filterString = `(NOT (${filterString}))`;\n } else {\n filterString = `(NOT (${filterString}) or ${property} IS NULL)`;\n }\n }\n return filterString;\n }\n\n const wildcardValue = this.getWildcardValue(operator, value);\n return `${property} ${postgresOperator} ${format.literal(\n wildcardValue,\n )}`;\n }\n\n private buildFilterClause(\n filters: IFilter[] | ICompositeFilter,\n logicOperator?: FilterLogicOperator,\n ): string {\n if (Array.isArray(filters)) {\n const filterClauses = filters.map((filter) => {\n return this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.value,\n );\n });\n return filterClauses.join(\n ` ${logicOperator ?? FILTER_LOGIC_OPERATORS.AND} `,\n );\n } else {\n return this.buildQueryByClause(filters);\n }\n }\n\n private isCompositeFilter = function (value: any) {\n return 'OR' in value || 'AND' in value;\n };\n\n buildQueryByClause(filters: IFilter[] | ICompositeFilter): string {\n let filterClauses: string = '';\n let isFirstFilter = true;\n\n for (const [key, value] of Object.entries(filters)) {\n if (!isFirstFilter) {\n filterClauses += key === 'AND' ? ' AND ' : ' OR ';\n }\n\n if (this.isCompositeFilter(value)) {\n filterClauses += '(';\n filterClauses += this.buildQueryByClause(\n value as ICompositeFilter,\n );\n filterClauses += ')';\n } else {\n (value as IFilter[]).forEach((filter: IFilter) => {\n let clause = '';\n if (this.isCompositeFilter(filter)) {\n clause = `(${this.buildQueryByClause(\n filter as ICompositeFilter,\n )})`;\n } else {\n clause = this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.value,\n );\n }\n filterClauses += `${clause} ${key} `;\n });\n }\n\n isFirstFilter = false;\n }\n\n filterClauses = filterClauses.replace(/\\s+(AND|OR)\\s*$/, '');\n return filterClauses;\n }\n\n private formatOrderByItem(sort: ISorting): string {\n return `${format.ident(sort.column)} ${\n sort.direction || SORT_DIRECTIONS.ASC\n }`;\n }\n\n private buildOrderByClause(querySorting: ISorting[]): string {\n try {\n return querySorting.map(this.formatOrderByItem).join(', ');\n } catch (error) {\n return '';\n }\n }\n\n formatArray(array: any[]) {\n const isNumberArray = typeof array[0] === 'number';\n if (isNumberArray) {\n return `{${array.join(',')}}`;\n } else {\n return `{${array.map((val) => `\"${val}\"`).join(',')}}`;\n }\n }\n\n formatValue(value: any) {\n if (Array.isArray(value)) {\n if (!value?.length) return '{}';\n const isNumberArray = typeof value[0] === 'number';\n if (isNumberArray) {\n return `{${value.join(',')}}`;\n } else {\n return `{${value.map((val: any) => `\"${val}\"`).join(',')}}`;\n }\n }\n return value;\n }\n\n async createCommand(data: any[]): Promise<any> {\n const keys = Object.keys(data[0]); // Assuming all objects have the same keys\n const values = data.map((item) =>\n keys.map((key) => this.formatValue(item[key])),\n );\n\n const query = format(\n `INSERT INTO ${format.ident(this.dbSchema)}.${format.ident(\n this.tableName,\n )} (%I) VALUES %L RETURNING *;`,\n keys,\n values,\n );\n\n return this.runQuery(query);\n }\n\n private addFiltersToQuery(\n query: string,\n filters?: IFilter[] | ICompositeFilter,\n ): string {\n if (!filters) return query;\n\n const isValidArrayFilters = Array.isArray(filters) && filters?.length;\n const isValidCompositeFilters = this.isCompositeFilter(filters);\n if (isValidArrayFilters || isValidCompositeFilters)\n query += ` WHERE ${this.buildFilterClause(filters)}`;\n return query;\n }\n\n addOrderByToQuery(query: string, orderBy?: ISorting[]): string {\n if (orderBy) query += ` ORDER BY ${this.buildOrderByClause(orderBy)}`;\n return query;\n }\n\n private addPaginationToQuery(\n query: string,\n pagination?: IFindPagination,\n ): string {\n if (pagination) {\n const { limit, from } = pagination;\n if (limit) query += ` LIMIT ${limit}`;\n if (from) query += ` OFFSET ${from}`;\n }\n return query;\n }\n\n private getSelectClause(\n aggregateFunction: AggregateFunction | undefined,\n fields: string[] = [],\n ) {\n if (aggregateFunction)\n return `CAST(${aggregateFunction}(1) AS INTEGER) AS \"${buildAggFunctionAlias(\n aggregateFunction,\n )}\"`;\n if (!fields?.length) return '*';\n\n return this.parseFields(fields).join(', ');\n }\n\n private parseFields(fields: String[]): String[] {\n const columnsFromSchema: String[] = Object.keys(\n this.crudSchema.columns,\n );\n const attributes: String[] = fields\n .filter((field) => columnsFromSchema.indexOf(field) !== -1)\n .map((field) => `\"${field}\"`);\n\n fields\n .filter((field) => columnsFromSchema.indexOf(field) === -1)\n .forEach((field) => {\n attributes.push(`\"qvAttributes\" ->> '${field}' as \"${field}\"`);\n });\n return attributes;\n }\n\n async findCommand(options: IFindOptions = {}): Promise<T[]> {\n let query = `SELECT ${this.getSelectClause(\n options.aggregateFunction,\n options.fields,\n )} FROM ${format.ident(this.dbSchema)}.${format.ident(this.tableName)}`;\n query = this.addFiltersToQuery(query, options.filters);\n if (!options.aggregateFunction) {\n query = this.addOrderByToQuery(query, options.sorting);\n query = this.addPaginationToQuery(query, options.pagination);\n }\n return (await this.runQuery(query)).rows;\n }\n\n sanitizeValue(value: any): string {\n if (Array.isArray(value)) {\n if (value.length === 0) '[]';\n const formattedArray = value\n .map((item) => {\n if (typeof item === 'string') {\n return `'${item}'`;\n } else if (typeof item === 'object') {\n return JSON.stringify(item);\n } else {\n return item;\n }\n })\n .join(',');\n\n return JSON.stringify(formattedArray);\n } else {\n return format.literal(value);\n }\n }\n\n async updateCommand(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<any>,\n ): Promise<QueryResult<any>> {\n let query = `UPDATE ${format.ident(this.dbSchema)}.${format.ident(\n this.tableName,\n )} SET`;\n\n const updateClauses = Object.entries(data).map(([key, value]) => {\n const dbValue = format.literal(this.formatValue(value));\n return `${format.ident(key)} = ${dbValue}`;\n });\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n private buildFilterClauseForFilterGroups(\n filterGroups: IFilter[][],\n ): string {\n const filterClauses = filterGroups.map((filterGroup) => {\n return `(${this.buildFilterClause(filterGroup)})`;\n });\n return filterClauses.join(' OR ');\n }\n\n async deleteCommand(\n filters?: ICompositeFilter | IFilter[] | IFilter[][],\n useFilterGroups: boolean = false,\n ): Promise<QueryResult<any>> {\n let query = `DELETE FROM ${format.ident(this.dbSchema)}.${format.ident(\n this.tableName,\n )}`;\n if (filters) {\n query += ' WHERE ';\n\n if (useFilterGroups) {\n query += this.buildFilterClauseForFilterGroups(\n filters as IFilter[][],\n );\n } else {\n query += this.buildFilterClause(\n filters as ICompositeFilter | IFilter[],\n );\n }\n }\n\n return this.runQuery(query);\n }\n\n query(queryText: string, values?: any[]) {\n return this.runQuery(queryText, values);\n }\n\n public async updateExpressionCommand(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: Partial<IUpdateExpressionsOptions> = {},\n ) {\n let query = `UPDATE ${format.ident(this.dbSchema)}.${format.ident(\n this.tableName,\n )} SET`;\n\n const set = actions.SET || [];\n const add = actions.ADD || [];\n const columns = this.crudSchema.columns;\n\n const setValues = this.replacePathAndValueByAttributeNames(\n set,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.SET,\n );\n const addValues = this.replacePathAndValueByAttributeNames(\n add,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.ADD,\n );\n\n const setValuesAndAddValues: any = setValues.concat(addValues);\n\n const updateClauses: any = [];\n const jsonSetExpressionGroup: any = {};\n const queryFunctions: any = [];\n\n setValuesAndAddValues.forEach((expression: any) => {\n const { path, value, createNewColumn, actionName, dynamoFuncName } =\n expression;\n\n //Dynamo functions replacement\n if (dynamoFuncName) {\n queryFunctions.push({ path, value, dynamoFuncName });\n }\n\n if (path.includes('.') && !dynamoFuncName) {\n const jsonExpr = this.getJSONBSetExpressionByAction(\n path,\n value,\n {\n createNewColumn,\n actionName,\n },\n );\n const columnName: string = jsonExpr.columnName;\n if (!jsonSetExpressionGroup[columnName]) {\n jsonSetExpressionGroup[columnName] = [jsonExpr];\n } else {\n jsonSetExpressionGroup[columnName].push(jsonExpr);\n }\n } else if (!dynamoFuncName) {\n let expValue;\n const column = this.crudSchema.columns[path];\n if (column?.type == undefined)\n throw `Column type definition for column: (${path}) must be in the CrudSchema`;\n let formattedValue;\n switch (column.type) {\n case 'object':\n {\n const valueSerialized = `${JSON.stringify(\n value,\n ).replace(/'/g, \"''\")}`;\n expValue = `'${valueSerialized}'::jsonb`;\n }\n break;\n case 'array':\n formattedValue = format.literal(value);\n expValue = `ARRAY[${formattedValue}]`;\n break;\n default:\n formattedValue = format.literal(value);\n expValue = formattedValue;\n break;\n }\n this.crudSchema.columns;\n updateClauses.push(`${format.ident(path)} = ${expValue}`);\n }\n });\n\n if (Object.keys(jsonSetExpressionGroup).length > 0) {\n Object.keys(jsonSetExpressionGroup).forEach((groupIndex) => {\n const jsonSetExpression = this.buildJSONBExpression(\n jsonSetExpressionGroup[groupIndex],\n 'jsonb_set',\n );\n\n updateClauses.push(`${groupIndex} = ${jsonSetExpression}`);\n });\n }\n\n //This is for dynamo functions transformed to postgresql functions\n if (queryFunctions.length > 0) {\n queryFunctions.forEach((queryFunction: any) => {\n updateClauses.push(\n `${format.ident(queryFunction.path)} = ${\n queryFunction.value\n }`,\n );\n });\n }\n\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n /**\n * @description Builds a jsonb expression like jsonb_insert, or jsonb_set\n * @param jsonSetExpressions\n * @param functionName\n * @returns\n */\n private buildJSONBExpression(\n jsonSetExpressions: any,\n functionName: string,\n ) {\n let jsonSetStringExpr = '';\n jsonSetExpressions.forEach((expression: any, index: number) => {\n const { columnName, jsonExpr } = expression;\n if (index === 0) {\n jsonSetStringExpr = `${functionName}(${columnName},${jsonExpr})`;\n } else {\n jsonSetStringExpr = `${functionName}(${jsonSetStringExpr},${jsonExpr})`;\n }\n });\n return jsonSetStringExpr;\n }\n\n /**\n * @description Serializes a JSON value\n * @param value\n * @returns\n */\n private serializeJSONValue(value: any) {\n const valueSerialized =\n typeof value == 'object'\n ? `${JSON.stringify(value).replace(/'/g, \"''\")}`\n : value;\n return valueSerialized;\n }\n\n private getJSONBSetExpressionByAction(\n path: string,\n value: any,\n options: any,\n ) {\n path = path.replace(/\\[(\\d+)\\]/g, '.$1');\n const pathSplitted = path.split('.');\n const parentPath = pathSplitted[0];\n const { createNewColumn, actionName } = options;\n\n const pathSerialized = pathSplitted.slice(1).join(',');\n const valueSerialized = `'${JSON.stringify(value).replace(\n /'/g,\n \"''\",\n )}'`;\n\n if (actionName == DYNAMO_DB_UPDATE_ACTIONS.ADD) {\n if (typeof value != 'string' && !isNaN(value)) {\n const resultExpr = {\n jsonExpr: `'{${pathSerialized}}',to_jsonb(COALESCE((\"${parentPath}\"#>'{${pathSerialized}}')::numeric,0) + ${valueSerialized})`,\n columnName: `\"${parentPath}\"`,\n };\n return resultExpr;\n }\n }\n return {\n jsonExpr: `'{${pathSerialized}}',${valueSerialized},${createNewColumn}`,\n columnName: `\"${parentPath}\"`,\n };\n }\n\n private getListAppendDefFromValue(queryValue: string, columnType: string) {\n const regexListAppend = /list_append\\(([^)]+)\\)/gm;\n const listAppendString = 'list_append(';\n\n const matchList = queryValue.match(regexListAppend) || [];\n const groupResult = matchList[0];\n\n if (groupResult) {\n const attributesFromGroup = groupResult\n .slice(listAppendString.length, -1)\n .split(',');\n const attributes = {\n originalString: groupResult,\n path: attributesFromGroup[0].trim(),\n value: attributesFromGroup.slice(1).join(',').trim(),\n functionExpr: '',\n };\n if (columnType == 'array') {\n attributes['functionExpr'] =\n this.buildArrayAppendExpr(attributes);\n } else {\n attributes['functionExpr'] =\n this.buildJsonbInsertExpr(attributes);\n }\n return attributes;\n }\n\n return null;\n }\n\n private buildArrayAppendExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n return `ARRAY_APPEND(\"${columnName}\",${params.value})`;\n }\n\n private buildJsonbInsertExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n const jsonbInsertExpressions =\n this.getExpressionsByDefinitionForJSONBInsert(\n columnName,\n params.value,\n );\n\n const expressions = this.buildJSONBExpression(\n jsonbInsertExpressions,\n 'jsonb_insert',\n );\n return expressions;\n }\n\n private getExpressionsByDefinitionForJSONBInsert(\n columnName: string,\n value: string,\n ) {\n const jsonbInsertExpressions = [];\n try {\n const parsedValue = JSON.parse(value);\n if (Array.isArray(parsedValue)) {\n parsedValue.forEach((arrayValue) => {\n jsonbInsertExpressions.push({\n jsonExpr: `'{0}','${this.serializeJSONValue(\n arrayValue,\n )}'`,\n columnName: `\"${columnName}\"`,\n });\n });\n } else {\n jsonbInsertExpressions.push({\n jsonExpr: `'{0}','${this.serializeJSONValue(parsedValue)}'`,\n columnName: `\"${columnName}\"`,\n });\n }\n } catch (error) {\n jsonbInsertExpressions.push({\n jsonExpr: `'{0}','${value}'`,\n columnName: `\"${columnName}\"`,\n });\n }\n return jsonbInsertExpressions;\n }\n\n private getInsertExprFromJsonbDef(queryValue: string, columnType: string) {\n const listAppendParams = this.getListAppendDefFromValue(\n queryValue,\n columnType,\n );\n if (listAppendParams != null) {\n queryValue = queryValue.replace(\n listAppendParams.originalString,\n listAppendParams.functionExpr,\n );\n }\n\n return queryValue;\n }\n\n private replacePathAndValueByAttributeNames(\n actions: any[],\n options: IUpdateExpressionsOptions,\n columns: any,\n actionName: string,\n ) {\n return actions.map((action) => {\n action.path = this.replaceExpressionAttributeNames(\n action.path,\n options,\n );\n if (\n typeof action.value == 'string' &&\n action.value.includes('list_append')\n ) {\n action.path = action.path.split('.')[0];\n const column = columns[action.path];\n action.value =\n this.replaceExpressionAttributeValuesForDynamoFunctions(\n action.value,\n options,\n );\n action.value = this.getInsertExprFromJsonbDef(\n action.value,\n column.type,\n );\n action.dynamoFuncName = 'list_append';\n } else {\n action.value = this.replaceExpressionAttributeValues(\n action.value,\n options,\n );\n }\n\n action.actionName = actionName;\n action.createNewColumn = true;\n return action;\n });\n }\n\n private replaceExpressionAttributeValuesForDynamoFunctions(\n value: string,\n options: any,\n ) {\n const { expressionAttributeNames, expressionAttributeValues } = options;\n const exprAttributeNamesKeys = expressionAttributeNames\n ? Object.keys(expressionAttributeNames)\n : [];\n const exprAttributeValuesKeys = expressionAttributeValues\n ? Object.keys(expressionAttributeValues)\n : [];\n\n //Set for attribute names\n if (exprAttributeNamesKeys.length > 0) {\n exprAttributeNamesKeys.forEach((exprAttribute) => {\n value = value.replace(\n exprAttribute,\n expressionAttributeNames[exprAttribute],\n );\n });\n }\n\n //Set for attribute values\n if (exprAttributeValuesKeys.length > 0) {\n exprAttributeValuesKeys.forEach((exprAttribute) => {\n const valueSerialized = this.serializeJSONValue(\n expressionAttributeValues[exprAttribute],\n );\n value = value.replace(exprAttribute, `${valueSerialized}`);\n });\n }\n return value;\n }\n\n private replaceExpressionAttributeNames(\n path: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeNames } = options;\n\n if (expressionAttributeNames) {\n Object.keys(expressionAttributeNames).forEach(\n (attributeName: string) => {\n const attributeNameValue: string =\n expressionAttributeNames[attributeName];\n path = path.replace(attributeName, attributeNameValue);\n },\n );\n }\n return path;\n }\n\n private replaceExpressionAttributeValues(\n value: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeValues } = options;\n if (expressionAttributeValues[value] != undefined) {\n return expressionAttributeValues[value];\n }\n\n return value;\n }\n}\n","import { Client } from 'pg';\n\nexport default class ConnectionService {\n get connectionString() {\n const connectionString =\n process.env.MULTIPLATFORM_PG_CONNECTION_STRING || '';\n if (!connectionString) {\n throw new Error(\n 'MULTIPLATFORM_PG_CONNECTION_STRING environment variable must be configured',\n );\n }\n return connectionString;\n }\n\n async getClient(): Promise<Client> {\n const client: Client = new Client({\n connectionString: this.connectionString,\n });\n await client.connect();\n return client;\n }\n\n releaseClient(client: Client): void {\n try {\n client.end();\n } catch {\n // eslint-disable-next-line no-console\n console.log('Error releasing client');\n }\n }\n}\n","/* eslint-disable no-console */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Client, QueryResult } from 'pg';\nimport ConnectionService from './connection.service';\nimport { DbPoolClient } from '../../../types';\n\nexport default class QueryService {\n private connectionService: ConnectionService;\n\n constructor(private poolClient?: DbPoolClient) {\n this.connectionService = new ConnectionService();\n }\n\n async runQuery(\n queryText: string,\n values?: any[],\n ): Promise<QueryResult<any>> {\n const client = await (this.poolClient\n ? this.poolClient\n : this.connectionService.getClient());\n\n try {\n const result = await client.query(queryText, values);\n return result;\n } catch (error) {\n console.log('[Postgresql-Client] Query Execution Failed:', error);\n throw error;\n } finally {\n if (!this.poolClient)\n this.connectionService.releaseClient(client as Client);\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport PostgresqlClientService from './postgreSqlClient.service';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindResult,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas';\nimport { findIdColumnName } from '../../../helpers/tableHelper';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nexport class PostgreSqlCrudService<T>\n extends PostgresqlClientService<T>\n implements ICrudService<T>\n{\n constructor(private tableSchema: typeof CrudSchema) {\n super(tableSchema);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n normalizeInputData(inputData: any) {\n inputData.qvAttributes = {};\n for (const key in inputData) {\n if (!this.tableSchema.columns[key] && key !== 'qvAttributes') {\n inputData.qvAttributes[key] = inputData[key];\n delete inputData[key];\n } else if (\n Array.isArray(inputData[key]) &&\n this.tableSchema.columns[key]?.type !== 'array'\n ) {\n inputData[key] = JSON.stringify(inputData[key]);\n }\n }\n }\n\n getItem(data: { [key: string]: any }): any {\n const resultItem = { ...data, ...data.qvAttributes };\n delete resultItem['qvAttributes'];\n return resultItem;\n }\n\n prepareData(data: T): any {\n const inputData = { ...data } as { [key: string]: any };\n this.normalizeInputData(inputData);\n return inputData;\n }\n\n create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const inputDataArray = data.map((item) => this.prepareData(item));\n return this.createCommand(inputDataArray).then((result) => ({\n unprocessedItems: result\n .filter((r: any) => !r.success)\n .map((r: any) => r.inputData),\n }));\n } else {\n const inputData = this.prepareData(data);\n return this.createCommand([inputData]).then((result) =>\n result.rowCount ? this.getItem(result.rows[0]) : null,\n );\n }\n }\n\n findItem(findOptions: IFindOptions): Promise<T | null> {\n return this.findCommand(findOptions).then((data) => {\n return data?.length\n ? this.getItem(data[0] as { [key: string]: any })\n : null;\n });\n }\n\n private async processQueryResult(\n findOptions: IFindOptions,\n omitPagination: boolean = false,\n ): Promise<IFindResult<T>> {\n const rows = await this.findCommand(findOptions);\n const items = rows.map((row) =>\n this.getItem(row as { [key: string]: any }),\n );\n\n const { limit, from } = findOptions?.pagination || {};\n const hasMoreRecords = items.length && items.length === limit;\n const newFrom = limit && hasMoreRecords ? limit + (from || 0) : null;\n\n const result: IFindResult<T> = {\n items,\n pagination: omitPagination ? null : { limit: limit, from: newFrom },\n count: items.length,\n };\n return result;\n }\n\n async find(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions);\n }\n\n async findAll(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions, true);\n }\n\n async findCount(findOptions: IFindOptions): Promise<number> {\n const items = await this.findCommand({\n ...findOptions,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n });\n\n const aggFunctionProperty = buildAggFunctionAlias(\n AGGREGATE_FUNCTIONS.COUNT,\n );\n const item: any = items.length ? items[0] : {};\n return item[aggFunctionProperty] || 0;\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n ): Promise<any> {\n const savedRecord = await this.findItem({ filters });\n\n const inputData: any = {\n ...savedRecord,\n ...data,\n } as {\n [key: string]: any;\n };\n\n await this.updateCommand(filters, this.prepareData(inputData));\n return this.getItem(inputData);\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ): Promise<void> {\n await this.deleteCommand(filters, options?.filterGroups);\n }\n\n runQuery(querySentence: string, values?: any[]) {\n return super.runQuery(querySentence, values);\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n const result = await this.updateExpressionCommand(\n filters,\n actions,\n options,\n );\n return PersistenceErrorWrapper(result);\n }\n}\n","import { ICrudService } from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { PostgreSqlCrudService, DynamoDbCrudService } from './cruds/';\n\nexport class CrudFactory {\n static databaseClientService<T>(\n crudSchema: typeof CrudSchema,\n ): ICrudService<T> {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n if (isMultiPlatformMode)\n return new PostgreSqlCrudService<T>(crudSchema);\n return new DynamoDbCrudService<T>(crudSchema);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { PoolClient } 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 poolClient?: PoolClient,\n ) {\n this.crudSchema = crudSchema;\n }\n\n private async getCrudServiceInstance() {\n const crudService = await CrudFactory.databaseClientService(\n this.crudSchema,\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(attribute: string, value: any, operator = 'EQUAL') {\n return buildFilter(attribute, value, operator);\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\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}\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 } from 'pg';\nimport { isMultiPlatformMode } from '../utils/constants';\n\nexport async function getDbPool() {\n if (!isMultiPlatformMode()) return undefined;\n\n const pool = new Pool({\n connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,\n });\n const poolClient = await pool.connect();\n return poolClient;\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/constants.ts","../../src/helpers/crudHelpers.ts","../../src/services/cruds/dynamodb/dynamoDbClient.service.ts","../../src/helpers/queryHelpers.ts","../../src/services/cruds/dynamodb/queryBuilderCondition.service.ts","../../src/services/cruds/dynamodb/queryBuilder.service.ts","../../src/helpers/tableHelper.ts","../../src/error/NoRecordsAffectedException.ts","../../src/helpers/errorHelper.ts","../../src/services/cruds/dynamodb/dynamoDbCrud.service.ts","../../src/services/cruds/postgresql/postgreSqlClient.service.ts","../../src/services/cruds/postgresql/connection.service.ts","../../src/services/cruds/postgresql/query.service.ts","../../src/services/cruds/postgresql/postgreSqlCrud.service.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":["CONNECTION_CLOSING_MODES","FILTER_LOGIC_OPERATORS","_a","_b","isMultiPlatformMode"],"mappings":"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","sourcesContent":["export const FILTER_OPERATOR_MAP: { [key: string]: string } = {\n CONTAINS: 'contains',\n NOT_CONTAINS: 'notContains',\n EQUAL: 'eq',\n STARTS_WITH: 'beginsWith',\n NOT_EQUAL: 'notEq',\n IN: 'in',\n GREATER_THAN: 'gt',\n GT: 'gt',\n GREATER_THAN_EQUAL: 'gte',\n GTE: 'gte',\n LESS_THAN: 'lt',\n LT: 'lt',\n LESS_THAN_EQUAL: 'lte',\n LTE: 'lte',\n EXIST: 'attribute_exists',\n NOT_EXIST: 'attribute_not_exists',\n BETWEEN: 'between',\n};\n\nexport const DYNAMODB_OPERATORS: { [key: string]: string } = {\n EQUAL: 'EQUAL',\n};\n\nexport enum SORT_DIRECTIONS {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport enum CONNECTION_CLOSING_MODES {\n AUTO = 'AUTO',\n MANUAL = 'MANUAL',\n}\n\nexport enum FILTER_LOGIC_OPERATORS {\n AND = 'AND',\n OR = 'OR',\n}\n\nexport enum FilterOperator {\n EQUAL = 'EQUAL',\n NOT_EQUAL = 'NOT_EQUAL',\n CONTAINS = 'CONTAINS',\n GREATER_THAN = 'GREATER_THAN',\n GREATER_THAN_EQUAL = 'GREATER_THAN_EQUAL',\n LESS_THAN = 'LESS_THAN',\n LESS_THAN_EQUAL = 'LESS_THAN_EQUAL',\n IN = 'IN',\n STARTS_WITH = 'STARTS_WITH',\n NOT_CONTAINS = 'NOT_CONTAINS',\n BETWEEN = 'BETWEEN',\n EXIST = 'EXIST',\n NOT_EXIST = 'NOT_EXIST',\n}\n\nexport const POSTGRES_FILTER_OPERATOR_MAP = {\n EQUAL: '=',\n NOT_EQUAL: '<>',\n GREATER_THAN: '>',\n GT: '>',\n GTE: '>=',\n GREATER_THAN_EQUAL: '>=',\n LTE: '<=',\n LESS_THAN_EQUAL: '<=',\n LESS_THAN: '<',\n LT: '<',\n IN: 'IN',\n STARTS_WITH: 'LIKE',\n CONTAINS: 'LIKE',\n NOT_CONTAINS: 'NOT LIKE',\n BETWEEN: 'BETWEEN',\n EXIST: 'IS NOT NULL',\n NOT_EXIST: 'IS NULL',\n};\n\nexport const DEFAULT_PG_SCHEMA = 'public';\n\nexport enum AGGREGATE_FUNCTIONS {\n COUNT = 'COUNT',\n}\n\nexport const DYNAMO_DB_UPDATE_ACTIONS: { [key: string]: string } = {\n SET: 'SET',\n ADD: 'ADD',\n DELETE: 'DELETE',\n REMOVE: 'REMOVE',\n};\n\nexport function isMultiPlatformMode() {\n return process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n}\n","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(attribute: string, value: any, operator = 'EQUAL') {\n return {\n attribute,\n operator,\n value,\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","/* 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","import { AggregateFunction } from '../types';\n\nexport enum METHOD_TO_QUERY {\n where = 'where',\n filter = 'filter',\n update = 'update',\n}\n\nexport function buildAggFunctionAlias(\n aggregateFunction: AggregateFunction,\n): string {\n return `AGG_FN_${aggregateFunction}`;\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","import { ITableColumns, ITableName } from '../interfaces';\n\nexport function getTableColumnNames(columns: ITableColumns): string[] {\n return Object.keys(columns);\n}\n\nexport function findIdColumnName(columns: ITableColumns): string | undefined {\n return getTableColumnNames(columns).find(\n (columnName) => columns[columnName].columnId === true,\n );\n}\n\nexport function getTableName(\n table: string | ITableName,\n property = 'name',\n): string {\n if (!table) throw new Error('missing table property');\n\n if (typeof table === 'string') return table;\n\n const { name, alias } = table;\n return property === 'alias' && alias ? alias : name;\n}\n\nexport function getPrimaryKeyColumns(columns: ITableColumns): string[] {\n return getTableColumnNames(columns).filter(\n (columnName) => columns[columnName].primary === true,\n );\n}\n","export class NoRecordsAffectedException extends Error {\n constructor() {\n super('No records affected by update');\n this.name = 'NoRecordsAffectedException';\n }\n}\n","import { NoRecordsAffectedException } from '../error/NoRecordsAffectedException';\n\nexport function PersistenceErrorWrapper(queryResult: any) {\n const dynamoNoRecordsAffectedExceptions = [\n 'ConditionalCheckFailedException',\n ];\n\n if (queryResult instanceof Error) {\n //Checks for dynamodb errors also the ones that is included in NoRecordsAffectedExceptions list\n if (\n queryResult.name &&\n dynamoNoRecordsAffectedExceptions.includes(queryResult.name)\n ) {\n throw new NoRecordsAffectedException();\n } else {\n throw queryResult;\n }\n } else {\n //This is for Postgres scenario, where there is not error launched by updates\n if (queryResult.rowCount === 0) {\n throw new NoRecordsAffectedException();\n }\n }\n\n return queryResult;\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 @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\n\nimport { ident, literal, format } from '@scaleleap/pg-format';\nimport { QueryResult } from 'pg';\nimport {\n AggregateFunction,\n DbPoolClient,\n FilterLogicOperator,\n} from '../../../types';\nimport {\n ICompositeFilter,\n IFilter,\n IFindOptions,\n IFindPagination,\n ISorting,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport QueryService from './query.service';\nimport {\n FILTER_LOGIC_OPERATORS,\n SORT_DIRECTIONS,\n POSTGRES_FILTER_OPERATOR_MAP,\n DEFAULT_PG_SCHEMA,\n FilterOperator,\n DYNAMO_DB_UPDATE_ACTIONS,\n} from '../../../utils/constants';\nimport { CrudSchema } from '../../../schemas';\nimport { getTableName } from '../../../helpers/tableHelper';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\n\nexport default class PostgresqlClientService<T> extends QueryService {\n private crudSchema: typeof CrudSchema;\n constructor(tableSchema: typeof CrudSchema, poolClient?: DbPoolClient) {\n super(poolClient);\n this.crudSchema = tableSchema;\n }\n\n get dbSchema() {\n return this.crudSchema.schema || DEFAULT_PG_SCHEMA;\n }\n\n get tableName() {\n return (\n getTableName(this.crudSchema.table, 'alias') ||\n getTableName(this.crudSchema.table)\n );\n }\n\n getWildcardValue(operator: FilterOperator, value: string): string {\n if (\n operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS\n ) {\n return '%' + value + '%';\n } else if (operator === FilterOperator.STARTS_WITH) {\n return value + '%';\n } else {\n return value;\n }\n }\n\n private buildClause(\n operator: FilterOperator,\n attribute: string,\n relativePath: string | undefined,\n value: any,\n ): string {\n const formattedValue = literal(value);\n operator = operator\n ? (operator.toUpperCase() as FilterOperator)\n : FilterOperator.EQUAL;\n const postgresOperator = POSTGRES_FILTER_OPERATOR_MAP[operator];\n\n if (!postgresOperator)\n throw new Error(`Unsupported filter operator: ${operator}`);\n\n let property;\n const filterProperty = ident(attribute);\n const columnExists = !!this.crudSchema.columns[attribute];\n const columnType =\n columnExists && this.crudSchema.columns[attribute]?.type;\n\n if (relativePath != undefined) {\n const attributePath = relativePath.split('.').join(',');\n\n property = `(\"${attribute}\" #> '{${attributePath}}')`;\n if (value != null) {\n const comparisonValueType =\n this.getValueTypeAsPostgresDefinition(value);\n property += `::${comparisonValueType}`;\n }\n } else {\n property = columnExists\n ? filterProperty\n : `(\"qvAttributes\" ->> '${attribute}')`;\n }\n\n if (operator === FilterOperator.IN) {\n const formattedValues = Array.isArray(value)\n ? value.map(literal)\n : [formattedValue];\n return `${property} ${postgresOperator} (${formattedValues.join(\n ', ',\n )})`;\n }\n\n if (operator === FilterOperator.BETWEEN) {\n return `${property} ${postgresOperator} ${value[0]} AND ${value[1]}`;\n }\n\n /**\n * ? Additional filter to avoid error when column accepts null values.\n */\n if (operator === FilterOperator.NOT_EQUAL && value !== null) {\n return `(${property} ${postgresOperator} ${literal(\n value,\n )} OR ${property} IS NULL)`;\n }\n\n if (\n operator === FilterOperator.NOT_EXIST ||\n operator === FilterOperator.EXIST\n ) {\n return `${property} ${postgresOperator}`;\n }\n\n if (\n (operator === FilterOperator.CONTAINS ||\n operator === FilterOperator.NOT_CONTAINS) &&\n columnType === 'array'\n ) {\n const filterValue =\n typeof value === 'number' ? value : `'${value}'`;\n let filterString = `${filterValue} = ANY(${property})`;\n\n if (operator === FilterOperator.NOT_CONTAINS) {\n if (value === null) {\n filterString = `(NOT (${filterString}))`;\n } else {\n filterString = `(NOT (${filterString}) or ${property} IS NULL)`;\n }\n }\n return filterString;\n }\n\n const wildcardValue = this.getWildcardValue(operator, value);\n return `${property} ${postgresOperator} ${literal(wildcardValue)}`;\n }\n\n private buildFilterClause(\n filters: IFilter[] | ICompositeFilter,\n logicOperator?: FilterLogicOperator,\n ): string {\n if (Array.isArray(filters)) {\n const filterClauses = filters.map((filter) => {\n return this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.relativePath,\n filter.value,\n );\n });\n return filterClauses.join(\n ` ${logicOperator ?? FILTER_LOGIC_OPERATORS.AND} `,\n );\n } else {\n return this.buildQueryByClause(filters);\n }\n }\n\n private isCompositeFilter = function (value: any) {\n return 'OR' in value || 'AND' in value;\n };\n\n buildQueryByClause(filters: IFilter[] | ICompositeFilter): string {\n let filterClauses: string = '';\n let isFirstFilter = true;\n\n for (const [key, value] of Object.entries(filters)) {\n if (!isFirstFilter) {\n filterClauses += key === 'AND' ? ' AND ' : ' OR ';\n }\n\n if (this.isCompositeFilter(value)) {\n filterClauses += '(';\n filterClauses += this.buildQueryByClause(\n value as ICompositeFilter,\n );\n filterClauses += ')';\n } else {\n (value as IFilter[]).forEach((filter: IFilter) => {\n let clause = '';\n if (this.isCompositeFilter(filter)) {\n clause = `(${this.buildQueryByClause(\n filter as ICompositeFilter,\n )})`;\n } else {\n clause = this.buildClause(\n filter.operator as FilterOperator,\n filter.attribute,\n filter.relativePath,\n filter.value,\n );\n }\n filterClauses += `${clause} ${key} `;\n });\n }\n\n isFirstFilter = false;\n }\n\n filterClauses = filterClauses.replace(/\\s+(AND|OR)\\s*$/, '');\n return filterClauses;\n }\n\n private formatOrderByItem(sort: ISorting): string {\n return `${ident(sort.column)} ${sort.direction || SORT_DIRECTIONS.ASC}`;\n }\n\n private buildOrderByClause(querySorting: ISorting[]): string {\n try {\n return querySorting.map(this.formatOrderByItem).join(', ');\n } catch (error) {\n return '';\n }\n }\n\n formatArray(array: any[]) {\n const isNumberArray = typeof array[0] === 'number';\n if (isNumberArray) {\n return `{${array.join(',')}}`;\n } else {\n return `{${array.map((val) => `\"${val}\"`).join(',')}}`;\n }\n }\n\n formatValue(value: any) {\n if (Array.isArray(value)) {\n if (!value?.length) return '{}';\n const isNumberArray = typeof value[0] === 'number';\n if (isNumberArray) {\n return `{${value.join(',')}}`;\n } else {\n return `{${value.map((val: any) => `\"${val}\"`).join(',')}}`;\n }\n }\n return value;\n }\n\n async createCommand(data: any[]): Promise<any> {\n const keys = Object.keys(data[0]); // Assuming all objects have the same keys\n const values = data.map((item) =>\n keys.map((key) => this.formatValue(item[key])),\n );\n\n const query = format(\n `INSERT INTO ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} (%I) VALUES %L RETURNING *;`,\n keys,\n values,\n );\n\n return this.runQuery(query);\n }\n\n private addFiltersToQuery(\n query: string,\n filters?: IFilter[] | ICompositeFilter,\n ): string {\n if (!filters) return query;\n\n const isValidArrayFilters = Array.isArray(filters) && filters?.length;\n const isValidCompositeFilters = this.isCompositeFilter(filters);\n if (isValidArrayFilters || isValidCompositeFilters)\n query += ` WHERE ${this.buildFilterClause(filters)}`;\n return query;\n }\n\n addOrderByToQuery(query: string, orderBy?: ISorting[]): string {\n if (orderBy) query += ` ORDER BY ${this.buildOrderByClause(orderBy)}`;\n return query;\n }\n\n private addPaginationToQuery(\n query: string,\n pagination?: IFindPagination,\n ): string {\n if (pagination) {\n const { limit, from } = pagination;\n if (limit) query += ` LIMIT ${limit}`;\n if (from) query += ` OFFSET ${from}`;\n }\n return query;\n }\n\n private getSelectClause(\n aggregateFunction: AggregateFunction | undefined,\n fields: string[] = [],\n ) {\n if (aggregateFunction)\n return `CAST(${aggregateFunction}(1) AS INTEGER) AS \"${buildAggFunctionAlias(\n aggregateFunction,\n )}\"`;\n if (!fields?.length) return '*';\n\n return this.parseFields(fields).join(', ');\n }\n\n private parseFields(fields: String[]): String[] {\n const columnsFromSchema: String[] = Object.keys(\n this.crudSchema.columns,\n );\n const attributes: String[] = fields\n .filter((field) => columnsFromSchema.indexOf(field) !== -1)\n .map((field) => `\"${field}\"`);\n\n fields\n .filter((field) => columnsFromSchema.indexOf(field) === -1)\n .forEach((field) => {\n attributes.push(`\"qvAttributes\" ->> '${field}' as \"${field}\"`);\n });\n return attributes;\n }\n\n async findCommand(options: IFindOptions = {}): Promise<T[]> {\n let query = `SELECT ${this.getSelectClause(\n options.aggregateFunction,\n options.fields,\n )} FROM ${ident(this.dbSchema)}.${ident(this.tableName)}`;\n query = this.addFiltersToQuery(query, options.filters);\n if (!options.aggregateFunction) {\n query = this.addOrderByToQuery(query, options.sorting);\n query = this.addPaginationToQuery(query, options.pagination);\n }\n return (await this.runQuery(query)).rows;\n }\n\n sanitizeValue(value: any): string {\n if (Array.isArray(value)) {\n if (value.length === 0) '[]';\n const formattedArray = value\n .map((item) => {\n if (typeof item === 'string') {\n return `'${item}'`;\n } else if (typeof item === 'object') {\n return JSON.stringify(item);\n } else {\n return item;\n }\n })\n .join(',');\n\n return JSON.stringify(formattedArray);\n } else {\n return literal(value);\n }\n }\n\n async updateCommand(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<any>,\n ): Promise<QueryResult<any>> {\n let query = `UPDATE ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} SET`;\n\n const updateClauses = Object.entries(data).map(([key, value]) => {\n const dbValue = literal(this.formatValue(value));\n return `${ident(key)} = ${dbValue}`;\n });\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n\n return this.runQuery(query);\n }\n\n private buildFilterClauseForFilterGroups(\n filterGroups: IFilter[][],\n ): string {\n const filterClauses = filterGroups.map((filterGroup) => {\n return `(${this.buildFilterClause(filterGroup)})`;\n });\n return filterClauses.join(' OR ');\n }\n\n async deleteCommand(\n filters?: ICompositeFilter | IFilter[] | IFilter[][],\n useFilterGroups: boolean = false,\n ): Promise<QueryResult<any>> {\n let query = `DELETE FROM ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )}`;\n if (filters) {\n query += ' WHERE ';\n\n if (useFilterGroups) {\n query += this.buildFilterClauseForFilterGroups(\n filters as IFilter[][],\n );\n } else {\n query += this.buildFilterClause(\n filters as ICompositeFilter | IFilter[],\n );\n }\n }\n\n return this.runQuery(query);\n }\n\n query(queryText: string, values?: any[]) {\n return this.runQuery(queryText, values);\n }\n\n public async updateExpressionCommand(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: Partial<IUpdateExpressionsOptions> = {},\n ) {\n let query = `UPDATE ${ident(this.dbSchema)}.${ident(\n this.tableName,\n )} SET`;\n\n const set = actions.SET || [];\n const add = actions.ADD || [];\n const columns = this.crudSchema.columns;\n\n const setValues = this.replacePathAndValueByAttributeNames(\n set,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.SET,\n );\n const addValues = this.replacePathAndValueByAttributeNames(\n add,\n options,\n columns,\n DYNAMO_DB_UPDATE_ACTIONS.ADD,\n );\n\n const setValuesAndAddValues: any = setValues.concat(addValues);\n\n const updateClauses: any = [];\n const jsonSetExpressionGroup: any = {};\n const queryFunctions: any = [];\n\n setValuesAndAddValues.forEach((expression: any) => {\n const { path, value, createNewColumn, actionName, dynamoFuncName } =\n expression;\n\n //Dynamo functions replacement\n if (dynamoFuncName) {\n queryFunctions.push({ path, value, dynamoFuncName });\n }\n\n if (path.includes('.') && !dynamoFuncName) {\n const jsonExpr = this.getJSONBSetExpressionByAction(\n path,\n value,\n {\n createNewColumn,\n actionName,\n },\n );\n const columnName: string = jsonExpr.columnName;\n if (!jsonSetExpressionGroup[columnName]) {\n jsonSetExpressionGroup[columnName] = [jsonExpr];\n } else {\n jsonSetExpressionGroup[columnName].push(jsonExpr);\n }\n } else if (!dynamoFuncName) {\n let expValue;\n const column = this.crudSchema.columns[path];\n if (column?.type == undefined)\n throw `Column type definition for column: (${path}) must be in the CrudSchema`;\n let formattedValue;\n switch (column.type) {\n case 'object':\n {\n const valueSerialized = `${JSON.stringify(\n value,\n ).replace(/'/g, \"''\")}`;\n expValue = `'${valueSerialized}'::jsonb`;\n }\n break;\n case 'array':\n formattedValue = literal(value);\n expValue = `ARRAY[${formattedValue}]`;\n break;\n default:\n formattedValue = literal(value);\n expValue = formattedValue;\n break;\n }\n this.crudSchema.columns;\n updateClauses.push(`${ident(path)} = ${expValue}`);\n }\n });\n\n if (Object.keys(jsonSetExpressionGroup).length > 0) {\n Object.keys(jsonSetExpressionGroup).forEach((groupIndex) => {\n const jsonSetExpression = this.buildJSONBExpression(\n jsonSetExpressionGroup[groupIndex],\n 'jsonb_set',\n );\n\n updateClauses.push(`${groupIndex} = ${jsonSetExpression}`);\n });\n }\n\n //This is for dynamo functions transformed to postgresql functions\n if (queryFunctions.length > 0) {\n queryFunctions.forEach((queryFunction: any) => {\n updateClauses.push(\n `${ident(queryFunction.path)} = ${queryFunction.value}`,\n );\n });\n }\n\n query += ` ${updateClauses.join(', ')}`;\n\n query += ' WHERE ';\n query += this.buildFilterClause(filters);\n console.log('query: ', query);\n\n return this.runQuery(query);\n }\n\n /**\n * @description Builds a jsonb expression like jsonb_insert, or jsonb_set\n * @param jsonSetExpressions\n * @param functionName\n * @returns\n */\n private buildJSONBExpression(\n jsonSetExpressions: any,\n functionName: string,\n ) {\n let jsonSetStringExpr = '';\n jsonSetExpressions.forEach((expression: any, index: number) => {\n const { columnName, jsonExpr } = expression;\n if (index === 0) {\n jsonSetStringExpr = `${functionName}(${columnName},${jsonExpr})`;\n } else {\n jsonSetStringExpr = `${functionName}(${jsonSetStringExpr},${jsonExpr})`;\n }\n });\n return jsonSetStringExpr;\n }\n\n /**\n * @description Serializes a JSON value\n * @param value\n * @returns\n */\n private serializeJSONValue(value: any) {\n const valueSerialized =\n typeof value == 'object'\n ? `${JSON.stringify(value).replace(/'/g, \"''\")}`\n : value;\n return valueSerialized;\n }\n\n private getJSONBSetExpressionByAction(\n path: string,\n value: any,\n options: any,\n ) {\n path = path.replace(/\\[(\\d+)\\]/g, '.$1');\n const pathSplitted = path.split('.');\n const parentPath = pathSplitted[0];\n const { createNewColumn, actionName } = options;\n\n const pathSerialized = pathSplitted.slice(1).join(',');\n const valueSerialized = `'${JSON.stringify(value).replace(\n /'/g,\n \"''\",\n )}'`;\n\n if (actionName == DYNAMO_DB_UPDATE_ACTIONS.ADD) {\n if (typeof value != 'string' && !isNaN(value)) {\n const resultExpr = {\n jsonExpr: `'{${pathSerialized}}',to_jsonb(COALESCE((\"${parentPath}\"#>'{${pathSerialized}}')::numeric,0) + ${valueSerialized})`,\n columnName: `\"${parentPath}\"`,\n };\n return resultExpr;\n }\n }\n return {\n jsonExpr: `'{${pathSerialized}}',${valueSerialized},${createNewColumn}`,\n columnName: `\"${parentPath}\"`,\n };\n }\n\n private getListAppendDefFromValue(queryValue: string, columnType: string) {\n const regexListAppend = /list_append\\(([^)]+)\\)/gm;\n const listAppendString = 'list_append(';\n\n const matchList = queryValue.match(regexListAppend) || [];\n const groupResult = matchList[0];\n\n if (groupResult) {\n const attributesFromGroup = groupResult\n .slice(listAppendString.length, -1)\n .split(',');\n const attributes = {\n originalString: groupResult,\n path: attributesFromGroup[0].trim(),\n value: attributesFromGroup.slice(1).join(',').trim(),\n functionExpr: '',\n };\n if (columnType == 'array') {\n attributes['functionExpr'] =\n this.buildArrayAppendExpr(attributes);\n } else {\n attributes['functionExpr'] =\n this.buildJsonbInsertExpr(attributes);\n }\n return attributes;\n }\n\n return null;\n }\n\n private buildArrayAppendExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n return `ARRAY_APPEND(\"${columnName}\",${params.value})`;\n }\n\n private buildJsonbInsertExpr(params: any) {\n const arrayPath = params.path.split('.');\n const columnName = arrayPath.shift();\n const jsonbInsertExpressions =\n this.getExpressionsByDefinitionForJSONBInsert(\n columnName,\n params.value,\n );\n\n const expressions = this.buildJSONBExpression(\n jsonbInsertExpressions,\n 'jsonb_insert',\n );\n return expressions;\n }\n\n private getExpressionsByDefinitionForJSONBInsert(\n columnName: string,\n value: string,\n ) {\n const jsonbInsertExpressions = [];\n try {\n const parsedValue = JSON.parse(value);\n if (Array.isArray(parsedValue)) {\n parsedValue.forEach((arrayValue) => {\n jsonbInsertExpressions.push({\n jsonExpr: `'{0}','${this.serializeJSONValue(\n arrayValue,\n )}'`,\n columnName: `\"${columnName}\"`,\n });\n });\n } else {\n jsonbInsertExpressions.push({\n jsonExpr: `'{0}','${this.serializeJSONValue(parsedValue)}'`,\n columnName: `\"${columnName}\"`,\n });\n }\n } catch (error) {\n jsonbInsertExpressions.push({\n jsonExpr: `'{0}','${value}'`,\n columnName: `\"${columnName}\"`,\n });\n }\n return jsonbInsertExpressions;\n }\n\n private getInsertExprFromJsonbDef(queryValue: string, columnType: string) {\n const listAppendParams = this.getListAppendDefFromValue(\n queryValue,\n columnType,\n );\n if (listAppendParams != null) {\n queryValue = queryValue.replace(\n listAppendParams.originalString,\n listAppendParams.functionExpr,\n );\n }\n\n return queryValue;\n }\n\n private replacePathAndValueByAttributeNames(\n actions: any[],\n options: IUpdateExpressionsOptions,\n columns: any,\n actionName: string,\n ) {\n return actions.map((action) => {\n action.path = this.replaceExpressionAttributeNames(\n action.path,\n options,\n );\n if (\n typeof action.value == 'string' &&\n action.value.includes('list_append')\n ) {\n action.path = action.path.split('.')[0];\n const column = columns[action.path];\n action.value =\n this.replaceExpressionAttributeValuesForDynamoFunctions(\n action.value,\n options,\n );\n action.value = this.getInsertExprFromJsonbDef(\n action.value,\n column.type,\n );\n action.dynamoFuncName = 'list_append';\n } else {\n action.value = this.replaceExpressionAttributeValues(\n action.value,\n options,\n );\n }\n\n action.actionName = actionName;\n action.createNewColumn = true;\n return action;\n });\n }\n\n private replaceExpressionAttributeValuesForDynamoFunctions(\n value: string,\n options: any,\n ) {\n const { expressionAttributeNames, expressionAttributeValues } = options;\n const exprAttributeNamesKeys = expressionAttributeNames\n ? Object.keys(expressionAttributeNames)\n : [];\n const exprAttributeValuesKeys = expressionAttributeValues\n ? Object.keys(expressionAttributeValues)\n : [];\n\n //Set for attribute names\n if (exprAttributeNamesKeys.length > 0) {\n exprAttributeNamesKeys.forEach((exprAttribute) => {\n value = value.replace(\n exprAttribute,\n expressionAttributeNames[exprAttribute],\n );\n });\n }\n\n //Set for attribute values\n if (exprAttributeValuesKeys.length > 0) {\n exprAttributeValuesKeys.forEach((exprAttribute) => {\n const valueSerialized = this.serializeJSONValue(\n expressionAttributeValues[exprAttribute],\n );\n value = value.replace(exprAttribute, `${valueSerialized}`);\n });\n }\n return value;\n }\n\n private replaceExpressionAttributeNames(\n path: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeNames } = options;\n\n if (expressionAttributeNames) {\n Object.keys(expressionAttributeNames).forEach(\n (attributeName: string) => {\n const attributeNameValue: string =\n expressionAttributeNames[attributeName];\n path = path.replace(attributeName, attributeNameValue);\n },\n );\n }\n return path;\n }\n\n private replaceExpressionAttributeValues(\n value: string,\n options: IUpdateExpressionsOptions,\n ) {\n const { expressionAttributeValues } = options;\n if (expressionAttributeValues[value] != undefined) {\n return expressionAttributeValues[value];\n }\n\n return value;\n }\n\n private getValueTypeAsPostgresDefinition(value: any) {\n switch (typeof value) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'string':\n default:\n return 'text';\n }\n }\n}\n","import { Client } from 'pg';\n\nexport default class ConnectionService {\n get connectionString() {\n const connectionString =\n process.env.MULTIPLATFORM_PG_CONNECTION_STRING || '';\n if (!connectionString) {\n throw new Error(\n 'MULTIPLATFORM_PG_CONNECTION_STRING environment variable must be configured',\n );\n }\n return connectionString;\n }\n\n async getClient(): Promise<Client> {\n const client: Client = new Client({\n connectionString: this.connectionString,\n });\n await client.connect();\n return client;\n }\n\n releaseClient(client: Client): void {\n try {\n client.end();\n } catch {\n // eslint-disable-next-line no-console\n console.log('Error releasing client');\n }\n }\n}\n","/* eslint-disable no-console */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Client, QueryResult } from 'pg';\nimport ConnectionService from './connection.service';\nimport { DbPoolClient } from '../../../types';\n\nexport default class QueryService {\n private connectionService: ConnectionService;\n\n constructor(private poolClient?: DbPoolClient) {\n this.connectionService = new ConnectionService();\n }\n\n async runQuery(\n queryText: string,\n values?: any[],\n ): Promise<QueryResult<any>> {\n const client = await (this.poolClient\n ? this.poolClient\n : this.connectionService.getClient());\n\n try {\n const result = await client.query(queryText, values);\n return result;\n } catch (error) {\n console.log('[Postgresql-Client] Query Execution Failed:', error);\n throw error;\n } finally {\n if (!this.poolClient)\n this.connectionService.releaseClient(client as Client);\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport PostgresqlClientService from './postgreSqlClient.service';\nimport {\n ICompositeFilter,\n ICreateMultipleResponse,\n ICrudService,\n IFilter,\n IFindOptions,\n IFindResult,\n IRemoveOptions,\n IUpdateExpressions,\n IUpdateExpressionsOptions,\n} from '../../../interfaces';\nimport { CrudSchema } from '../../../schemas';\nimport { findIdColumnName } from '../../../helpers/tableHelper';\nimport { AGGREGATE_FUNCTIONS } from '../../../utils/constants';\nimport { buildAggFunctionAlias } from '../../../helpers/queryHelpers';\nimport { PersistenceErrorWrapper } from '../../../helpers/errorHelper';\nexport class PostgreSqlCrudService<T>\n extends PostgresqlClientService<T>\n implements ICrudService<T>\n{\n constructor(private tableSchema: typeof CrudSchema) {\n super(tableSchema);\n }\n\n private get idColumnName(): string | undefined {\n return findIdColumnName(this.tableSchema.columns);\n }\n\n normalizeInputData(inputData: any) {\n inputData.qvAttributes = {};\n for (const key in inputData) {\n if (!this.tableSchema.columns[key] && key !== 'qvAttributes') {\n inputData.qvAttributes[key] = inputData[key];\n delete inputData[key];\n } else if (\n Array.isArray(inputData[key]) &&\n this.tableSchema.columns[key]?.type !== 'array'\n ) {\n inputData[key] = JSON.stringify(inputData[key]);\n }\n }\n }\n\n getItem(data: { [key: string]: any }): any {\n const resultItem = { ...data, ...data.qvAttributes };\n delete resultItem['qvAttributes'];\n return resultItem;\n }\n\n prepareData(data: T): any {\n const inputData = { ...data } as { [key: string]: any };\n this.normalizeInputData(inputData);\n return inputData;\n }\n\n create(data: T | T[]): Promise<T | ICreateMultipleResponse> {\n if (Array.isArray(data)) {\n const inputDataArray = data.map((item) => this.prepareData(item));\n\n return this.createCommand(inputDataArray).then((result) => {\n const items =\n result?.rows?.map((row: any) => this.getItem(row)) || [];\n return {\n total: result.rowCount ?? 0,\n items,\n unprocessedItems: [],\n };\n });\n } else {\n const inputData = this.prepareData(data);\n return this.createCommand([inputData]).then((result) =>\n result.rowCount ? this.getItem(result.rows[0]) : null,\n );\n }\n }\n\n findItem(findOptions: IFindOptions): Promise<T | null> {\n return this.findCommand(findOptions).then((data) => {\n return data?.length\n ? this.getItem(data[0] as { [key: string]: any })\n : null;\n });\n }\n\n private async processQueryResult(\n findOptions: IFindOptions,\n omitPagination: boolean = false,\n ): Promise<IFindResult<T>> {\n const rows = await this.findCommand(findOptions);\n const items = rows.map((row) =>\n this.getItem(row as { [key: string]: any }),\n );\n\n const { limit, from } = findOptions?.pagination || {};\n const hasMoreRecords = items.length && items.length === limit;\n const newFrom = limit && hasMoreRecords ? limit + (from || 0) : null;\n\n const result: IFindResult<T> = {\n items,\n pagination: omitPagination ? null : { limit: limit, from: newFrom },\n count: items.length,\n };\n return result;\n }\n\n async find(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions);\n }\n\n async findAll(findOptions: IFindOptions): Promise<IFindResult<T>> {\n return this.processQueryResult(findOptions, true);\n }\n\n async findCount(findOptions: IFindOptions): Promise<number> {\n const items = await this.findCommand({\n ...findOptions,\n aggregateFunction: AGGREGATE_FUNCTIONS.COUNT,\n });\n\n const aggFunctionProperty = buildAggFunctionAlias(\n AGGREGATE_FUNCTIONS.COUNT,\n );\n const item: any = items.length ? items[0] : {};\n return item[aggFunctionProperty] || 0;\n }\n\n async update(\n filters: IFilter[] | ICompositeFilter,\n data: Partial<T>,\n ): Promise<any> {\n const savedRecord = await this.findItem({ filters });\n\n const inputData: any = {\n ...savedRecord,\n ...data,\n } as {\n [key: string]: any;\n };\n\n await this.updateCommand(filters, this.prepareData(inputData));\n return this.getItem(inputData);\n }\n\n async remove(\n filters: IFilter[] | ICompositeFilter | IFilter[][],\n options: IRemoveOptions,\n ): Promise<void> {\n await this.deleteCommand(filters, options?.filterGroups);\n }\n\n runQuery(querySentence: string, values?: any[]) {\n return super.runQuery(querySentence, values);\n }\n\n async updateExpressions(\n filters: IFilter[] | ICompositeFilter,\n actions: IUpdateExpressions,\n options: IUpdateExpressionsOptions,\n ): Promise<any> {\n const result = await this.updateExpressionCommand(\n filters,\n actions,\n options,\n );\n return PersistenceErrorWrapper(result);\n }\n}\n","import { ICrudService } from '../interfaces';\nimport { CrudSchema } from '../schemas';\nimport { PostgreSqlCrudService, DynamoDbCrudService } from './cruds/';\n\nexport class CrudFactory {\n static databaseClientService<T>(\n crudSchema: typeof CrudSchema,\n ): ICrudService<T> {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n if (isMultiPlatformMode)\n return new PostgreSqlCrudService<T>(crudSchema);\n return new DynamoDbCrudService<T>(crudSchema);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { PoolClient } 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 poolClient?: PoolClient,\n ) {\n this.crudSchema = crudSchema;\n }\n\n private async getCrudServiceInstance() {\n const crudService = await CrudFactory.databaseClientService(\n this.crudSchema,\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(attribute: string, value: any, operator = 'EQUAL') {\n return buildFilter(attribute, value, operator);\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\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}\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 } from 'pg';\nimport { isMultiPlatformMode } from '../utils/constants';\n\nexport async function getDbPool() {\n if (!isMultiPlatformMode()) return undefined;\n\n const pool = new Pool({\n connectionString: process.env.MULTIPLATFORM_PG_CONNECTION_STRING,\n });\n const poolClient = await pool.connect();\n return poolClient;\n}\n"]}
@@ -3,6 +3,7 @@ import { PoolClient } from 'pg';
3
3
 
4
4
  interface IFilter {
5
5
  attribute: string;
6
+ relativePath?: string;
6
7
  operator?: string;
7
8
  value: unknown;
8
9
  }
@@ -13,7 +14,9 @@ interface ICompositeFilter {
13
14
  }
14
15
 
15
16
  interface ICreateMultipleResponse {
16
- unprocessedItems: Record<string, any>;
17
+ unprocessedItems?: Record<string, any>;
18
+ total?: number;
19
+ items?: any[];
17
20
  }
18
21
 
19
22
  type FilterInput = string | IFilter[] | ICompositeFilter[] | ICompositeFilter;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@qrvey/data-persistence",
3
3
  "types": "dist/types/index.d.ts",
4
4
  "main": "dist/cjs/index.js",
5
- "version": "0.3.6-bundle",
5
+ "version": "0.3.6-bundle-2",
6
6
  "license": "MIT",
7
7
  "exports": {
8
8
  ".": {
@@ -32,8 +32,8 @@
32
32
  "dependencies": {
33
33
  "@aws-sdk/client-dynamodb": "3.x",
34
34
  "@aws-sdk/lib-dynamodb": "3.x",
35
- "pg": "8.11.4",
36
- "pg-format": "1.0.4"
35
+ "@scaleleap/pg-format": "^1.0.0",
36
+ "pg": "8.11.4"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/jest": "29.5.5",