@carbonorm/carbonnode 3.3.10 → 3.4.1

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,6 +1,5 @@
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
4
  export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
6
5
  execute(): Promise<DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>>;
@@ -8,38 +7,23 @@ export declare class SqlExecutor<G extends OrmGenerics> extends Executor<G> {
8
7
  serialize: (row: any) => {
9
8
  [k: string]: unknown;
10
9
  };
11
- select(table: G['RestShortTableName'], primary: string | undefined, args: any): Promise<{
12
- rest: {
13
- [k: string]: unknown;
14
- }[];
10
+ formatSQLWithParams(sql: string, params: any[] | {
11
+ [key: string]: any;
12
+ }): string;
13
+ private formatValue;
14
+ runQuery(): Promise<{
15
+ rest: any;
15
16
  sql: {
16
17
  sql: any;
17
18
  values: any;
18
19
  };
19
- }>;
20
- insert(table: G['RestShortTableName'], data: Record<string, any>): Promise<{
21
- rest: ResultSetHeader;
20
+ affected?: undefined;
21
+ } | {
22
+ affected: any;
23
+ rest: never[];
22
24
  sql: {
23
- sql: string;
24
- placeholders: string;
25
- };
26
- }>;
27
- update(table: G['RestShortTableName'], primary: string[], data: Record<string, any>): Promise<{
28
- rest: ResultSetHeader;
29
- sql: {
30
- sql: string;
31
- values: any[];
32
- };
33
- }>;
34
- delete(table: G['RestShortTableName'], primary: string[], args: Record<string, any>): Promise<{
35
- rest: ResultSetHeader;
36
- sql: {
37
- sql: string;
38
- args: Record<string, any>;
25
+ sql: any;
26
+ values: any;
39
27
  };
40
28
  }>;
41
- formatSQLWithParams(sql: string, params: any[] | {
42
- [key: string]: any;
43
- }): string;
44
- private formatValue;
45
29
  }
@@ -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
  *
@@ -1,6 +1,6 @@
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): SqlBuilderResult;
6
6
  }
@@ -0,0 +1,8 @@
1
+ import { ConditionBuilder } from "../builders/ConditionBuilder";
2
+ import { OrmGenerics } from "../../types/ormGenerics";
3
+ export declare class PostQueryBuilder<G extends OrmGenerics> extends ConditionBuilder<G> {
4
+ build(table: string): {
5
+ sql: string;
6
+ params: any[];
7
+ };
8
+ }
@@ -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',
@@ -1368,6 +1369,52 @@ var JoinBuilder = /** @class */ (function (_super) {
1368
1369
  return JoinBuilder;
1369
1370
  }(ConditionBuilder));
1370
1371
 
