@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.
- package/dist/api/C6Constants.d.ts +2 -0
- package/dist/api/executors/SqlExecutor.d.ts +12 -28
- package/dist/api/orm/builders/ConditionBuilder.d.ts +4 -2
- package/dist/api/orm/builders/JoinBuilder.d.ts +1 -1
- package/dist/api/orm/builders/PaginationBuilder.d.ts +1 -1
- package/dist/api/orm/queries/DeleteQueryBuilder.d.ts +3 -3
- package/dist/api/orm/queries/PostQueryBuilder.d.ts +8 -0
- package/dist/api/orm/queries/SelectQueryBuilder.d.ts +1 -1
- package/dist/api/orm/queries/UpdateQueryBuilder.d.ts +1 -1
- package/dist/api/types/ormInterfaces.d.ts +1 -1
- package/dist/index.cjs.js +170 -214
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +170 -215
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/api/C6Constants.ts +1 -0
- package/src/api/executors/SqlExecutor.ts +61 -91
- package/src/api/handlers/ExpressHandler.ts +23 -3
- package/src/api/orm/builders/ConditionBuilder.ts +6 -3
- package/src/api/orm/builders/JoinBuilder.ts +1 -1
- package/src/api/orm/builders/PaginationBuilder.ts +1 -1
- package/src/api/orm/queries/DeleteQueryBuilder.ts +13 -18
- package/src/api/orm/queries/PostQueryBuilder.ts +29 -0
- package/src/api/orm/queries/SelectQueryBuilder.ts +2 -4
- package/src/api/orm/queries/UpdateQueryBuilder.ts +7 -12
- package/src/api/types/ormInterfaces.ts +3 -1
- package/src/index.ts +1 -0
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
21
|
-
|
|
20
|
+
affected?: undefined;
|
|
21
|
+
} | {
|
|
22
|
+
affected: any;
|
|
23
|
+
rest: never[];
|
|
22
24
|
sql: {
|
|
23
|
-
sql:
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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,
|
|
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
|
|
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,
|
|
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 +=
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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[
|
|
1767
|
+
payload[C6C.WHERE][primaryKeyName] = primary;
|
|
1760
1768
|
}
|
|
1761
1769
|
break;
|
|
1762
|
-
case 'POST':
|
|
1763
1770
|
case 'PUT':
|
|
1764
1771
|
case 'DELETE':
|
|
1765
|
-
|
|
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;
|