@carbonorm/carbonnode 3.3.10 → 3.4.0

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.
@@ -2,21 +2,13 @@ import { OrmGenerics } from "../types/ormGenerics";
2
2
  import { DetermineResponseDataType } from "../types/ormInterfaces";
3
3
  import { ResultSetHeader } from 'mysql2/promise';
4
4
  import { Executor } from "./Executor";
5
+ type QueryType = 'select' | 'update' | 'delete';
5
6
  export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
6
7
  execute(): Promise<DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>>;
7
8
  private withConnection;
8
9
  serialize: (row: any) => {
9
10
  [k: string]: unknown;
10
11
  };
11
- select(table: G['RestShortTableName'], primary: string | undefined, args: any): Promise<{
12
- rest: {
13
- [k: string]: unknown;
14
- }[];
15
- sql: {
16
- sql: any;
17
- values: any;
18
- };
19
- }>;
20
12
  insert(table: G['RestShortTableName'], data: Record<string, any>): Promise<{
21
13
  rest: ResultSetHeader;
22
14
  sql: {
@@ -24,22 +16,24 @@ export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
24
16
  placeholders: string;
25
17
  };
26
18
  }>;
27
- update(table: G['RestShortTableName'], primary: string[], data: Record<string, any>): Promise<{
28
- rest: ResultSetHeader;
19
+ formatSQLWithParams(sql: string, params: any[] | {
20
+ [key: string]: any;
21
+ }): string;
22
+ private formatValue;
23
+ runQuery(type: QueryType, table: G['RestShortTableName'], args: any): Promise<{
24
+ rest: any;
29
25
  sql: {
30
- sql: string;
31
- values: any[];
26
+ sql: any;
27
+ values: any;
32
28
  };
33
- }>;
34
- delete(table: G['RestShortTableName'], primary: string[], args: Record<string, any>): Promise<{
35
- rest: ResultSetHeader;
29
+ affected?: undefined;
30
+ } | {
31
+ affected: any;
32
+ rest: never[];
36
33
  sql: {
37
- sql: string;
38
- args: Record<string, any>;
34
+ sql: any;
35
+ values: any;
39
36
  };
40
37
  }>;
41
- formatSQLWithParams(sql: string, params: any[] | {
42
- [key: string]: any;
43
- }): string;
44
- private formatValue;
45
38
  }
39
+ export {};
@@ -1,6 +1,9 @@
1
1
  import { OrmGenerics } from "../../types/ormGenerics";
2
- import { PaginationBuilder } from "../builders/PaginationBuilder";
3
2
  import { SqlBuilderResult } from "../utils/sqlUtils";
4
- export declare class DeleteQueryBuilder<G extends OrmGenerics> extends PaginationBuilder<G> {
5
- build(table: string, args?: any): SqlBuilderResult;
3
+ import { JoinBuilder } from "../builders/JoinBuilder";
4
+ export declare class DeleteQueryBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
5
+ build(table: string, args: {
6
+ JOIN?: any;
7
+ WHERE?: any;
8
+ }): SqlBuilderResult;
6
9
  }
package/dist/index.cjs.js CHANGED
@@ -1368,6 +1368,25 @@ var JoinBuilder = /** @class */ (function (_super) {
1368
1368
  return JoinBuilder;
1369
1369
  }(ConditionBuilder));
1370
1370
 
