@diia-inhouse/db 10.8.14 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +27 -0
- package/dist/cli/cleanupExpiredData.js +83 -136
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +85 -100
- package/dist/cli/runMigration.js +64 -105
- package/dist/cli/syncIndexes.js +38 -77
- package/dist/index.d.ts +28 -0
- package/dist/index.js +23 -22
- package/dist/interfaces/database.d.ts +10 -0
- package/dist/interfaces/dbConfig.d.ts +37 -0
- package/dist/interfaces/dbConfig.js +8 -9
- package/dist/interfaces/errors.d.ts +43 -0
- package/dist/interfaces/errors.js +42 -50
- package/dist/interfaces/index.d.ts +15 -0
- package/dist/interfaces/index.js +11 -25
- package/dist/interfaces/metrics.d.ts +22 -0
- package/dist/interfaces/metrics.js +38 -19
- package/dist/interfaces/migrateMongoConfig.d.ts +17 -0
- package/dist/interfaces/models/counter.d.ts +8 -0
- package/dist/interfaces/models/encryptedStorage.d.ts +9 -0
- package/dist/interfaces/mongoStatus.d.ts +16 -0
- package/dist/interfaces/mongoStatus.js +11 -12
- package/dist/mongo.d.ts +12 -0
- package/dist/mongo.js +71 -89
- package/dist/postgres.d.ts +4 -0
- package/dist/postgres.js +5 -19
- package/dist/postgresUtils.d.ts +8 -0
- package/dist/postgresUtils.js +14 -18
- package/dist/schemas/counter.d.ts +7 -0
- package/dist/schemas/counter.js +19 -14
- package/dist/schemas/encryptedStorage.d.ts +7 -0
- package/dist/schemas/encryptedStorage.js +17 -15
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.js +4 -20
- package/dist/schemas/statusHistoryItem.d.ts +7 -0
- package/dist/schemas/statusHistoryItem.js +16 -10
- package/dist/services/counter.d.ts +19 -0
- package/dist/services/counter.js +70 -72
- package/dist/services/database.d.ts +50 -0
- package/dist/services/database.js +255 -281
- package/dist/services/encryptedStorage.d.ts +73 -0
- package/dist/services/encryptedStorage.js +178 -214
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.js +5 -21
- package/dist/services/postgresDatabase.d.ts +12 -0
- package/dist/services/postgresDatabase.js +20 -25
- package/dist/tables/counter.d.ts +4 -0
- package/dist/tables/counter.js +11 -12
- package/dist/tables/encryptedStorage.d.ts +4 -0
- package/dist/tables/encryptedStorage.js +12 -13
- package/dist/tables/index.d.ts +9 -0
- package/dist/tables/index.js +3 -19
- package/package.json +47 -48
- package/dist/cli/cleanupExpiredData.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/runMigration.js.map +0 -1
- package/dist/cli/syncIndexes.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/interfaces/database.js +0 -3
- package/dist/interfaces/database.js.map +0 -1
- package/dist/interfaces/dbConfig.js.map +0 -1
- package/dist/interfaces/errors.js.map +0 -1
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/metrics.js.map +0 -1
- package/dist/interfaces/migrateMongoConfig.js +0 -3
- package/dist/interfaces/migrateMongoConfig.js.map +0 -1
- package/dist/interfaces/models/counter.js +0 -3
- package/dist/interfaces/models/counter.js.map +0 -1
- package/dist/interfaces/models/encryptedStorage.js +0 -3
- package/dist/interfaces/models/encryptedStorage.js.map +0 -1
- package/dist/interfaces/models/index.js +0 -19
- package/dist/interfaces/models/index.js.map +0 -1
- package/dist/interfaces/mongoStatus.js.map +0 -1
- package/dist/mongo.js.map +0 -1
- package/dist/postgres.js.map +0 -1
- package/dist/postgresUtils.js.map +0 -1
- package/dist/schemas/counter.js.map +0 -1
- package/dist/schemas/encryptedStorage.js.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/statusHistoryItem.js.map +0 -1
- package/dist/services/counter.js.map +0 -1
- package/dist/services/database.js.map +0 -1
- package/dist/services/encryptedStorage.js.map +0 -1
- package/dist/services/index.js.map +0 -1
- package/dist/services/postgresDatabase.js.map +0 -1
- package/dist/tables/counter.js.map +0 -1
- package/dist/tables/encryptedStorage.js.map +0 -1
- package/dist/tables/index.js.map +0 -1
- package/dist/types/cli/cleanupExpiredData.d.ts +0 -11
- package/dist/types/cli/index.d.ts +0 -2
- package/dist/types/cli/runMigration.d.ts +0 -11
- package/dist/types/cli/syncIndexes.d.ts +0 -7
- package/dist/types/index.d.ts +0 -5
- package/dist/types/interfaces/database.d.ts +0 -8
- package/dist/types/interfaces/dbConfig.d.ts +0 -33
- package/dist/types/interfaces/errors.d.ts +0 -40
- package/dist/types/interfaces/index.d.ts +0 -8
- package/dist/types/interfaces/metrics.d.ts +0 -20
- package/dist/types/interfaces/migrateMongoConfig.d.ts +0 -13
- package/dist/types/interfaces/models/counter.d.ts +0 -5
- package/dist/types/interfaces/models/encryptedStorage.d.ts +0 -6
- package/dist/types/interfaces/models/index.d.ts +0 -2
- package/dist/types/interfaces/mongoStatus.d.ts +0 -12
- package/dist/types/mongo.d.ts +0 -9
- package/dist/types/postgres.d.ts +0 -2
- package/dist/types/postgresUtils.d.ts +0 -26
- package/dist/types/schemas/counter.d.ts +0 -12
- package/dist/types/schemas/encryptedStorage.d.ts +0 -12
- package/dist/types/schemas/index.d.ts +0 -3
- package/dist/types/schemas/statusHistoryItem.d.ts +0 -3
- package/dist/types/services/counter.d.ts +0 -15
- package/dist/types/services/database.d.ts +0 -43
- package/dist/types/services/encryptedStorage.d.ts +0 -69
- package/dist/types/services/index.d.ts +0 -4
- package/dist/types/services/postgresDatabase.d.ts +0 -8
- package/dist/types/tables/counter.d.ts +0 -94
- package/dist/types/tables/encryptedStorage.d.ts +0 -111
- package/dist/types/tables/index.d.ts +0 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __exportAll = (all, no_symbols) => {
|
|
7
|
+
let target = {};
|
|
8
|
+
for (var name in all) __defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true
|
|
11
|
+
});
|
|
12
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
13
|
+
return target;
|
|
14
|
+
};
|
|
15
|
+
var __copyProps = (to, from, except, desc) => {
|
|
16
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
17
|
+
key = keys[i];
|
|
18
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
19
|
+
get: ((k) => from[k]).bind(null, key),
|
|
20
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return to;
|
|
24
|
+
};
|
|
25
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
26
|
+
//#endregion
|
|
27
|
+
export { __exportAll, __reExport };
|
|
@@ -1,137 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
1
|
+
import { lt, sql } from "drizzle-orm";
|
|
2
|
+
import { getTableConfig } from "drizzle-orm/pg-core";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { drizzle } from "drizzle-orm/node-postgres";
|
|
6
|
+
import { register } from "tsx/esm/api";
|
|
7
|
+
//#region src/cli/cleanupExpiredData.ts
|
|
8
|
+
register();
|
|
9
|
+
var CleanupExpiredDataCommand = class {
|
|
10
|
+
logger;
|
|
11
|
+
constructor(logger) {
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
}
|
|
14
|
+
async run(filePath) {
|
|
15
|
+
const schema = await this.loadSchema(filePath);
|
|
16
|
+
if (!schema) {
|
|
17
|
+
this.logger.info("Pg schemas not found under provided path", { schemasPath: filePath });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const db = this.createDbConnection(schema);
|
|
21
|
+
const expiringTables = this.findExpiringTables(schema);
|
|
22
|
+
if (expiringTables.length === 0) {
|
|
23
|
+
this.logger.info("No tables with expiring data found");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await this.cleanupTables(db, schema, expiringTables);
|
|
27
|
+
await db.$client.end();
|
|
28
|
+
}
|
|
29
|
+
async loadSchema(filePath) {
|
|
30
|
+
const schemaPath = `./dist/${filePath}`;
|
|
31
|
+
const fullSchemaPath = path.resolve(schemaPath);
|
|
32
|
+
if (!existsSync(fullSchemaPath)) return;
|
|
33
|
+
return await import(fullSchemaPath);
|
|
34
|
+
}
|
|
35
|
+
createDbConnection(schema) {
|
|
36
|
+
return drizzle(process.env.POSTGRES_DATABASE_URL, {
|
|
37
|
+
schema,
|
|
38
|
+
casing: "snake_case",
|
|
39
|
+
logger: true
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async cleanupTables(db, schema, expiringTables) {
|
|
43
|
+
this.logger.info(`Found ${expiringTables.length} tables with expiring data: ${expiringTables.map(({ name }) => name).join(", ")}`);
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
try {
|
|
46
|
+
for (const { name, tableName, expiringColumns } of expiringTables) {
|
|
47
|
+
this.logger.info(`Starting cleanup expired data from table: ${name}`);
|
|
48
|
+
const table = schema[tableName];
|
|
49
|
+
for (const { column, expireAfterSeconds } of expiringColumns) {
|
|
50
|
+
const result = await db.delete(table).where(lt(sql.raw(`"${name}"."${column.name}" + interval '${expireAfterSeconds} seconds'`), /* @__PURE__ */ new Date()));
|
|
51
|
+
this.logger.info(`Deleted ${result.rowCount} rows from table ${name} by column ${column.name} with expireAfterSeconds ${expireAfterSeconds}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
this.logger.info(`Cleanup expired data finished! It took ${((Date.now() - startTime) / 1e3).toFixed(1)} seconds`);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
this.logger.error("Failed to cleanup expired data", { err });
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
findExpiringTables(schemas) {
|
|
61
|
+
const tables = Object.entries(schemas).filter(([, table]) => table?.constructor?.name === "PgTable").map(([tableName, table]) => ({
|
|
62
|
+
...getTableConfig(table),
|
|
63
|
+
tableName
|
|
64
|
+
}));
|
|
65
|
+
const expiringTables = [];
|
|
66
|
+
for (const table of tables) {
|
|
67
|
+
const expiringColumns = table.columns.filter((column) => this.isExpiringColumn(column)).map((column) => ({
|
|
68
|
+
column,
|
|
69
|
+
expireAfterSeconds: column["config"].fieldConfig.expireAfterSeconds
|
|
70
|
+
}));
|
|
71
|
+
if (expiringColumns.length > 0) expiringTables.push({
|
|
72
|
+
...table,
|
|
73
|
+
expiringColumns
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return expiringTables;
|
|
77
|
+
}
|
|
78
|
+
isExpiringColumn(column) {
|
|
79
|
+
if (column.columnType !== "PgCustomColumn") return false;
|
|
80
|
+
return typeof column["config"]?.fieldConfig?.expireAfterSeconds === "number";
|
|
81
|
+
}
|
|
37
82
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const node_fs_1 = require("node:fs");
|
|
41
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
42
|
-
const drizzle_orm_1 = require("drizzle-orm");
|
|
43
|
-
const node_postgres_1 = require("drizzle-orm/node-postgres");
|
|
44
|
-
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
45
|
-
const ts_node_1 = require("ts-node");
|
|
46
|
-
(0, ts_node_1.register)();
|
|
47
|
-
class CleanupExpiredDataCommand {
|
|
48
|
-
logger;
|
|
49
|
-
constructor(logger) {
|
|
50
|
-
this.logger = logger;
|
|
51
|
-
}
|
|
52
|
-
async run(filePath) {
|
|
53
|
-
const schema = await this.loadSchema(filePath);
|
|
54
|
-
if (!schema) {
|
|
55
|
-
this.logger.info('Pg schemas not found under provided path', { schemasPath: filePath });
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const db = this.createDbConnection(schema);
|
|
59
|
-
const expiringTables = this.findExpiringTables(schema);
|
|
60
|
-
if (expiringTables.length === 0) {
|
|
61
|
-
this.logger.info('No tables with expiring data found');
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
await this.cleanupTables(db, schema, expiringTables);
|
|
65
|
-
await db.$client.end();
|
|
66
|
-
}
|
|
67
|
-
async loadSchema(filePath) {
|
|
68
|
-
const schemaPath = `./dist/${filePath}`;
|
|
69
|
-
const fullSchemaPath = node_path_1.default.resolve(schemaPath);
|
|
70
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
71
|
-
const isExistsSync = (0, node_fs_1.existsSync)(fullSchemaPath); // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
72
|
-
if (!isExistsSync) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
return await Promise.resolve(`${fullSchemaPath}`).then(s => __importStar(require(s)));
|
|
76
|
-
}
|
|
77
|
-
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
78
|
-
createDbConnection(schema) {
|
|
79
|
-
return (0, node_postgres_1.drizzle)(process.env.POSTGRES_DATABASE_URL, {
|
|
80
|
-
schema,
|
|
81
|
-
casing: 'snake_case',
|
|
82
|
-
logger: true,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
async cleanupTables(db, schema, expiringTables) {
|
|
86
|
-
this.logger.info(`Found ${expiringTables.length} tables with expiring data: ${expiringTables.map(({ name }) => name).join(', ')}`);
|
|
87
|
-
const startTime = Date.now();
|
|
88
|
-
try {
|
|
89
|
-
for (const { name, tableName, expiringColumns } of expiringTables) {
|
|
90
|
-
this.logger.info(`Starting cleanup expired data from table: ${name}`);
|
|
91
|
-
const table = schema[tableName];
|
|
92
|
-
for (const { column, expireAfterSeconds } of expiringColumns) {
|
|
93
|
-
const result = await db
|
|
94
|
-
.delete(table)
|
|
95
|
-
.where((0, drizzle_orm_1.lt)(drizzle_orm_1.sql.raw(`"${name}"."${column.name}" + interval '${expireAfterSeconds} seconds'`), new Date()));
|
|
96
|
-
this.logger.info(`Deleted ${result.rowCount} rows from table ${name} by column ${column.name} with expireAfterSeconds ${expireAfterSeconds}`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
this.logger.info(`Cleanup expired data finished! It took ${((Date.now() - startTime) / 1000).toFixed(1)} seconds`);
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
this.logger.error('Failed to cleanup expired data', { err });
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
findExpiringTables(schemas) {
|
|
107
|
-
const tables = Object.entries(schemas)
|
|
108
|
-
.filter(([, table]) => table?.constructor?.name === 'PgTable')
|
|
109
|
-
.map(([tableName, table]) => ({
|
|
110
|
-
...(0, pg_core_1.getTableConfig)(table),
|
|
111
|
-
tableName,
|
|
112
|
-
}));
|
|
113
|
-
const expiringTables = [];
|
|
114
|
-
for (const table of tables) {
|
|
115
|
-
const expiringColumns = table.columns
|
|
116
|
-
.filter((column) => this.isExpiringColumn(column))
|
|
117
|
-
.map((column) => ({
|
|
118
|
-
column: column,
|
|
119
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
120
|
-
expireAfterSeconds: column['config'].fieldConfig.expireAfterSeconds,
|
|
121
|
-
}));
|
|
122
|
-
if (expiringColumns.length > 0) {
|
|
123
|
-
expiringTables.push({ ...table, expiringColumns });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return expiringTables;
|
|
127
|
-
}
|
|
128
|
-
isExpiringColumn(column) {
|
|
129
|
-
if (column.columnType !== 'PgCustomColumn') {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
const config = column['config'];
|
|
133
|
-
return typeof config?.fieldConfig?.expireAfterSeconds === 'number';
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
exports.CleanupExpiredDataCommand = CleanupExpiredDataCommand;
|
|
137
|
-
//# sourceMappingURL=cleanupExpiredData.js.map
|
|
83
|
+
//#endregion
|
|
84
|
+
export { CleanupExpiredDataCommand };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/cli/index.js
CHANGED
|
@@ -1,105 +1,90 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const cleanupExpiredData_1 = require("./cleanupExpiredData");
|
|
14
|
-
const runMigration_1 = require("./runMigration");
|
|
15
|
-
const syncIndexes_1 = require("./syncIndexes");
|
|
2
|
+
import "../interfaces/dbConfig.js";
|
|
3
|
+
import "../interfaces/index.js";
|
|
4
|
+
import { DatabaseService } from "../services/database.js";
|
|
5
|
+
import { CleanupExpiredDataCommand } from "./cleanupExpiredData.js";
|
|
6
|
+
import { RunMigrationCommand } from "./runMigration.js";
|
|
7
|
+
import { SyncIndexesCommand } from "./syncIndexes.js";
|
|
8
|
+
import { DiiaLogger } from "@diia-inhouse/diia-logger";
|
|
9
|
+
import { EnvService } from "@diia-inhouse/env";
|
|
10
|
+
import yargs from "yargs";
|
|
11
|
+
import { hideBin } from "yargs/helpers";
|
|
12
|
+
//#region src/cli/index.ts
|
|
16
13
|
async function createDatabaseService(envService, logger) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
14
|
+
return new DatabaseService("mongo", { ["main"]: {
|
|
15
|
+
database: EnvService.getVar("MONGO_DATABASE"),
|
|
16
|
+
replicaSet: EnvService.getVar("MONGO_REPLICA_SET"),
|
|
17
|
+
user: await envService.getSecret("MONGO_USER", {
|
|
18
|
+
accessor: "username",
|
|
19
|
+
nullable: true
|
|
20
|
+
}),
|
|
21
|
+
password: await envService.getSecret("MONGO_PASSWORD", {
|
|
22
|
+
accessor: "password",
|
|
23
|
+
nullable: true
|
|
24
|
+
}),
|
|
25
|
+
authSource: EnvService.getVar("MONGO_AUTH_SOURCE", "string", null),
|
|
26
|
+
port: EnvService.getVar("MONGO_PORT", "number"),
|
|
27
|
+
replicaSetNodes: EnvService.getVar("MONGO_HOSTS", "string").split(",").map((replicaHost) => ({ replicaHost })),
|
|
28
|
+
readPreference: EnvService.getVar("MONGO_READ_PREFERENCE"),
|
|
29
|
+
metrics: { enabled: false }
|
|
30
|
+
} }, envService, logger);
|
|
34
31
|
}
|
|
35
32
|
async function main() {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}), async (argv) => {
|
|
91
|
-
const logger = new diia_logger_1.default();
|
|
92
|
-
const envService = new env_1.EnvService(logger);
|
|
93
|
-
await envService.init();
|
|
94
|
-
try {
|
|
95
|
-
const command = new cleanupExpiredData_1.CleanupExpiredDataCommand(logger);
|
|
96
|
-
await command.run(argv.path);
|
|
97
|
-
}
|
|
98
|
-
finally {
|
|
99
|
-
await envService.onDestroy();
|
|
100
|
-
}
|
|
101
|
-
})
|
|
102
|
-
.help().argv;
|
|
33
|
+
await yargs(hideBin(process.argv)).command("sync-indexes", "Sync indexes for MongoDB models", (args) => args.option("modelsDir", {
|
|
34
|
+
type: "string",
|
|
35
|
+
default: "models",
|
|
36
|
+
describe: "Directory for models"
|
|
37
|
+
}), async (argv) => {
|
|
38
|
+
const logger = new DiiaLogger();
|
|
39
|
+
const envService = new EnvService(logger);
|
|
40
|
+
await envService.init();
|
|
41
|
+
const command = new SyncIndexesCommand(logger);
|
|
42
|
+
try {
|
|
43
|
+
const databaseService = await createDatabaseService(envService, logger);
|
|
44
|
+
await databaseService.onInit();
|
|
45
|
+
await command.run(argv.modelsDir);
|
|
46
|
+
await databaseService.onDestroy();
|
|
47
|
+
} finally {
|
|
48
|
+
await envService.onDestroy();
|
|
49
|
+
}
|
|
50
|
+
}).command("migrate", "Run MongoDB migration script", (args) => args.option("path", {
|
|
51
|
+
type: "string",
|
|
52
|
+
demandOption: true,
|
|
53
|
+
describe: "Path to migration script"
|
|
54
|
+
}).option("down", {
|
|
55
|
+
type: "boolean",
|
|
56
|
+
default: false,
|
|
57
|
+
describe: "Run migration down script"
|
|
58
|
+
}), async (argv) => {
|
|
59
|
+
const logger = new DiiaLogger();
|
|
60
|
+
const envService = new EnvService(logger);
|
|
61
|
+
await envService.init();
|
|
62
|
+
try {
|
|
63
|
+
const databaseService = await createDatabaseService(envService, logger);
|
|
64
|
+
await databaseService.onInit();
|
|
65
|
+
const db = databaseService.db.main?.connection.db;
|
|
66
|
+
const client = databaseService.db.main?.connection.getClient();
|
|
67
|
+
if (!db || !client) throw new Error("Expected db and client to be defined");
|
|
68
|
+
await new RunMigrationCommand(logger, db, client).run(argv.path, argv.down);
|
|
69
|
+
await databaseService.onDestroy();
|
|
70
|
+
} finally {
|
|
71
|
+
await envService.onDestroy();
|
|
72
|
+
}
|
|
73
|
+
}).command("pg-cleanup-expired-data", "Cleanup expired data for PostgreSQL tables based on expiring timestamp", (args) => args.option("path", {
|
|
74
|
+
type: "string",
|
|
75
|
+
default: "db/schemas",
|
|
76
|
+
describe: "Path to schemas directory"
|
|
77
|
+
}), async (argv) => {
|
|
78
|
+
const logger = new DiiaLogger();
|
|
79
|
+
const envService = new EnvService(logger);
|
|
80
|
+
await envService.init();
|
|
81
|
+
try {
|
|
82
|
+
await new CleanupExpiredDataCommand(logger).run(argv.path);
|
|
83
|
+
} finally {
|
|
84
|
+
await envService.onDestroy();
|
|
85
|
+
}
|
|
86
|
+
}).help().argv;
|
|
103
87
|
}
|
|
104
|
-
|
|
105
|
-
//#
|
|
88
|
+
main();
|
|
89
|
+
//#endregion
|
|
90
|
+
export {};
|
package/dist/cli/runMigration.js
CHANGED
|
@@ -1,106 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { register } from "tsx/esm/api";
|
|
4
|
+
//#region src/cli/runMigration.ts
|
|
5
|
+
register();
|
|
6
|
+
var RunMigrationCommand = class {
|
|
7
|
+
logger;
|
|
8
|
+
db;
|
|
9
|
+
client;
|
|
10
|
+
changelogCollectionName = "migrations-history";
|
|
11
|
+
constructor(logger, db, client) {
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
this.db = db;
|
|
14
|
+
this.client = client;
|
|
15
|
+
}
|
|
16
|
+
async run(filePath, execDown = false) {
|
|
17
|
+
const scriptPath = `./${filePath}`;
|
|
18
|
+
const fileName = path.parse(scriptPath).name;
|
|
19
|
+
if (!existsSync(scriptPath)) {
|
|
20
|
+
this.logger.info("Script not found under provided path", { scriptPath });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const startTime = Date.now();
|
|
24
|
+
const execScriptName = execDown ? "down" : "up";
|
|
25
|
+
const { up, down } = await import(path.resolve(scriptPath));
|
|
26
|
+
this.logger.info(`Starting migration ${execScriptName}: ${fileName}`);
|
|
27
|
+
try {
|
|
28
|
+
if (execDown) {
|
|
29
|
+
if (!down) throw new Error(`Migration script is missing 'down' function.`);
|
|
30
|
+
await down(this.db, this.client);
|
|
31
|
+
} else {
|
|
32
|
+
if (!up) throw new Error(`Migration script is missing 'up' function.`);
|
|
33
|
+
await up(this.db, this.client);
|
|
34
|
+
}
|
|
35
|
+
this.logger.info(`Migration script finished! It took ${((Date.now() - startTime) / 1e3).toFixed(1)} seconds`);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
this.logger.error(`Couldn't migrate ${execScriptName}: ${fileName}`);
|
|
38
|
+
await this.updateChangeLog(startTime, fileName, execScriptName, true);
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
await this.updateChangeLog(startTime, fileName, execScriptName);
|
|
42
|
+
}
|
|
43
|
+
async updateChangeLog(startTime, fileName, type, isFailed) {
|
|
44
|
+
const changelogCollection = this.db.collection(this.changelogCollectionName);
|
|
45
|
+
const startedAt = new Date(startTime);
|
|
46
|
+
const endedAt = /* @__PURE__ */ new Date();
|
|
47
|
+
const duration = Math.ceil((Date.now() - startTime) / 1e3);
|
|
48
|
+
const status = isFailed ? "FAILED" : "DONE";
|
|
49
|
+
try {
|
|
50
|
+
await changelogCollection.insertOne({
|
|
51
|
+
fileName,
|
|
52
|
+
type,
|
|
53
|
+
duration,
|
|
54
|
+
startedAt,
|
|
55
|
+
endedAt,
|
|
56
|
+
status
|
|
57
|
+
});
|
|
58
|
+
} catch (err) {
|
|
59
|
+
this.logger.error(`Couldn't update changelog: ${err.message}`);
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
37
63
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const node_fs_1 = require("node:fs");
|
|
41
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
42
|
-
const ts_node_1 = require("ts-node");
|
|
43
|
-
(0, ts_node_1.register)();
|
|
44
|
-
class RunMigrationCommand {
|
|
45
|
-
logger;
|
|
46
|
-
db;
|
|
47
|
-
client;
|
|
48
|
-
changelogCollectionName = 'migrations-history';
|
|
49
|
-
constructor(logger, db, client) {
|
|
50
|
-
this.logger = logger;
|
|
51
|
-
this.db = db;
|
|
52
|
-
this.client = client;
|
|
53
|
-
}
|
|
54
|
-
async run(filePath, execDown = false) {
|
|
55
|
-
const scriptPath = `./${filePath}`;
|
|
56
|
-
const fileName = node_path_1.default.parse(scriptPath).name;
|
|
57
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
58
|
-
const isExistsSync = (0, node_fs_1.existsSync)(scriptPath); // nosemgrep: eslint.detect-non-literal-fs-filename
|
|
59
|
-
if (!isExistsSync) {
|
|
60
|
-
this.logger.info('Script not found under provided path', { scriptPath });
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const startTime = Date.now();
|
|
64
|
-
const execScriptName = execDown ? 'down' : 'up';
|
|
65
|
-
const modelModule = await Promise.resolve(`${node_path_1.default.resolve(scriptPath)}`).then(s => __importStar(require(s)));
|
|
66
|
-
const { up, down } = modelModule;
|
|
67
|
-
this.logger.info(`Starting migration ${execScriptName}: ${fileName}`);
|
|
68
|
-
try {
|
|
69
|
-
if (execDown) {
|
|
70
|
-
if (!down) {
|
|
71
|
-
throw new Error(`Migration script is missing 'down' function.`);
|
|
72
|
-
}
|
|
73
|
-
await down(this.db, this.client);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
if (!up) {
|
|
77
|
-
throw new Error(`Migration script is missing 'up' function.`);
|
|
78
|
-
}
|
|
79
|
-
await up(this.db, this.client);
|
|
80
|
-
}
|
|
81
|
-
this.logger.info(`Migration script finished! It took ${((Date.now() - startTime) / 1000).toFixed(1)} seconds`);
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
this.logger.error(`Couldn't migrate ${execScriptName}: ${fileName}`);
|
|
85
|
-
await this.updateChangeLog(startTime, fileName, execScriptName, true);
|
|
86
|
-
throw err;
|
|
87
|
-
}
|
|
88
|
-
await this.updateChangeLog(startTime, fileName, execScriptName);
|
|
89
|
-
}
|
|
90
|
-
async updateChangeLog(startTime, fileName, type, isFailed) {
|
|
91
|
-
const changelogCollection = this.db.collection(this.changelogCollectionName);
|
|
92
|
-
const startedAt = new Date(startTime);
|
|
93
|
-
const endedAt = new Date();
|
|
94
|
-
const duration = Math.ceil((Date.now() - startTime) / 1000);
|
|
95
|
-
const status = isFailed ? 'FAILED' : 'DONE';
|
|
96
|
-
try {
|
|
97
|
-
await changelogCollection.insertOne({ fileName, type, duration, startedAt, endedAt, status });
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
this.logger.error(`Couldn't update changelog: ${err.message}`);
|
|
101
|
-
throw err;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
exports.RunMigrationCommand = RunMigrationCommand;
|
|
106
|
-
//# sourceMappingURL=runMigration.js.map
|
|
64
|
+
//#endregion
|
|
65
|
+
export { RunMigrationCommand };
|