@klapeks/micro-db-utils 0.0.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.
Files changed (49) hide show
  1. package/dist/backups/mysql.backup.d.ts +7 -0
  2. package/dist/backups/mysql.backup.js +156 -0
  3. package/dist/connections/cloud/s3.d.ts +23 -0
  4. package/dist/connections/cloud/s3.js +169 -0
  5. package/dist/connections/index.d.ts +5 -0
  6. package/dist/connections/index.js +25 -0
  7. package/dist/connections/kafka/index.d.ts +3 -0
  8. package/dist/connections/kafka/index.js +21 -0
  9. package/dist/connections/kafka/kafka.consumer.d.ts +13 -0
  10. package/dist/connections/kafka/kafka.consumer.js +128 -0
  11. package/dist/connections/kafka/kafka.d.ts +16 -0
  12. package/dist/connections/kafka/kafka.js +205 -0
  13. package/dist/connections/kafka/kafka.producer.d.ts +11 -0
  14. package/dist/connections/kafka/kafka.producer.js +101 -0
  15. package/dist/connections/mysql.connection.d.ts +15 -0
  16. package/dist/connections/mysql.connection.js +165 -0
  17. package/dist/connections/nosql/mongo.d.ts +56 -0
  18. package/dist/connections/nosql/mongo.js +192 -0
  19. package/dist/connections/nosql/redis.d.ts +310 -0
  20. package/dist/connections/nosql/redis.js +129 -0
  21. package/dist/connections/quiet.require.d.ts +1 -0
  22. package/dist/connections/quiet.require.js +12 -0
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.js +20 -0
  25. package/dist/migrations/index.d.ts +1 -0
  26. package/dist/migrations/index.js +17 -0
  27. package/dist/migrations/mysql.migrations.d.ts +6 -0
  28. package/dist/migrations/mysql.migrations.js +220 -0
  29. package/dist/selectors/abstract.select.handler.d.ts +26 -0
  30. package/dist/selectors/abstract.select.handler.js +202 -0
  31. package/dist/selectors/index.d.ts +3 -0
  32. package/dist/selectors/index.js +19 -0
  33. package/dist/selectors/raw-mysql.select.handler.d.ts +17 -0
  34. package/dist/selectors/raw-mysql.select.handler.js +149 -0
  35. package/dist/selectors/typeorm.select.handler.d.ts +21 -0
  36. package/dist/selectors/typeorm.select.handler.js +187 -0
  37. package/dist/utils/columns.types.d.ts +100 -0
  38. package/dist/utils/columns.types.js +29 -0
  39. package/dist/utils/index.d.ts +3 -0
  40. package/dist/utils/index.js +21 -0
  41. package/dist/utils/iso.date.time.d.ts +2 -0
  42. package/dist/utils/iso.date.time.js +27 -0
  43. package/dist/utils/sqlite3.utils.d.ts +4 -0
  44. package/dist/utils/sqlite3.utils.js +60 -0
  45. package/dist/utils/where.utils.d.ts +3 -0
  46. package/dist/utils/where.utils.js +22 -0
  47. package/index.d.ts +1 -0
  48. package/index.js +2 -0
  49. package/package.json +37 -0
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.quietRequire = void 0;
4
+ function quietRequire(module) {
5
+ try {
6
+ return require(module);
7
+ }
8
+ catch (err) {
9
+ return undefined;
10
+ }
11
+ }
12
+ exports.quietRequire = quietRequire;
@@ -0,0 +1,4 @@
1
+ export * from './connections';
2
+ export * from './migrations';
3
+ export * from './selectors';
4
+ export * from './utils';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./connections"), exports);
18
+ __exportStar(require("./migrations"), exports);
19
+ __exportStar(require("./selectors"), exports);
20
+ __exportStar(require("./utils"), exports);
@@ -0,0 +1 @@
1
+ export * from './mysql.migrations';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mysql.migrations"), exports);
@@ -0,0 +1,6 @@
1
+ import { DataSource, EntitySchema } from "typeorm";
2
+ export declare class MySQLMigrations {
3
+ static get migrationTableName(): string;
4
+ static addMigration(entity: EntitySchema, date: Date, sql: string | string[]): void;
5
+ static runMigrations(dataSource: DataSource): Promise<void>;
6
+ }
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.MySQLMigrations = void 0;
49
+ var typeorm_1 = require("typeorm");
50
+ var mysql_connection_1 = require("../connections/mysql.connection");
51
+ var utils_1 = require("@klapeks/utils");
52
+ var iso_date_time_1 = require("../utils/iso.date.time");
53
+ // for mysql
54
+ // export type
55
+ var _migrations = [];
56
+ var logger = new utils_1.Logger("MySQL Migrations");
57
+ var MySQLMigrations = /** @class */ (function () {
58
+ function MySQLMigrations() {
59
+ }
60
+ Object.defineProperty(MySQLMigrations, "migrationTableName", {
61
+ get: function () {
62
+ return process.env.DB_UTILS_MIGRATION_TABLE_NAME || "_kldb_mini_migrations";
63
+ },
64
+ enumerable: false,
65
+ configurable: true
66
+ });
67
+ MySQLMigrations.addMigration = function (entity, date, sql) {
68
+ _migrations.push({
69
+ table: entity.options.tableName || entity.options.name,
70
+ date: date,
71
+ sql: sql
72
+ });
73
+ };
74
+ MySQLMigrations.runMigrations = function (dataSource) {
75
+ var _a;
76
+ return __awaiter(this, void 0, void 0, function () {
77
+ var options_1, mysqlInstance_1, getTable_1, hasMigrationTable, migrationRecords_1, runnedMigrationsAmount_1, runTableMigration, tablesToMigrate, _i, tablesToMigrate_1, table, err_1;
78
+ var _this = this;
79
+ return __generator(this, function (_b) {
80
+ switch (_b.label) {
81
+ case 0:
82
+ _b.trys.push([0, 11, , 12]);
83
+ options_1 = (0, utils_1.dataSourceOptions)();
84
+ mysqlInstance_1 = new mysql_connection_1.RawMySQLConnection(options_1);
85
+ return [4 /*yield*/, mysqlInstance_1.takePool()];
86
+ case 1:
87
+ _b.sent();
88
+ getTable_1 = function (table) { return __awaiter(_this, void 0, void 0, function () {
89
+ return __generator(this, function (_a) {
90
+ return [2 /*return*/, mysqlInstance_1.runSQL_One("\n SELECT * FROM information_schema.tables\n WHERE table_schema = '".concat(options_1.database, "' \n AND table_name = '").concat(table, "'\n LIMIT 1;\n "))];
91
+ });
92
+ }); };
93
+ return [4 /*yield*/, getTable_1(this.migrationTableName)];
94
+ case 2:
95
+ hasMigrationTable = _b.sent();
96
+ if (!!hasMigrationTable) return [3 /*break*/, 4];
97
+ logger.log("Creating migration table..");
98
+ return [4 /*yield*/, mysqlInstance_1.runSQL("\n CREATE TABLE ".concat(this.migrationTableName, " (\n `table` VARCHAR(255) NOT NULL PRIMARY KEY,\n `lastMigrationTime` VARCHAR(128) NOT NULL\n )\n "))];
99
+ case 3:
100
+ _b.sent();
101
+ _b.label = 4;
102
+ case 4: return [4 /*yield*/, mysqlInstance_1.runSQL("SELECT * FROM ".concat(this.migrationTableName))];
103
+ case 5:
104
+ migrationRecords_1 = _b.sent();
105
+ runnedMigrationsAmount_1 = 0;
106
+ runTableMigration = function (table) { return __awaiter(_this, void 0, void 0, function () {
107
+ var todoMigrations, tableInfo, lastMigrationDate, lastRealMigration, _i, todoMigrations_1, migration, migrationName, sqls, _a, sqls_1, sql, sql;
108
+ var _b, _c;
109
+ return __generator(this, function (_d) {
110
+ switch (_d.label) {
111
+ case 0:
112
+ todoMigrations = _migrations.sort(function (c1, c2) { return c1.date.getTime() - c2.date.getTime(); });
113
+ todoMigrations = __spreadArray([], todoMigrations, true).filter(function (m) { return m.table == table; });
114
+ return [4 /*yield*/, getTable_1(table)];
115
+ case 1:
116
+ tableInfo = _d.sent();
117
+ if (!!tableInfo) return [3 /*break*/, 4];
118
+ logger.log("Table ".concat(table, " not found. Migrations ").concat(todoMigrations === null || todoMigrations === void 0 ? void 0 : todoMigrations.length, " will be skipped"));
119
+ lastMigrationDate = todoMigrations.length ? (_b = todoMigrations === null || todoMigrations === void 0 ? void 0 : todoMigrations[todoMigrations.length - 1]) === null || _b === void 0 ? void 0 : _b.date : undefined;
120
+ if (!((todoMigrations === null || todoMigrations === void 0 ? void 0 : todoMigrations.length) && lastMigrationDate)) return [3 /*break*/, 3];
121
+ return [4 /*yield*/, mysqlInstance_1.runSQL("\n INSERT INTO `".concat(this.migrationTableName, "` (`table`, `lastMigrationTime`)\n VALUES ('").concat(table, "', '").concat((0, iso_date_time_1.toISODate)(lastMigrationDate), "')\n ON DUPLICATE KEY UPDATE `lastMigrationTime` = '").concat((0, iso_date_time_1.toISODate)(lastMigrationDate), "'\n "))];
122
+ case 2:
123
+ _d.sent();
124
+ _d.label = 3;
125
+ case 3: return [2 /*return*/];
126
+ case 4:
127
+ lastRealMigration = (_c = migrationRecords_1 === null || migrationRecords_1 === void 0 ? void 0 : migrationRecords_1.find(function (r) { return r.table == table; })) === null || _c === void 0 ? void 0 : _c.lastMigrationTime;
128
+ _i = 0, todoMigrations_1 = todoMigrations;
129
+ _d.label = 5;
130
+ case 5:
131
+ if (!(_i < todoMigrations_1.length)) return [3 /*break*/, 16];
132
+ migration = todoMigrations_1[_i];
133
+ if (migration.table != table)
134
+ return [3 /*break*/, 15];
135
+ if (lastRealMigration && new Date(lastRealMigration).getTime() >= migration.date.getTime()) {
136
+ return [3 /*break*/, 15];
137
+ }
138
+ runnedMigrationsAmount_1 += 1;
139
+ migrationName = '"' + table + ' ' + (0, iso_date_time_1.toISODate)(migration.date) + '"';
140
+ if (!Array.isArray(migration.sql)) return [3 /*break*/, 10];
141
+ sqls = migration.sql.filter(Boolean).map(function (sql) {
142
+ return utils_1.utils.replaceAll(sql.trim(), "%{table_name}", table);
143
+ });
144
+ logger.log(runnedMigrationsAmount_1, "| Migrations will be runned:", migrationName, '|\n' + utils_1.terminalColors.cyan, sqls);
145
+ _a = 0, sqls_1 = sqls;
146
+ _d.label = 6;
147
+ case 6:
148
+ if (!(_a < sqls_1.length)) return [3 /*break*/, 9];
149
+ sql = sqls_1[_a];
150
+ return [4 /*yield*/, mysqlInstance_1.runSQL(sql)];
151
+ case 7:
152
+ _d.sent();
153
+ _d.label = 8;
154
+ case 8:
155
+ _a++;
156
+ return [3 /*break*/, 6];
157
+ case 9: return [3 /*break*/, 12];
158
+ case 10:
159
+ sql = utils_1.utils.replaceAll(migration.sql, "%{table_name}", table);
160
+ logger.log(runnedMigrationsAmount_1, "| Migration will be runned:", migrationName, '|\n' + utils_1.terminalColors.cyan, sql.trim());
161
+ return [4 /*yield*/, mysqlInstance_1.runSQL(sql)];
162
+ case 11:
163
+ _d.sent();
164
+ _d.label = 12;
165
+ case 12: return [4 /*yield*/, mysqlInstance_1.runSQL("\n INSERT INTO `".concat(this.migrationTableName, "` (`table`, `lastMigrationTime`)\n VALUES ('").concat(table, "', '").concat((0, iso_date_time_1.toISODate)(migration.date), "')\n ON DUPLICATE KEY UPDATE `lastMigrationTime` = '").concat((0, iso_date_time_1.toISODate)(migration.date), "'\n "))];
166
+ case 13:
167
+ _d.sent();
168
+ logger.log(runnedMigrationsAmount_1, "| Migration", migrationName, "successfully done");
169
+ return [4 /*yield*/, utils_1.utils.sleep(100)];
170
+ case 14:
171
+ _d.sent();
172
+ _d.label = 15;
173
+ case 15:
174
+ _i++;
175
+ return [3 /*break*/, 5];
176
+ case 16: return [2 /*return*/];
177
+ }
178
+ });
179
+ }); };
180
+ tablesToMigrate = Object.values(dataSource.options.entities || []).map(function (m) {
181
+ if (m instanceof typeorm_1.EntitySchema)
182
+ return m.options.name;
183
+ return undefined;
184
+ }).filter(Boolean);
185
+ _i = 0, tablesToMigrate_1 = tablesToMigrate;
186
+ _b.label = 6;
187
+ case 6:
188
+ if (!(_i < tablesToMigrate_1.length)) return [3 /*break*/, 9];
189
+ table = tablesToMigrate_1[_i];
190
+ return [4 /*yield*/, runTableMigration(table)];
191
+ case 7:
192
+ _b.sent();
193
+ _b.label = 8;
194
+ case 8:
195
+ _i++;
196
+ return [3 /*break*/, 6];
197
+ case 9:
198
+ if (runnedMigrationsAmount_1) {
199
+ logger.log("All migrations completed:", runnedMigrationsAmount_1);
200
+ }
201
+ return [4 /*yield*/, mysqlInstance_1.destroyConnection().catch(function (err) {
202
+ logger.error("Error while closing pool:", err);
203
+ })];
204
+ case 10:
205
+ _b.sent();
206
+ return [3 /*break*/, 12];
207
+ case 11:
208
+ err_1 = _b.sent();
209
+ if ((_a = err_1 === null || err_1 === void 0 ? void 0 : err_1.sqlMessage) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes("unknown database"))
210
+ return [2 /*return*/];
211
+ // logger.error("err of musql:", err.sqlMessage);
212
+ throw err_1;
213
+ case 12: return [2 /*return*/];
214
+ }
215
+ });
216
+ });
217
+ };
218
+ return MySQLMigrations;
219
+ }());
220
+ exports.MySQLMigrations = MySQLMigrations;
@@ -0,0 +1,26 @@
1
+ import { SelectOptions, SelectResult, TimedStatisticInfo } from '@klapeks/api-creation-tools';
2
+ export interface SelectEntityHandlerOptions<T extends object, K extends string> {
3
+ name: K;
4
+ orderBy?: keyof T | (keyof T)[];
5
+ /** @default "ASC" */
6
+ orderType?: "ASC" | "DESC" | ("ASC" | "DESC")[];
7
+ /** @default 100 */
8
+ maxLimit?: number;
9
+ afterSelect?: (objects: T[], options: SelectOptions<T>) => Promise<T[]>;
10
+ }
11
+ export declare abstract class AbstractSelectHandler<T extends object, K extends string, O extends SelectEntityHandlerOptions<T, K>> {
12
+ readonly options: O;
13
+ constructor(options: O);
14
+ abstract getTableName(): string;
15
+ abstract runSQL(query: string, params?: any[]): Promise<any[]>;
16
+ runSQL_One(query: string, params?: any[]): Promise<any>;
17
+ abstract getTotal(): Promise<number>;
18
+ abstract rawSelect(options: SelectOptions<T>): Promise<{
19
+ objects: T[];
20
+ total: number;
21
+ }>;
22
+ select(options: SelectOptions<T>): Promise<SelectResult<T, K>>;
23
+ sqlCount(field: string): Promise<number>;
24
+ getSumStatistic(sumField: keyof T, strWhere?: string): Promise<TimedStatisticInfo>;
25
+ handleQuery(req: any): Promise<SelectOptions<T>>;
26
+ }
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.AbstractSelectHandler = void 0;
40
+ var iso_date_time_1 = require("../utils/iso.date.time");
41
+ var AbstractSelectHandler = /** @class */ (function () {
42
+ function AbstractSelectHandler(options) {
43
+ this.options = options;
44
+ if (!this.options.maxLimit)
45
+ this.options.maxLimit = 100;
46
+ }
47
+ AbstractSelectHandler.prototype.runSQL_One = function (query, params) {
48
+ return __awaiter(this, void 0, void 0, function () {
49
+ var res;
50
+ return __generator(this, function (_a) {
51
+ switch (_a.label) {
52
+ case 0: return [4 /*yield*/, this.runSQL(query, params)];
53
+ case 1:
54
+ res = _a.sent();
55
+ return [2 /*return*/, res.length ? (res[0] || res) : null];
56
+ }
57
+ });
58
+ });
59
+ };
60
+ AbstractSelectHandler.prototype.select = function (options) {
61
+ return __awaiter(this, void 0, void 0, function () {
62
+ var result;
63
+ var _a;
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
66
+ case 0: return [4 /*yield*/, this.rawSelect(options)];
67
+ case 1:
68
+ result = _b.sent();
69
+ return [2 /*return*/, (_a = {
70
+ size: result.objects.length,
71
+ total: result.total
72
+ },
73
+ _a[this.options.name] = result.objects,
74
+ _a)];
75
+ }
76
+ });
77
+ });
78
+ };
79
+ AbstractSelectHandler.prototype.sqlCount = function (field) {
80
+ var _a;
81
+ return __awaiter(this, void 0, void 0, function () {
82
+ return __generator(this, function (_b) {
83
+ switch (_b.label) {
84
+ case 0: return [4 /*yield*/, this.runSQL_One("\n SELECT count(".concat(field, ") as 'count'\n FROM ").concat(this.getTableName(), ";\n "))];
85
+ case 1: return [2 /*return*/, (_a = (_b.sent())) === null || _a === void 0 ? void 0 : _a.count];
86
+ }
87
+ });
88
+ });
89
+ };
90
+ AbstractSelectHandler.prototype.getSumStatistic = function (sumField, strWhere) {
91
+ var _a;
92
+ return __awaiter(this, void 0, void 0, function () {
93
+ var stat, time, response, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
94
+ var _p;
95
+ var _this = this;
96
+ return __generator(this, function (_q) {
97
+ switch (_q.label) {
98
+ case 0:
99
+ stat = function (fromDate, time) { return __awaiter(_this, void 0, void 0, function () {
100
+ var isoDate, sum;
101
+ var _a;
102
+ return __generator(this, function (_b) {
103
+ switch (_b.label) {
104
+ case 0:
105
+ if (typeof fromDate == 'function') {
106
+ fromDate = (0, iso_date_time_1.dateFromNow)(fromDate);
107
+ }
108
+ isoDate = (0, iso_date_time_1.toISODate)(fromDate, 'yyyy-mm-dd');
109
+ return [4 /*yield*/, this.runSQL_One("\n SELECT SUM(".concat(sumField, ") as sum\n FROM ").concat(this.getTableName(), "\n WHERE ").concat(time ? "createdAt >= '".concat(isoDate, " ").concat(time, "'")
110
+ : "date(createdAt) >= date('".concat(isoDate, "')"), "\n ").concat(strWhere ? ('AND (' + strWhere + ')') : '', "\n "))];
111
+ case 1:
112
+ sum = ((_a = (_b.sent())) === null || _a === void 0 ? void 0 : _a.sum) || 0;
113
+ return [2 /*return*/, {
114
+ from: isoDate + ' ' + (time || '00:00:00'),
115
+ sum: sum,
116
+ }];
117
+ }
118
+ });
119
+ }); };
120
+ time = new Date().toLocaleTimeString('uk-UA');
121
+ _p = {
122
+ serverTime: time
123
+ };
124
+ return [4 /*yield*/, this.getTotal()];
125
+ case 1:
126
+ response = (_p.count = _q.sent(),
127
+ _p);
128
+ _b = response;
129
+ return [4 /*yield*/, this.runSQL_One("\n SELECT SUM(".concat(sumField, ") as sum\n FROM ").concat(this.getTableName(), "\n ").concat(strWhere ? ("WHERE " + strWhere) : '', "\n "))];
130
+ case 2:
131
+ _b.total = (_a = (_q.sent())) === null || _a === void 0 ? void 0 : _a.sum;
132
+ _c = response;
133
+ return [4 /*yield*/, stat(new Date())];
134
+ case 3:
135
+ _c.thisDay = _q.sent();
136
+ _d = response;
137
+ return [4 /*yield*/, stat(function (d) { return d.setDate(d.getDate() - (d.getDay() || 7) + 1); })];
138
+ case 4:
139
+ _d.thisWeek = _q.sent();
140
+ _e = response;
141
+ return [4 /*yield*/, stat(function (d) { return d.setDate(1); })];
142
+ case 5:
143
+ _e.thisMonth = _q.sent();
144
+ _f = response;
145
+ return [4 /*yield*/, stat(function (d) { d.setMonth(0); d.setDate(1); })];
146
+ case 6:
147
+ _f.thisYear = _q.sent();
148
+ _g = response;
149
+ return [4 /*yield*/, stat(function (d) { return d.setDate(d.getDate() - 1); }, time)];
150
+ case 7:
151
+ _g.past24hours = _q.sent();
152
+ _h = response;
153
+ return [4 /*yield*/, stat(function (d) { return d.setDate(d.getDate() - 2); })];
154
+ case 8:
155
+ _h.past3days = _q.sent();
156
+ _j = response;
157
+ return [4 /*yield*/, stat(function (d) { return d.setDate(d.getDate() - 6); })];
158
+ case 9:
159
+ _j.past7days = _q.sent();
160
+ _k = response;
161
+ return [4 /*yield*/, stat(function (d) { return d.setDate(d.getDate() - 13); })];
162
+ case 10:
163
+ _k.past14days = _q.sent();
164
+ _l = response;
165
+ return [4 /*yield*/, stat(function (d) { return d.setDate(d.getDate() - 29); })];
166
+ case 11:
167
+ _l.past30days = _q.sent();
168
+ _m = response;
169
+ return [4 /*yield*/, stat(function (d) { return d.setMonth(d.getMonth() - 6); })];
170
+ case 12:
171
+ _m.past6months = _q.sent();
172
+ _o = response;
173
+ return [4 /*yield*/, stat(function (d) { return d.setMonth(d.getMonth() - 12); })];
174
+ case 13:
175
+ _o.past12months = _q.sent();
176
+ return [2 /*return*/, response];
177
+ }
178
+ });
179
+ });
180
+ };
181
+ AbstractSelectHandler.prototype.handleQuery = function (req) {
182
+ return __awaiter(this, void 0, void 0, function () {
183
+ var options;
184
+ return __generator(this, function (_a) {
185
+ options = {
186
+ limit: Number(req.query.limit),
187
+ offset: Number(req.query.offset)
188
+ };
189
+ if (!options.limit || options.limit < 0)
190
+ throw "Invalid limit field";
191
+ if (options.limit > (this.options.maxLimit || 100))
192
+ throw "Too much limit";
193
+ if (typeof req.query.where == 'object') {
194
+ options.where = req.query.where;
195
+ }
196
+ return [2 /*return*/, options];
197
+ });
198
+ });
199
+ };
200
+ return AbstractSelectHandler;
201
+ }());
202
+ exports.AbstractSelectHandler = AbstractSelectHandler;
@@ -0,0 +1,3 @@
1
+ export * from './abstract.select.handler';
2
+ export * from './raw-mysql.select.handler';
3
+ export * from './typeorm.select.handler';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./abstract.select.handler"), exports);
18
+ __exportStar(require("./raw-mysql.select.handler"), exports);
19
+ __exportStar(require("./typeorm.select.handler"), exports);
@@ -0,0 +1,17 @@
1
+ import { SelectOptions } from "@klapeks/api-creation-tools";
2
+ import { RawMySQLConnection } from "../connections";
3
+ import { AbstractSelectHandler, SelectEntityHandlerOptions } from "./abstract.select.handler";
4
+ export type MySQLSelectEntityHandlerOptions<T extends object, K extends string> = SelectEntityHandlerOptions<T, K> & {
5
+ schemaTableName: string;
6
+ mysql: RawMySQLConnection;
7
+ };
8
+ export declare class MySQLSelectEntityHandler<T extends object, K extends string> extends AbstractSelectHandler<T, K, MySQLSelectEntityHandlerOptions<T, K>> {
9
+ constructor(options: MySQLSelectEntityHandlerOptions<T, K>);
10
+ getTableName(): string;
11
+ runSQL(sql: string, params?: any[]): Promise<any[]>;
12
+ getTotal(): Promise<number>;
13
+ rawSelect(options: SelectOptions<T>): Promise<{
14
+ objects: T[];
15
+ total: number;
16
+ }>;
17
+ }