@carbonorm/carbonnode 3.4.0 → 3.4.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.
@@ -140,6 +140,7 @@ export declare const C6Constants: {
140
140
  YEARWEEK: string;
141
141
  DEPENDANT_ON_ENTITY: string;
142
142
  OPTIONS: string;
143
+ INSERT: string;
143
144
  GET: string;
144
145
  POST: string;
145
146
  PUT: string;
@@ -293,6 +294,7 @@ export declare const C6C: {
293
294
  YEARWEEK: string;
294
295
  DEPENDANT_ON_ENTITY: string;
295
296
  OPTIONS: string;
297
+ INSERT: string;
296
298
  GET: string;
297
299
  POST: string;
298
300
  PUT: string;
@@ -1,26 +1,17 @@
1
1
  import { OrmGenerics } from "../types/ormGenerics";
2
2
  import { DetermineResponseDataType } from "../types/ormInterfaces";
3
- import { ResultSetHeader } from 'mysql2/promise';
4
3
  import { Executor } from "./Executor";
5
- type QueryType = 'select' | 'update' | 'delete';
6
4
  export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
7
5
  execute(): Promise<DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>>;
8
6
  private withConnection;
9
7
  serialize: (row: any) => {
10
8
  [k: string]: unknown;
11
9
  };
12
- insert(table: G['RestShortTableName'], data: Record<string, any>): Promise<{
13
- rest: ResultSetHeader;
14
- sql: {
15
- sql: string;
16
- placeholders: string;
17
- };
18
- }>;
19
10
  formatSQLWithParams(sql: string, params: any[] | {
20
11
  [key: string]: any;
21
12
  }): string;
22
13
  private formatValue;
23
- runQuery(type: QueryType, table: G['RestShortTableName'], args: any): Promise<{
14
+ runQuery(): Promise<{
24
15
  rest: any;
25
16
  sql: {
26
17
  sql: any;
@@ -36,4 +27,3 @@ export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
36
27
  };
37
28
  }>;
38
29
  }
39
- export {};
@@ -1,11 +1,13 @@
1
1
  import { OrmGenerics } from "../../types/ormGenerics";
2
2
  import { DetermineResponseDataType } from "../../types/ormInterfaces";
3
+ import { SqlBuilderResult } from "../utils/sqlUtils";
3
4
  import { AggregateBuilder } from "./AggregateBuilder";
4
- export declare class ConditionBuilder<G extends OrmGenerics> extends AggregateBuilder<G> {
5
+ export declare abstract class ConditionBuilder<G extends OrmGenerics> extends AggregateBuilder<G> {
6
+ abstract build(table: string): SqlBuilderResult;
5
7
  execute(): Promise<DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>>;
6
8
  private readonly OPERATORS;
7
9
  private validateOperator;
8
- private addParam;
10
+ addParam(params: any[] | Record<string, any>, column: string, value: any): string;
9
11
  buildBooleanJoinedConditions(set: any, andMode?: boolean, params?: any[] | Record<string, any>): string;
10
12
  buildWhereClause(whereArg: any, params: any[] | Record<string, any>): string;
11
13
  }
@@ -1,5 +1,5 @@
1
1
  import { OrmGenerics } from "../../types/ormGenerics";
2
2
  import { ConditionBuilder } from "./ConditionBuilder";
3
- export declare class JoinBuilder<G extends OrmGenerics> extends ConditionBuilder<G> {
3
+ export declare abstract class JoinBuilder<G extends OrmGenerics> extends ConditionBuilder<G> {
4
4
  buildJoinClauses(joinArgs: any, params: any[] | Record<string, any>): string;
5
5
  }
@@ -1,6 +1,6 @@
1
1
  import { OrmGenerics } from "../../types/ormGenerics";
2
2
  import { JoinBuilder } from "./JoinBuilder";
3
- export declare class PaginationBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
3
+ export declare abstract class PaginationBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
4
4
  /**
5
5
  * MySQL ORDER/LIMIT/OFFSET generator.
6
6
  *
@@ -2,8 +2,5 @@ import { OrmGenerics } from "../../types/ormGenerics";
2
2
  import { SqlBuilderResult } from "../utils/sqlUtils";
3
3
  import { JoinBuilder } from "../builders/JoinBuilder";
4
4
  export declare class DeleteQueryBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
5
- build(table: string, args: {
6
- JOIN?: any;
7
- WHERE?: any;
8
- }): SqlBuilderResult;
5
+ build(table: string): SqlBuilderResult;
9
6
  }
@@ -0,0 +1,9 @@
1
+ import { ConditionBuilder } from "../builders/ConditionBuilder";
2
+ import { OrmGenerics } from "../../types/ormGenerics";
3
+ export declare class PostQueryBuilder<G extends OrmGenerics> extends ConditionBuilder<G> {
4
+ private trimTablePrefix;
5
+ build(table: string): {
6
+ sql: string;
7
+ params: any[];
8
+ };
9
+ }
@@ -2,5 +2,5 @@ import { OrmGenerics } from "../../types/ormGenerics";
2
2
  import { PaginationBuilder } from "../builders/PaginationBuilder";
3
3
  import { SqlBuilderResult } from "../utils/sqlUtils";
4
4
  export declare class SelectQueryBuilder<G extends OrmGenerics> extends PaginationBuilder<G> {
5
- build(table: string, args: any, primary?: string, isSubSelect?: boolean): SqlBuilderResult;
5
+ build(table: string, isSubSelect?: boolean): SqlBuilderResult;
6
6
  }
@@ -2,5 +2,5 @@ import { OrmGenerics } from "../../types/ormGenerics";
2
2
  import { PaginationBuilder } from '../builders/PaginationBuilder';
3
3
  import { SqlBuilderResult } from "../utils/sqlUtils";
4
4
  export declare class UpdateQueryBuilder<G extends OrmGenerics> extends PaginationBuilder<G> {
5
- build(table: string, data: Record<string, any>, args?: any): SqlBuilderResult;
5
+ build(table: string): SqlBuilderResult;
6
6
  }
@@ -82,7 +82,7 @@ export type RequestQueryBody<Method extends iRestMethods, T extends {
82
82
  [key: string]: any;
83
83
  } = {}, Overrides extends {
84
84
  [key: string]: any;
85
- } = {}> = Method extends 'GET' | 'PUT' | 'DELETE' ? iAPI<RequestGetPutDeleteBody<Modify<T, Overrides> & Custom>> : iAPI<Modify<T, Overrides> & Custom>;
85
+ } = {}> = Method extends 'GET' | 'PUT' | 'DELETE' ? iAPI<RequestGetPutDeleteBody<Modify<T, Overrides> & Custom>> : Method extends 'POST' ? iAPI<RequestGetPutDeleteBody<Modify<T, Overrides> & Custom> & Modify<T, Overrides> & Custom> : iAPI<Modify<T, Overrides> & Custom>;
86
86
  export interface iCacheAPI<ResponseDataType = any> {
87
87
  requestArgumentsSerialized: string;
88
88
  request: AxiosPromise<ResponseDataType>;
package/dist/index.cjs.js CHANGED
@@ -154,6 +154,7 @@ var C6Constants = {
154
154
  DEPENDANT_ON_ENTITY: 'DEPENDANT_ON_ENTITY',
155
155
  // PHP validation
156
156
  OPTIONS: 'OPTIONS',
157
+ INSERT: 'INSERT',
157
158
  GET: 'GET',
158
159
  POST: 'POST',
159
160
  PUT: 'PUT',
@@ -1373,20 +1374,60 @@ var DeleteQueryBuilder = /** @class */ (function (_super) {
1373
1374
  function DeleteQueryBuilder() {
1374
1375
  return _super !== null && _super.apply(this, arguments) || this;
1375
1376
  }
1376
- DeleteQueryBuilder.prototype.build = function (table, args) {
1377
+ DeleteQueryBuilder.prototype.build = function (table) {
1377
1378
  var params = this.useNamedParams ? {} : [];
1378
1379
  var sql = "DELETE `".concat(table, "` FROM `").concat(table, "`");
1379
- if (args.JOIN) {
1380
- sql += this.buildJoinClauses(args.JOIN, params);
1380
+ if (this.request.JOIN) {
1381
+ sql += this.buildJoinClauses(this.request.JOIN, params);
1381
1382
  }
1382
- if (args.WHERE) {
1383
- sql += this.buildWhereClause(args.WHERE, params);
1383
+ if (this.request.WHERE) {
1384
+ sql += this.buildWhereClause(this.request.WHERE, params);
1384
1385
  }
1385
1386
  return { sql: sql, params: params };
1386
1387
  };
1387
1388
  return DeleteQueryBuilder;
1388
1389
  }(JoinBuilder));
1389
1390
 
1391
+ var PostQueryBuilder = /** @class */ (function (_super) {
1392
+ tslib.__extends(PostQueryBuilder, _super);
1393
+ function PostQueryBuilder() {
1394
+ return _super !== null && _super.apply(this, arguments) || this;
1395
+ }
1396
+ PostQueryBuilder.prototype.trimTablePrefix = function (table, column) {
1397
+ if (!column.includes('.'))
1398
+ return column;
1399
+ var _a = column.split('.', 2), prefix = _a[0], col = _a[1];
1400
+ if (prefix !== table) {
1401
+ throw new Error("Invalid prefixed column: '".concat(column, "'. Expected prefix '").concat(table, ".'"));
1402
+ }
1403
+ return col;
1404
+ };
1405
+ PostQueryBuilder.prototype.build = function (table) {
1406
+ var _this = this;
1407
+ var verb = C6C.REPLACE in this.request ? C6C.REPLACE : C6C.INSERT;
1408
+ var keys = Object.keys(verb in this.request ? this.request[verb] : this.request);
1409
+ var params = [];
1410
+ var placeholders = [];
1411
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
1412
+ var key = keys_1[_i];
1413
+ var value = this.request[key];
1414
+ var placeholder = this.addParam(params, key, value);
1415
+ placeholders.push(placeholder);
1416
+ }
1417
+ var sql = "".concat(verb, " INTO `").concat(table, "` (\n ").concat(keys.map(function (k) { return "`".concat(_this.trimTablePrefix(table, k), "`"); }).join(', '), "\n ) VALUES (\n ").concat(placeholders.join(', '), "\n )");
1418
+ if (C6C.UPDATE in this.request) {
1419
+ var updateData = this.request[C6C.UPDATE];
1420
+ if (!Array.isArray(updateData)) {
1421
+ throw new Error("Update data must be an array of keys to update, got: ".concat(JSON.stringify(updateData)));
1422
+ }
1423
+ var updateClause = updateData.map(function (k) { return "`".concat(k, "` = VALUES(`").concat(k, "`)"); }).join(', ');
1424
+ sql += " ON DUPLICATE KEY UPDATE ".concat(updateClause);
1425
+ }
1426
+ return { sql: sql, params: params };
1427
+ };
1428
+ return PostQueryBuilder;
1429
+ }(ConditionBuilder));
1430
+
1390
1431
  var PaginationBuilder = /** @class */ (function (_super) {
1391
1432
  tslib.__extends(PaginationBuilder, _super);
1392
1433
  function PaginationBuilder() {
@@ -1447,10 +1488,11 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1447
1488
  function SelectQueryBuilder() {
1448
1489
  return _super !== null && _super.apply(this, arguments) || this;
1449
1490
  }
1450
- SelectQueryBuilder.prototype.build = function (table, args, primary, isSubSelect) {
1491
+ SelectQueryBuilder.prototype.build = function (table, isSubSelect) {
1451
1492
  var _this = this;
1452
1493
  var _a;
1453
1494
  if (isSubSelect === void 0) { isSubSelect = false; }
1495
+ var args = this.request;
1454
1496
  var params = this.useNamedParams ? {} : [];
1455
1497
  var selectList = (_a = args.SELECT) !== null && _a !== void 0 ? _a : ['*'];
1456
1498
  var selectFields = selectList
@@ -1476,7 +1518,7 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1476
1518
  sql += this.buildPaginationClause(args.PAGINATION);
1477
1519
  }
1478
1520
  else if (!isSubSelect) {
1479
- sql += primary ? " ORDER BY ".concat(primary, " ASC LIMIT 1") : " LIMIT 100";
1521
+ sql += " LIMIT 100";
1480
1522
  }
1481
1523
  return { sql: sql, params: params };
1482
1524
  };
@@ -1488,24 +1530,20 @@ var UpdateQueryBuilder = /** @class */ (function (_super) {
1488
1530
  function UpdateQueryBuilder() {
1489
1531
  return _super !== null && _super.apply(this, arguments) || this;
1490
1532
  }
1491
- UpdateQueryBuilder.prototype.build = function (table, data, args) {
1492
- if (args === void 0) { args = {}; }
1533
+ UpdateQueryBuilder.prototype.build = function (table) {
1534
+ var _this = this;
1535
+ var args = this.request;
1493
1536
  var params = this.useNamedParams ? {} : [];
1494
1537
  var sql = "UPDATE `".concat(table, "`");
1495
1538
  if (args.JOIN) {
1496
1539
  sql += this.buildJoinClauses(args.JOIN, params);
1497
1540
  }
1498
- var setClauses = Object.entries(data).map(function (_a) {
1541
+ if (!(C6C.UPDATE in this.request)) {
1542
+ throw new Error("No update data provided in the request.");
1543
+ }
1544
+ var setClauses = Object.entries(this.request[C6C.UPDATE]).map(function (_a) {
1499
1545
  var col = _a[0], val = _a[1];
1500
- if (Array.isArray(params)) {
1501
- params.push(val);
1502
- return "`".concat(col, "` = ?");
1503
- }
1504
- else {
1505
- var key = "param".concat(Object.keys(params).length);
1506
- params[key] = val;
1507
- return "`".concat(col, "` = :").concat(key);
1508
- }
1546
+ return _this.addParam(params, col, val);
1509
1547
  });
1510
1548
  sql += " SET ".concat(setClauses.join(', '));
1511
1549
  if (args.WHERE) {
@@ -1547,23 +1585,23 @@ var SqlExecutor = /** @class */ (function (_super) {
1547
1585
  case 'DELETE': return [3 /*break*/, 7];
1548
1586
  }
1549
1587
  return [3 /*break*/, 9];
1550
- case 1: return [4 /*yield*/, this.runQuery('select', TABLE_NAME, this.request)];
1588
+ case 1: return [4 /*yield*/, this.runQuery()];
1551
1589
  case 2:
1552
1590
  rest = _b.sent();
1553
1591
  console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1554
1592
  return [2 /*return*/, rest];
1555
- case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1593
+ case 3: return [4 /*yield*/, this.runQuery()];
1556
1594
  case 4:
1557
1595
  result = _b.sent();
1558
1596
  console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1559
1597
  created = { rest: result, created: true };
1560
1598
  return [2 /*return*/, created];
1561
- case 5: return [4 /*yield*/, this.runQuery('update', TABLE_NAME, this.request)];
1599
+ case 5: return [4 /*yield*/, this.runQuery()];
1562
1600
  case 6:
1563
1601
  result = _b.sent();
1564
1602
  updated = tslib.__assign(tslib.__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
1565
1603
  return [2 /*return*/, updated];
1566
- case 7: return [4 /*yield*/, this.runQuery('delete', TABLE_NAME, this.request)];
1604
+ case 7: return [4 /*yield*/, this.runQuery()];
1567
1605
  case 8:
1568
1606
  result = _b.sent();
1569
1607
  console.log("[SQL EXECUTOR] \u2705 DELETE result:", result);
@@ -1603,41 +1641,6 @@ var SqlExecutor = /** @class */ (function (_super) {
1603
1641
  });
1604
1642
  });
1605
1643
  };
1606
- SqlExecutor.prototype.insert = function (table, data) {
1607
- return tslib.__awaiter(this, void 0, void 0, function () {
1608
- var keys, values, placeholders, sql;
1609
- var _this = this;
1610
- return tslib.__generator(this, function (_a) {
1611
- switch (_a.label) {
1612
- case 0:
1613
- keys = Object.keys(data);
1614
- values = keys.map(function (k) { return data[k]; });
1615
- placeholders = keys.map(function () { return '?'; }).join(', ');
1616
- sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ")\n VALUES (").concat(placeholders, ")");
1617
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
1618
- console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1619
- return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1620
- var result;
1621
- return tslib.__generator(this, function (_a) {
1622
- switch (_a.label) {
1623
- case 0: return [4 /*yield*/, conn.execute(sql, values)];
1624
- case 1:
1625
- result = (_a.sent())[0];
1626
- return [2 /*return*/, {
1627
- rest: result,
1628
- sql: {
1629
- sql: sql,
1630
- placeholders: placeholders
1631
- }
1632
- }];
1633
- }
1634
- });
1635
- }); })];
1636
- case 1: return [2 /*return*/, _a.sent()];
1637
- }
1638
- });
1639
- });
1640
- };
1641
1644
  SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
1642
1645
  var _this = this;
1643
1646
  if (Array.isArray(params)) {
@@ -1669,30 +1672,35 @@ var SqlExecutor = /** @class */ (function (_super) {
1669
1672
  return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1670
1673
  return "'".concat(JSON.stringify(val), "'");
1671
1674
  };
1672
- SqlExecutor.prototype.runQuery = function (type, table, args) {
1675
+ SqlExecutor.prototype.runQuery = function () {
1673
1676
  return tslib.__awaiter(this, void 0, void 0, function () {
1674
- var builder, QueryResult, formatted, toUnnamed, _a, sql, values;
1677
+ var TABLE_NAME, method, builder, QueryResult, formatted, toUnnamed, _a, sql, values;
1675
1678
  var _this = this;
1676
1679
  return tslib.__generator(this, function (_b) {
1677
1680
  switch (_b.label) {
1678
1681
  case 0:
1679
- switch (type) {
1680
- case 'select':
1682
+ TABLE_NAME = this.config.restModel.TABLE_NAME;
1683
+ method = this.config.requestMethod;
1684
+ switch (method) {
1685
+ case 'GET':
1681
1686
  builder = new SelectQueryBuilder(this.config, this.request);
1682
1687
  break;
1683
- case 'update':
1688
+ case 'PUT':
1684
1689
  builder = new UpdateQueryBuilder(this.config, this.request);
1685
1690
  break;
1686
- case 'delete':
1691
+ case 'DELETE':
1687
1692
  builder = new DeleteQueryBuilder(this.config, this.request);
1688
1693
  break;
1694
+ case 'POST':
1695
+ builder = new PostQueryBuilder(this.config, this.request);
1696
+ break;
1689
1697
  default:
1690
- throw new Error("Unsupported query type: ".concat(type));
1698
+ throw new Error("Unsupported query method: ".concat(method));
1691
1699
  }
1692
- QueryResult = builder.build(table, args);
1693
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(type.toUpperCase(), " SQL:"), QueryResult);
1700
+ QueryResult = builder.build(TABLE_NAME);
1701
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(method.toUpperCase(), " SQL:"), QueryResult);
1694
1702
  formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1695
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(type.toUpperCase(), " SQL:"), formatted);
1703
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(method.toUpperCase(), " SQL:"), formatted);
1696
1704
  toUnnamed = namedPlaceholders();
1697
1705
  _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1698
1706
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
@@ -1702,7 +1710,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1702
1710
  case 0: return [4 /*yield*/, conn.query(sql, values)];
1703
1711
  case 1:
1704
1712
  result = (_a.sent())[0];
1705
- if (type === 'select') {
1713
+ if (method === 'GET') {
1706
1714
  console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", result);
1707
1715
  return [2 /*return*/, {
1708
1716
  rest: result.map(this.serialize),
@@ -1942,6 +1950,7 @@ exports.JoinBuilder = JoinBuilder;
1942
1950
  exports.POST = POST;
1943
1951
  exports.PUT = PUT;
1944
1952
  exports.PaginationBuilder = PaginationBuilder;
1953
+ exports.PostQueryBuilder = PostQueryBuilder;
1945
1954
  exports.SelectQueryBuilder = SelectQueryBuilder;
1946
1955
  exports.SqlExecutor = SqlExecutor;
1947
1956
  exports.TestRestfulResponse = TestRestfulResponse;