1371
+ var DeleteQueryBuilder = /** @class */ (function (_super) {
1372
+ tslib.__extends(DeleteQueryBuilder, _super);
1373
+ function DeleteQueryBuilder() {
1374
+ return _super !== null && _super.apply(this, arguments) || this;
1375
+ }
1376
+ DeleteQueryBuilder.prototype.build = function (table, args) {
1377
+ var params = this.useNamedParams ? {} : [];
1378
+ var sql = "DELETE `".concat(table, "` FROM `").concat(table, "`");
1379
+ if (args.JOIN) {
1380
+ sql += this.buildJoinClauses(args.JOIN, params);
1381
+ }
1382
+ if (args.WHERE) {
1383
+ sql += this.buildWhereClause(args.WHERE, params);
1384
+ }
1385
+ return { sql: sql, params: params };
1386
+ };
1387
+ return DeleteQueryBuilder;
1388
+ }(JoinBuilder));
1389
+
1371
1390
  var PaginationBuilder = /** @class */ (function (_super) {
1372
1391
  tslib.__extends(PaginationBuilder, _super);
1373
1392
  function PaginationBuilder() {
@@ -1464,6 +1483,42 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1464
1483
  return SelectQueryBuilder;
1465
1484
  }(PaginationBuilder));
1466
1485
 
1486
+ var UpdateQueryBuilder = /** @class */ (function (_super) {
1487
+ tslib.__extends(UpdateQueryBuilder, _super);
1488
+ function UpdateQueryBuilder() {
1489
+ return _super !== null && _super.apply(this, arguments) || this;
1490
+ }
1491
+ UpdateQueryBuilder.prototype.build = function (table, data, args) {
1492
+ if (args === void 0) { args = {}; }
1493
+ var params = this.useNamedParams ? {} : [];
1494
+ var sql = "UPDATE `".concat(table, "`");
1495
+ if (args.JOIN) {
1496
+ sql += this.buildJoinClauses(args.JOIN, params);
1497
+ }
1498
+ var setClauses = Object.entries(data).map(function (_a) {
1499
+ 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
+ }
1509
+ });
1510
+ sql += " SET ".concat(setClauses.join(', '));
1511
+ if (args.WHERE) {
1512
+ sql += this.buildWhereClause(args.WHERE, params);
1513
+ }
1514
+ if (args.PAGINATION) {
1515
+ sql += this.buildPaginationClause(args.PAGINATION);
1516
+ }
1517
+ return { sql: sql, params: params };
1518
+ };
1519
+ return UpdateQueryBuilder;
1520
+ }(PaginationBuilder));
1521
+
1467
1522
  var SqlExecutor = /** @class */ (function (_super) {
1468
1523
  tslib.__extends(SqlExecutor, _super);
1469
1524
  function SqlExecutor() {
@@ -1492,7 +1547,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1492
1547
  case 'DELETE': return [3 /*break*/, 7];
1493
1548
  }
1494
1549
  return [3 /*break*/, 9];
1495
- case 1: return [4 /*yield*/, this.select(TABLE_NAME, undefined, this.request)];
1550
+ case 1: return [4 /*yield*/, this.runQuery('select', TABLE_NAME, this.request)];
1496
1551
  case 2:
1497
1552
  rest = _b.sent();
1498
1553
  console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
@@ -1503,13 +1558,12 @@ var SqlExecutor = /** @class */ (function (_super) {
1503
1558
  console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1504
1559
  created = { rest: result, created: true };
1505
1560
  return [2 /*return*/, created];
1506
- case 5: return [4 /*yield*/, this.update(TABLE_NAME, [], this.request)];
1561
+ case 5: return [4 /*yield*/, this.runQuery('update', TABLE_NAME, this.request)];
1507
1562
  case 6:
1508
1563
  result = _b.sent();
1509
- console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
1510
1564
  updated = tslib.__assign(tslib.__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
1511
1565
  return [2 /*return*/, updated];
1512
- case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1566
+ case 7: return [4 /*yield*/, this.runQuery('delete', TABLE_NAME, this.request)];
1513
1567
  case 8:
1514
1568
  result = _b.sent();
1515
1569
  console.log("[SQL EXECUTOR] \u2705 DELETE result:", result);
@@ -1549,42 +1603,6 @@ var SqlExecutor = /** @class */ (function (_super) {
1549
1603
  });
1550
1604
  });
1551
1605
  };
1552
- SqlExecutor.prototype.select = function (table, primary, args) {
1553
- return tslib.__awaiter(this, void 0, void 0, function () {
1554
- var QueryResult, formatted, toUnnamed, _a, sql, values;
1555
- var _this = this;
1556
- return tslib.__generator(this, function (_b) {
1557
- switch (_b.label) {
1558
- case 0:
1559
- QueryResult = (new SelectQueryBuilder(this.config, this.request)).build(table, args, primary);
1560
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:", QueryResult);
1561
- formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1562
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted SELECT SQL:", formatted);
1563
- toUnnamed = namedPlaceholders();
1564
- _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1565
- return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1566
- var rows;
1567
- return tslib.__generator(this, function (_a) {
1568
- switch (_a.label) {
1569
- case 0: return [4 /*yield*/, conn.query(sql, values)];
1570
- case 1:
1571
- rows = (_a.sent())[0];
1572
- console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
1573
- return [2 /*return*/, {
1574
- rest: rows.map(this.serialize),
1575
- sql: {
1576
- sql: sql,
1577
- values: values
1578
- }
1579
- }];
1580
- }
1581
- });
1582
- }); })];
1583
- case 1: return [2 /*return*/, _b.sent()];
1584
- }
1585
- });
1586
- });
1587
- };
1588
1606
  SqlExecutor.prototype.insert = function (table, data) {
1589
1607
  return tslib.__awaiter(this, void 0, void 0, function () {
1590
1608
  var keys, values, placeholders, sql;
@@ -1620,79 +1638,6 @@ var SqlExecutor = /** @class */ (function (_super) {
1620
1638
  });
1621
1639
  });
1622
1640
  };