1372
+ var DeleteQueryBuilder = /** @class */ (function (_super) {
1373
+ tslib.__extends(DeleteQueryBuilder, _super);
1374
+ function DeleteQueryBuilder() {
1375
+ return _super !== null && _super.apply(this, arguments) || this;
1376
+ }
1377
+ DeleteQueryBuilder.prototype.build = function (table) {
1378
+ var params = this.useNamedParams ? {} : [];
1379
+ var sql = "DELETE `".concat(table, "` FROM `").concat(table, "`");
1380
+ if (this.request.JOIN) {
1381
+ sql += this.buildJoinClauses(this.request.JOIN, params);
1382
+ }
1383
+ if (this.request.WHERE) {
1384
+ sql += this.buildWhereClause(this.request.WHERE, params);
1385
+ }
1386
+ return { sql: sql, params: params };
1387
+ };
1388
+ return DeleteQueryBuilder;
1389
+ }(JoinBuilder));
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.build = function (table) {
1397
+ var verb = C6C.REPLACE in this.request ? C6C.REPLACE : C6C.INSERT;
1398
+ var keys = Object.keys(verb in this.request ? this.request[verb] : this.request);
1399
+ var params = [];
1400
+ var placeholders = [];
1401
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
1402
+ var key = keys_1[_i];
1403
+ var value = this.request[key];
1404
+ var placeholder = this.addParam(params, key, value);
1405
+ placeholders.push(placeholder);
1406
+ }
1407
+ var sql = "".concat(verb, " INTO `").concat(table, "` (").concat(keys.map(function (k) { return "`".concat(k, "`"); }).join(', '), ")\nVALUES (").concat(placeholders.join(', '), ")");
1408
+ if (C6C.UPDATE in this.request) {
1409
+ var updateData = this.request[C6C.UPDATE];
1410
+ var updateClause = updateData.map(function (k) { return "`".concat(k, "` = VALUES(`").concat(k, "`)"); }).join(', ');
1411
+ sql += " ON DUPLICATE KEY UPDATE ".concat(updateClause);
1412
+ }
1413
+ return { sql: sql, params: params };
1414
+ };
1415
+ return PostQueryBuilder;
1416
+ }(ConditionBuilder));
1417
+
1371
1418
  var PaginationBuilder = /** @class */ (function (_super) {
1372
1419
  tslib.__extends(PaginationBuilder, _super);
1373
1420
  function PaginationBuilder() {
@@ -1428,10 +1475,11 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1428
1475
  function SelectQueryBuilder() {
1429
1476
  return _super !== null && _super.apply(this, arguments) || this;
1430
1477
  }
1431
- SelectQueryBuilder.prototype.build = function (table, args, primary, isSubSelect) {
1478
+ SelectQueryBuilder.prototype.build = function (table, isSubSelect) {
1432
1479
  var _this = this;
1433
1480
  var _a;
1434
1481
  if (isSubSelect === void 0) { isSubSelect = false; }
1482
+ var args = this.request;
1435
1483
  var params = this.useNamedParams ? {} : [];
1436
1484
  var selectList = (_a = args.SELECT) !== null && _a !== void 0 ? _a : ['*'];
1437
1485
  var selectFields = selectList
@@ -1457,13 +1505,45 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1457
1505
  sql += this.buildPaginationClause(args.PAGINATION);
1458
1506
  }
1459
1507
  else if (!isSubSelect) {
1460
- sql += primary ? " ORDER BY ".concat(primary, " ASC LIMIT 1") : " LIMIT 100";
1508
+ sql += " LIMIT 100";
1461
1509
  }
1462
1510
  return { sql: sql, params: params };
1463
1511
  };
1464
1512
  return SelectQueryBuilder;
1465
1513
  }(PaginationBuilder));
1466
1514
 
1515
+ var UpdateQueryBuilder = /** @class */ (function (_super) {
1516
+ tslib.__extends(UpdateQueryBuilder, _super);
1517
+ function UpdateQueryBuilder() {
1518
+ return _super !== null && _super.apply(this, arguments) || this;
1519
+ }
1520
+ UpdateQueryBuilder.prototype.build = function (table) {
1521
+ var _this = this;
1522
+ var args = this.request;
1523
+ var params = this.useNamedParams ? {} : [];
1524
+ var sql = "UPDATE `".concat(table, "`");
1525
+ if (args.JOIN) {
1526
+ sql += this.buildJoinClauses(args.JOIN, params);
1527
+ }
1528
+ if (!(C6C.UPDATE in this.request)) {
1529
+ throw new Error("No update data provided in the request.");
1530
+ }
1531
+ var setClauses = Object.entries(this.request[C6C.UPDATE]).map(function (_a) {
1532
+ var col = _a[0], val = _a[1];
1533
+ return _this.addParam(params, col, val);
1534
+ });
1535
+ sql += " SET ".concat(setClauses.join(', '));
1536
+ if (args.WHERE) {
1537
+ sql += this.buildWhereClause(args.WHERE, params);
1538
+ }
1539
+ if (args.PAGINATION) {
1540
+ sql += this.buildPaginationClause(args.PAGINATION);
1541
+ }
1542
+ return { sql: sql, params: params };
1543
+ };
1544
+ return UpdateQueryBuilder;
1545
+ }(PaginationBuilder));
1546
+
1467
1547
  var SqlExecutor = /** @class */ (function (_super) {
1468
1548
  tslib.__extends(SqlExecutor, _super);
1469
1549
  function SqlExecutor() {
@@ -1492,24 +1572,23 @@ var SqlExecutor = /** @class */ (function (_super) {
1492
1572
  case 'DELETE': return [3 /*break*/, 7];
1493
1573
  }
1494
1574
  return [3 /*break*/, 9];
1495
- case 1: return [4 /*yield*/, this.select(TABLE_NAME, undefined, this.request)];
1575
+ case 1: return [4 /*yield*/, this.runQuery()];
1496
1576
  case 2:
1497
1577
  rest = _b.sent();
1498
1578
  console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1499
1579
  return [2 /*return*/, rest];
1500
- case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1580
+ case 3: return [4 /*yield*/, this.runQuery()];
1501
1581
  case 4:
1502
1582
  result = _b.sent();
1503
1583
  console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1504
1584
  created = { rest: result, created: true };
1505
1585
  return [2 /*return*/, created];
1506
- case 5: return [4 /*yield*/, this.update(TABLE_NAME, [], this.request)];
1586
+ case 5: return [4 /*yield*/, this.runQuery()];
1507
1587
  case 6:
1508
1588
  result = _b.sent();
1509
- console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
1510
1589
  updated = tslib.__assign(tslib.__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
1511
1590
  return [2 /*return*/, updated];
1512
- case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1591
+ case 7: return [4 /*yield*/, this.runQuery()];
1513
1592
  case 8:
1514
1593
  result = _b.sent();
1515
1594
  console.log("[SQL EXECUTOR] \u2705 DELETE result:", result);
@@ -1549,150 +1628,6 @@ var SqlExecutor = /** @class */ (function (_super) {
1549
1628
  });
1550
1629
  });
1551
1630
  };
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
- SqlExecutor.prototype.insert = function (table, data) {
1589
- return tslib.__awaiter(this, void 0, void 0, function () {
1590
- var keys, values, placeholders, sql;
1591
- var _this = this;
1592
- return tslib.__generator(this, function (_a) {
1593
- switch (_a.label) {
1594
- case 0:
1595
- keys = Object.keys(data);
1596
- values = keys.map(function (k) { return data[k]; });
1597
- placeholders = keys.map(function () { return '?'; }).join(', ');
1598
- sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ")\n VALUES (").concat(placeholders, ")");
1599
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
1600
- console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1601
- return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1602
- var result;
1603
- return tslib.__generator(this, function (_a) {
1604
- switch (_a.label) {
1605
- case 0: return [4 /*yield*/, conn.execute(sql, values)];
1606
- case 1:
1607
- result = (_a.sent())[0];
1608
- return [2 /*return*/, {
1609
- rest: result,
1610
- sql: {
1611
- sql: sql,
1612
- placeholders: placeholders
1613
- }
1614
- }];
1615
- }
1616
- });
1617
- }); })];
1618
- case 1: return [2 /*return*/, _a.sent()];
1619
- }
1620
- });
1621
- });
1622
- };
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
1631
  SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
