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