1623
- SqlExecutor.prototype.update = function (table, primary, data) {
1624
- return tslib.__awaiter(this, void 0, void 0, function () {
1625
- var keys, values, updates, sql;
1626
- var _this = this;
1627
- return tslib.__generator(this, function (_a) {
1628
- switch (_a.label) {
1629
- case 0:
1630
- if (!(primary === null || primary === void 0 ? void 0 : primary.length))
1631
- throw new Error('Primary key is required for update');
1632
- keys = Object.keys(data);
1633
- values = keys.map(function (k) { return data[k]; });
1634
- updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1635
- sql = "UPDATE `".concat(table, "`\n SET ").concat(updates, "\n WHERE `").concat(primary[0], "` = ?");
1636
- values.push(data[primary[0]]);
1637
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated UPDATE SQL:", sql);
1638
- console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1639
- return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1640
- var result;
1641
- return tslib.__generator(this, function (_a) {
1642
- switch (_a.label) {
1643
- case 0: return [4 /*yield*/, conn.execute(sql, values)];
1644
- case 1:
1645
- result = (_a.sent())[0];
1646
- return [2 /*return*/, {
1647
- rest: result,
1648
- sql: {
1649
- sql: sql,
1650
- values: values
1651
- }
1652
- }];
1653
- }
1654
- });
1655
- }); })];
1656
- case 1: return [2 /*return*/, _a.sent()];
1657
- }
1658
- });
1659
- });
1660
- };
1661
- SqlExecutor.prototype.delete = function (table, primary, args) {
1662
- return tslib.__awaiter(this, void 0, void 0, function () {
1663
- var key, sql;
1664
- var _this = this;
1665
- return tslib.__generator(this, function (_a) {
1666
- switch (_a.label) {
1667
- case 0:
1668
- key = primary === null || primary === void 0 ? void 0 : primary[0];
1669
- if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1670
- throw new Error('Primary key and value required for delete');
1671
- sql = "DELETE\n FROM `".concat(table, "`\n WHERE `").concat(key, "` = ?");
1672
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated DELETE SQL:", sql);
1673
- console.log("[SQL EXECUTOR] \uD83D\uDD22 Value:", args[key]);
1674
- return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1675
- var result;
1676
- return tslib.__generator(this, function (_a) {
1677
- switch (_a.label) {
1678
- case 0: return [4 /*yield*/, conn.execute(sql, [args[key]])];
1679
- case 1:
1680
- result = (_a.sent())[0];
1681
- return [2 /*return*/, {
1682
- rest: result,
1683
- sql: {
1684
- sql: sql,
1685
- args: args
1686
- }
1687
- }];
1688
- }
1689
- });
1690
- }); })];
1691
- case 1: return [2 /*return*/, _a.sent()];
1692
- }
1693
- });
1694
- });
1695
- };
1696
1641
  SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
1697
1642
  var _this = this;