1697
1632
  var _this = this;
1698
1633
  if (Array.isArray(params)) {
@@ -1724,6 +1659,67 @@ var SqlExecutor = /** @class */ (function (_super) {
1724
1659
  return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1725
1660
  return "'".concat(JSON.stringify(val), "'");
1726
1661
  };
1662
+ SqlExecutor.prototype.runQuery = function () {
1663
+ return tslib.__awaiter(this, void 0, void 0, function () {
1664
+ var TABLE_NAME, method, builder, QueryResult, formatted, toUnnamed, _a, sql, values;
1665
+ var _this = this;
1666
+ return tslib.__generator(this, function (_b) {
1667
+ switch (_b.label) {
1668
+ case 0:
1669
+ TABLE_NAME = this.config.restModel.TABLE_NAME;
1670
+ method = this.config.requestMethod;
1671
+ switch (method) {
1672
+ case 'GET':
1673
+ builder = new SelectQueryBuilder(this.config, this.request);
1674
+ break;
1675
+ case 'PUT':
1676
+ builder = new UpdateQueryBuilder(this.config, this.request);
1677
+ break;
1678
+ case 'DELETE':
1679
+ builder = new DeleteQueryBuilder(this.config, this.request);
1680
+ break;
1681
+ case 'POST':
1682
+ builder = new PostQueryBuilder(this.config, this.request);
1683
+ break;
1684
+ default:
1685
+ throw new Error("Unsupported query method: ".concat(method));
1686
+ }
1687
+ QueryResult = builder.build(TABLE_NAME);
1688
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(method.toUpperCase(), " SQL:"), QueryResult);
1689
+ formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1690
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(method.toUpperCase(), " SQL:"), formatted);
1691
+ toUnnamed = namedPlaceholders();
1692
+ _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1693
+ return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1694
+ var result;
1695
+ return tslib.__generator(this, function (_a) {
1696
+ switch (_a.label) {
1697
+ case 0: return [4 /*yield*/, conn.query(sql, values)];
1698
+ case 1:
1699
+ result = (_a.sent())[0];
1700
+ if (method === 'GET') {
1701
+ console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", result);
1702
+ return [2 /*return*/, {
1703
+ rest: result.map(this.serialize),
1704
+ sql: { sql: sql, values: values }
1705
+ }];
1706
+ }
1707
+ else {
1708
+ console.log("[SQL EXECUTOR] \u270F\uFE0F Rows affected:", result.affectedRows);
1709
+ return [2 /*return*/, {
1710
+ affected: result.affectedRows,
1711
+ rest: [],
1712
+ sql: { sql: sql, values: values }
1713
+ }];
1714
+ }
1715
+ }
1716
+ });
1717
+ }); })];
1718
+ case 1: return [2 /*return*/, _b.sent()];
1719
+ }
1720
+ });
1721
+ });
1722
+ };
1727
1723
  return SqlExecutor;
