@carbonorm/carbonnode 3.4.0 → 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,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,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',
@@ -1373,20 +1374,47 @@ 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.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
+
1390
1418
  var PaginationBuilder = /** @class */ (function (_super) {
1391
1419
  tslib.__extends(PaginationBuilder, _super);
1392
1420
  function PaginationBuilder() {
@@ -1447,10 +1475,11 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1447
1475
  function SelectQueryBuilder() {
1448
1476
  return _super !== null && _super.apply(this, arguments) || this;
1449
1477
  }
1450
- SelectQueryBuilder.prototype.build = function (table, args, primary, isSubSelect) {
1478
+ SelectQueryBuilder.prototype.build = function (table, isSubSelect) {
1451
1479
  var _this = this;
1452
1480
  var _a;
1453
1481
  if (isSubSelect === void 0) { isSubSelect = false; }
1482
+ var args = this.request;
1454
1483
  var params = this.useNamedParams ? {} : [];
1455
1484
  var selectList = (_a = args.SELECT) !== null && _a !== void 0 ? _a : ['*'];
1456
1485
  var selectFields = selectList
@@ -1476,7 +1505,7 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
1476
1505
  sql += this.buildPaginationClause(args.PAGINATION);
1477
1506
  }
1478
1507
  else if (!isSubSelect) {
1479
- sql += primary ? " ORDER BY ".concat(primary, " ASC LIMIT 1") : " LIMIT 100";
1508
+ sql += " LIMIT 100";
1480
1509
  }
1481
1510
  return { sql: sql, params: params };
1482
1511
  };
@@ -1488,24 +1517,20 @@ var UpdateQueryBuilder = /** @class */ (function (_super) {
1488
1517
  function UpdateQueryBuilder() {
1489
1518
  return _super !== null && _super.apply(this, arguments) || this;
1490
1519
  }
1491
- UpdateQueryBuilder.prototype.build = function (table, data, args) {
1492
- if (args === void 0) { args = {}; }
1520
+ UpdateQueryBuilder.prototype.build = function (table) {
1521
+ var _this = this;
1522
+ var args = this.request;
1493
1523
  var params = this.useNamedParams ? {} : [];
1494
1524
  var sql = "UPDATE `".concat(table, "`");
1495
1525
  if (args.JOIN) {
1496
1526
  sql += this.buildJoinClauses(args.JOIN, params);
1497
1527
  }
1498
- var setClauses = Object.entries(data).map(function (_a) {
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) {
1499
1532
  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
- }
1533
+ return _this.addParam(params, col, val);
1509
1534
  });
1510
1535
  sql += " SET ".concat(setClauses.join(', '));
1511
1536
  if (args.WHERE) {
@@ -1547,23 +1572,23 @@ var SqlExecutor = /** @class */ (function (_super) {
1547
1572
  case 'DELETE': return [3 /*break*/, 7];
1548
1573
  }
1549
1574
  return [3 /*break*/, 9];
1550
- case 1: return [4 /*yield*/, this.runQuery('select', TABLE_NAME, this.request)];
1575
+ case 1: return [4 /*yield*/, this.runQuery()];
1551
1576
  case 2:
1552
1577
  rest = _b.sent();
1553
1578
  console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1554
1579
  return [2 /*return*/, rest];
1555
- case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1580
+ case 3: return [4 /*yield*/, this.runQuery()];
1556
1581
  case 4:
1557
1582
  result = _b.sent();
1558
1583
  console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1559
1584
  created = { rest: result, created: true };
1560
1585
  return [2 /*return*/, created];
1561
- case 5: return [4 /*yield*/, this.runQuery('update', TABLE_NAME, this.request)];
1586
+ case 5: return [4 /*yield*/, this.runQuery()];
1562
1587
  case 6:
1563
1588
  result = _b.sent();
1564
1589
  updated = tslib.__assign(tslib.__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
1565
1590
  return [2 /*return*/, updated];
1566
- case 7: return [4 /*yield*/, this.runQuery('delete', TABLE_NAME, this.request)];
1591
+ case 7: return [4 /*yield*/, this.runQuery()];
1567
1592
  case 8:
1568
1593
  result = _b.sent();
1569
1594
  console.log("[SQL EXECUTOR] \u2705 DELETE result:", result);
@@ -1603,41 +1628,6 @@ var SqlExecutor = /** @class */ (function (_super) {
1603
1628
  });
1604
1629
  });
1605
1630
  };
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
1631
  SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
1642
1632
  var _this = this;
1643
1633
  if (Array.isArray(params)) {
@@ -1669,30 +1659,35 @@ var SqlExecutor = /** @class */ (function (_super) {
1669
1659
  return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1670
1660
  return "'".concat(JSON.stringify(val), "'");
1671
1661
  };
1672
- SqlExecutor.prototype.runQuery = function (type, table, args) {
1662
+ SqlExecutor.prototype.runQuery = function () {
1673
1663
  return tslib.__awaiter(this, void 0, void 0, function () {
1674
- var builder, QueryResult, formatted, toUnnamed, _a, sql, values;
1664
+ var TABLE_NAME, method, builder, QueryResult, formatted, toUnnamed, _a, sql, values;
1675
1665
  var _this = this;
1676
1666
  return tslib.__generator(this, function (_b) {
1677
1667
  switch (_b.label) {
1678
1668
  case 0:
1679
- switch (type) {
1680
- case 'select':
1669
+ TABLE_NAME = this.config.restModel.TABLE_NAME;
1670
+ method = this.config.requestMethod;
1671
+ switch (method) {
1672
+ case 'GET':
1681
1673
  builder = new SelectQueryBuilder(this.config, this.request);
1682
1674
  break;
1683
- case 'update':
1675
+ case 'PUT':
1684
1676
  builder = new UpdateQueryBuilder(this.config, this.request);
1685
1677
  break;
1686
- case 'delete':
1678
+ case 'DELETE':
1687
1679
  builder = new DeleteQueryBuilder(this.config, this.request);
1688
1680
  break;
1681
+ case 'POST':
1682
+ builder = new PostQueryBuilder(this.config, this.request);
1683
+ break;
1689
1684
  default:
1690
- throw new Error("Unsupported query type: ".concat(type));
1685
+ throw new Error("Unsupported query method: ".concat(method));
1691
1686
  }
1692
- QueryResult = builder.build(table, args);
1693
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(type.toUpperCase(), " SQL:"), QueryResult);
1687
+ QueryResult = builder.build(TABLE_NAME);
1688
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(method.toUpperCase(), " SQL:"), QueryResult);
1694
1689
  formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1695
- console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(type.toUpperCase(), " SQL:"), formatted);
1690
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(method.toUpperCase(), " SQL:"), formatted);
1696
1691
  toUnnamed = namedPlaceholders();
1697
1692
  _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1698
1693
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
@@ -1702,7 +1697,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1702
1697
  case 0: return [4 /*yield*/, conn.query(sql, values)];
1703
1698
  case 1:
1704
1699
  result = (_a.sent())[0];
1705
- if (type === 'select') {
1700
+ if (method === 'GET') {
1706
1701
  console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", result);
1707
1702
  return [2 /*return*/, {
1708
1703
  rest: result.map(this.serialize),
@@ -1942,6 +1937,7 @@ exports.JoinBuilder = JoinBuilder;
1942
1937
  exports.POST = POST;
1943
1938
  exports.PUT = PUT;
1944
1939
  exports.PaginationBuilder = PaginationBuilder;
1940
+ exports.PostQueryBuilder = PostQueryBuilder;
1945
1941
  exports.SelectQueryBuilder = SelectQueryBuilder;
1946
1942
  exports.SqlExecutor = SqlExecutor;
1947
1943
  exports.TestRestfulResponse = TestRestfulResponse;