1698
1643
  if (Array.isArray(params)) {
@@ -1724,6 +1669,62 @@ var SqlExecutor = /** @class */ (function (_super) {
1724
1669
  return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1725
1670
  return "'".concat(JSON.stringify(val), "'");
1726
1671
  };
1672
+ SqlExecutor.prototype.runQuery = function (type, table, args) {
1673
+ return tslib.__awaiter(this, void 0, void 0, function () {
1674
+ var builder, QueryResult, formatted, toUnnamed, _a, sql, values;
1675
+ var _this = this;
1676
+ return tslib.__generator(this, function (_b) {
1677
+ switch (_b.label) {
1678
+ case 0:
1679
+ switch (type) {
1680
+ case 'select':
1681
+ builder = new SelectQueryBuilder(this.config, this.request);
1682
+ break;
1683
+ case 'update':
1684
+ builder = new UpdateQueryBuilder(this.config, this.request);
1685
+ break;
1686
+ case 'delete':
1687
+ builder = new DeleteQueryBuilder(this.config, this.request);
1688
+ break;
1689
+ default:
1690
+ throw new Error("Unsupported query type: ".concat(type));
1691
+ }
1692
+ QueryResult = builder.build(table, args);
1693
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(type.toUpperCase(), " SQL:"), QueryResult);
1694
+ formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1695
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(type.toUpperCase(), " SQL:"), formatted);
1696
+ toUnnamed = namedPlaceholders();
1697
+ _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1698
+ return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1699
+ var result;
1700
+ return tslib.__generator(this, function (_a) {
1701
+ switch (_a.label) {
1702
+ case 0: return [4 /*yield*/, conn.query(sql, values)];
1703
+ case 1:
1704
+ result = (_a.sent())[0];
1705
+ if (type === 'select') {
1706
+ console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", result);
1707
+ return [2 /*return*/, {
1708
+ rest: result.map(this.serialize),
1709
+ sql: { sql: sql, values: values }
1710
+ }];
1711
+ }
1712
+ else {
1713
+ console.log("[SQL EXECUTOR] \u270F\uFE0F Rows affected:", result.affectedRows);
1714
+ return [2 /*return*/, {
1715
+ affected: result.affectedRows,
1716
+ rest: [],
1717
+ sql: { sql: sql, values: values }
1718
+ }];
1719
+ }
1720
+ }
1721
+ });
1722
+ }); })];
1723
+ case 1: return [2 /*return*/, _b.sent()];
1724
+ }
1725
+ });
1726
+ });
1727
+ };
1727
1728
  return SqlExecutor;
1728
1729
  }(Executor));
1729
1730
 