1728
1724
  }(Executor));
1729
1725
 
@@ -1738,7 +1734,7 @@ function ExpressHandler(_a) {
1738
1734
  var _this = this;
1739
1735
  var C6 = _a.C6, mysqlPool = _a.mysqlPool;
1740
1736
  return function (req, res, next) { return tslib.__awaiter(_this, void 0, void 0, function () {
1741
- var method, table, primary, payload, response, err_1;
1737
+ var method, table, primary, payload, primaryKeys, primaryKeyName, response, err_1;
1742
1738
  return tslib.__generator(this, function (_a) {
1743
1739
  switch (_a.label) {
1744
1740
  case 0:
@@ -1751,18 +1747,36 @@ function ExpressHandler(_a) {
1751
1747
  res.status(400).json({ error: "Invalid table: ".concat(table) });
1752
1748
  return [2 /*return*/];
1753
1749
  }
1750
+ primaryKeys = C6.TABLES[table].PRIMARY;
1751
+ if (primary && primaryKeys.length !== 1) {
1752
+ if (primaryKeys.length > 1) {
1753
+ res.status(400).json({ error: "Table ".concat(table, " has multiple primary keys. Cannot implicitly determine key.") });
1754
+ return [2 /*return*/];
1755
+ }
1756
+ res.status(400).json({
1757
+ error: "Table ".concat(table, " has no primary keys. Please specify one.")
1758
+ });
1759
+ return [2 /*return*/];
1760
+ }
1761
+ primaryKeyName = primaryKeys[0];
1754
1762
  // 👇 Call restRequest for the resolved method
1755
1763
  // TODO - add primary conditionally based on method signature
1756
1764
  switch (method) {
1757
1765
  case 'GET':
1758
1766
  if (primary) {
1759
- payload['primary'] = primary;
1767
+ payload[C6C.WHERE][primaryKeyName] = primary;
1760
1768
  }
1761
1769
  break;
1762
- case 'POST':
1763
1770
  case 'PUT':
1764
1771
  case 'DELETE':
1765
- payload['primary'] = primary;
1772
+ if (primary) {
1773
+ payload[C6C.WHERE][primaryKeyName] = primary;
1774
+ }
1775
+ else {
1776
+ res.status(400).json({ error: "Invalid request: ".concat(method, " requires a primary key.") });
1777
+ }
1778
+ break;
1779
+ case 'POST':
1766
1780
  break;
1767
1781
  default:
1768
1782
  res.status(405).json({ error: "Method ".concat(method, " not allowed") });
@@ -1809,65 +1823,6 @@ var distSphere = function (fromCol, toCol, fromAlias, toAlias) {
1809
1823
  return [C6C.ST_DISTANCE_SPHERE, F(fromCol, fromAlias), F(toCol, toAlias)];
1810
1824
  };
1811
1825
 
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
1826
  function determineRuntimeJsType(mysqlType) {
1872
1827
  var base = mysqlType.toLowerCase().split('(')[0];
1873
1828
  if ([
@@ -1982,6 +1937,7 @@ exports.JoinBuilder = JoinBuilder;
1982
1937
  exports.POST = POST;
1983
1938
  exports.PUT = PUT;
1984
1939
  exports.PaginationBuilder = PaginationBuilder;
1940
+ exports.PostQueryBuilder = PostQueryBuilder;
1985
1941
  exports.SelectQueryBuilder = SelectQueryBuilder;
1986
1942
  exports.SqlExecutor = SqlExecutor;
1987
1943
  exports.TestRestfulResponse = TestRestfulResponse;