@@ -1738,7 +1739,7 @@ function ExpressHandler(_a) {
1738
1739
  var _this = this;
1739
1740
  var C6 = _a.C6, mysqlPool = _a.mysqlPool;
1740
1741
  return function (req, res, next) { return tslib.__awaiter(_this, void 0, void 0, function () {
1741
- var method, table, primary, payload, response, err_1;
1742
+ var method, table, primary, payload, primaryKeys, primaryKeyName, response, err_1;
1742
1743
  return tslib.__generator(this, function (_a) {
1743
1744
  switch (_a.label) {
1744
1745
  case 0:
@@ -1751,18 +1752,36 @@ function ExpressHandler(_a) {
1751
1752
  res.status(400).json({ error: "Invalid table: ".concat(table) });
1752
1753
  return [2 /*return*/];
1753
1754
  }
1755
+ primaryKeys = C6.TABLES[table].PRIMARY;
1756
+ if (primary && primaryKeys.length !== 1) {
1757
+ if (primaryKeys.length > 1) {
1758
+ res.status(400).json({ error: "Table ".concat(table, " has multiple primary keys. Cannot implicitly determine key.") });
1759
+ return [2 /*return*/];
1760
+ }
1761
+ res.status(400).json({
1762
+ error: "Table ".concat(table, " has no primary keys. Please specify one.")
1763
+ });
1764
+ return [2 /*return*/];
1765
+ }
1766
+ primaryKeyName = primaryKeys[0];
1754
1767
  // 👇 Call restRequest for the resolved method
1755
1768
  // TODO - add primary conditionally based on method signature
1756
1769
  switch (method) {
1757
1770
  case 'GET':
1758
1771
  if (primary) {
1759
- payload['primary'] = primary;
1772
+ payload[C6C.WHERE][primaryKeyName] = primary;
1760
1773
  }
1761
1774
  break;
1762
- case 'POST':
1763
1775
  case 'PUT':
1764
1776
  case 'DELETE':
1765
- payload['primary'] = primary;
1777
+ if (primary) {
1778
+ payload[C6C.WHERE][primaryKeyName] = primary;
1779
+ }
1780
+ else {
1781
+ res.status(400).json({ error: "Invalid request: ".concat(method, " requires a primary key.") });
1782
+ }
1783
+ break;
1784
+ case 'POST':
1766
1785
  break;
1767
1786
  default:
1768
1787
  res.status(405).json({ error: "Method ".concat(method, " not allowed") });
@@ -1809,65 +1828,6 @@ var distSphere = function (fromCol, toCol, fromAlias, toAlias) {
1809
1828
  return [C6C.ST_DISTANCE_SPHERE, F(fromCol, fromAlias), F(toCol, toAlias)];
1810
1829
  };
1811
1830
 
1812
- var DeleteQueryBuilder = /** @class */ (function (_super) {
1813
- tslib.__extends(DeleteQueryBuilder, _super);
1814
- function DeleteQueryBuilder() {
1815
- return _super !== null && _super.apply(this, arguments) || this;
1816
- }
1817
- DeleteQueryBuilder.prototype.build = function (table, args) {
1818
- if (args === void 0) { args = {}; }
1819
- var params = this.useNamedParams ? {} : [];
1820
- var sql = args.JOIN ? "DELETE ".concat(table, "\n FROM `").concat(table, "`") : "DELETE\n FROM `".concat(table, "`");
1821
- if (args.JOIN) {
1822
- sql += this.buildJoinClauses(args.JOIN, params);
1823
- }
1824
- if (args.WHERE) {
1825
- sql += this.buildWhereClause(args.WHERE, params);
1826
- }
1827
- if (args.PAGINATION) {
1828
- sql += this.buildPaginationClause(args.PAGINATION);
1829
- }
1830
- return { sql: sql, params: params };
1831
- };
1832
- return DeleteQueryBuilder;
1833
- }(PaginationBuilder));
1834
-
1835
- var UpdateQueryBuilder = /** @class */ (function (_super) {
1836
- tslib.__extends(UpdateQueryBuilder, _super);
1837
- function UpdateQueryBuilder() {
1838
- return _super !== null && _super.apply(this, arguments) || this;
1839
- }
1840
- UpdateQueryBuilder.prototype.build = function (table, data, args) {
1841
- if (args === void 0) { args = {}; }
1842
- var params = this.useNamedParams ? {} : [];
1843
- var sql = "UPDATE `".concat(table, "`");
1844
- if (args.JOIN) {
1845
- sql += this.buildJoinClauses(args.JOIN, params);
1846
- }
1847
- var setClauses = Object.entries(data).map(function (_a) {
1848
- var col = _a[0], val = _a[1];
1849
- if (Array.isArray(params)) {
1850
- params.push(val);
1851
- return "`".concat(col, "` = ?");
1852
- }
1853
- else {
1854
- var key = "param".concat(Object.keys(params).length);
1855
- params[key] = val;
1856
- return "`".concat(col, "` = :").concat(key);
1857
- }
1858
- });
1859
- sql += " SET ".concat(setClauses.join(', '));
1860
- if (args.WHERE) {
1861
- sql += this.buildWhereClause(args.WHERE, params);
1862
- }
1863
- if (args.PAGINATION) {
1864
- sql += this.buildPaginationClause(args.PAGINATION);
1865
- }
1866
- return { sql: sql, params: params };
1867
- };
1868
- return UpdateQueryBuilder;
1869
- }(PaginationBuilder));
1870
-
1871
1831
  function determineRuntimeJsType(mysqlType) {
1872
1832
  var base = mysqlType.toLowerCase().split('(')[0];
1873
1833
  if ([