@diia-inhouse/db 10.8.12 → 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.
Files changed (118) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +27 -0
  2. package/dist/cli/cleanupExpiredData.js +83 -136
  3. package/dist/cli/index.d.ts +1 -0
  4. package/dist/cli/index.js +85 -100
  5. package/dist/cli/runMigration.js +64 -105
  6. package/dist/cli/syncIndexes.js +38 -77
  7. package/dist/index.d.ts +28 -0
  8. package/dist/index.js +23 -22
  9. package/dist/interfaces/database.d.ts +10 -0
  10. package/dist/interfaces/dbConfig.d.ts +37 -0
  11. package/dist/interfaces/dbConfig.js +8 -9
  12. package/dist/interfaces/errors.d.ts +43 -0
  13. package/dist/interfaces/errors.js +42 -50
  14. package/dist/interfaces/index.d.ts +15 -0
  15. package/dist/interfaces/index.js +11 -25
  16. package/dist/interfaces/metrics.d.ts +22 -0
  17. package/dist/interfaces/metrics.js +38 -19
  18. package/dist/interfaces/migrateMongoConfig.d.ts +17 -0
  19. package/dist/interfaces/models/counter.d.ts +8 -0
  20. package/dist/interfaces/models/encryptedStorage.d.ts +9 -0
  21. package/dist/interfaces/mongoStatus.d.ts +16 -0
  22. package/dist/interfaces/mongoStatus.js +11 -12
  23. package/dist/mongo.d.ts +12 -0
  24. package/dist/mongo.js +71 -89
  25. package/dist/postgres.d.ts +4 -0
  26. package/dist/postgres.js +5 -19
  27. package/dist/postgresUtils.d.ts +8 -0
  28. package/dist/postgresUtils.js +14 -18
  29. package/dist/schemas/counter.d.ts +7 -0
  30. package/dist/schemas/counter.js +19 -14
  31. package/dist/schemas/encryptedStorage.d.ts +7 -0
  32. package/dist/schemas/encryptedStorage.js +17 -15
  33. package/dist/schemas/index.d.ts +3 -0
  34. package/dist/schemas/index.js +4 -20
  35. package/dist/schemas/statusHistoryItem.d.ts +7 -0
  36. package/dist/schemas/statusHistoryItem.js +16 -10
  37. package/dist/services/counter.d.ts +19 -0
  38. package/dist/services/counter.js +70 -72
  39. package/dist/services/database.d.ts +50 -0
  40. package/dist/services/database.js +255 -281
  41. package/dist/services/encryptedStorage.d.ts +73 -0
  42. package/dist/services/encryptedStorage.js +178 -214
  43. package/dist/services/index.d.ts +4 -0
  44. package/dist/services/index.js +5 -21
  45. package/dist/services/postgresDatabase.d.ts +12 -0
  46. package/dist/services/postgresDatabase.js +20 -25
  47. package/dist/tables/counter.d.ts +4 -0
  48. package/dist/tables/counter.js +11 -12
  49. package/dist/tables/encryptedStorage.d.ts +4 -0
  50. package/dist/tables/encryptedStorage.js +12 -13
  51. package/dist/tables/index.d.ts +9 -0
  52. package/dist/tables/index.js +3 -19
  53. package/package.json +47 -48
  54. package/dist/cli/cleanupExpiredData.js.map +0 -1
  55. package/dist/cli/index.js.map +0 -1
  56. package/dist/cli/runMigration.js.map +0 -1
  57. package/dist/cli/syncIndexes.js.map +0 -1
  58. package/dist/index.js.map +0 -1
  59. package/dist/interfaces/database.js +0 -3
  60. package/dist/interfaces/database.js.map +0 -1
  61. package/dist/interfaces/dbConfig.js.map +0 -1
  62. package/dist/interfaces/errors.js.map +0 -1
  63. package/dist/interfaces/index.js.map +0 -1
  64. package/dist/interfaces/metrics.js.map +0 -1
  65. package/dist/interfaces/migrateMongoConfig.js +0 -3
  66. package/dist/interfaces/migrateMongoConfig.js.map +0 -1
  67. package/dist/interfaces/models/counter.js +0 -3
  68. package/dist/interfaces/models/counter.js.map +0 -1
  69. package/dist/interfaces/models/encryptedStorage.js +0 -3
  70. package/dist/interfaces/models/encryptedStorage.js.map +0 -1
  71. package/dist/interfaces/models/index.js +0 -19
  72. package/dist/interfaces/models/index.js.map +0 -1
  73. package/dist/interfaces/mongoStatus.js.map +0 -1
  74. package/dist/mongo.js.map +0 -1
  75. package/dist/postgres.js.map +0 -1
  76. package/dist/postgresUtils.js.map +0 -1
  77. package/dist/schemas/counter.js.map +0 -1
  78. package/dist/schemas/encryptedStorage.js.map +0 -1
  79. package/dist/schemas/index.js.map +0 -1
  80. package/dist/schemas/statusHistoryItem.js.map +0 -1
  81. package/dist/services/counter.js.map +0 -1
  82. package/dist/services/database.js.map +0 -1
  83. package/dist/services/encryptedStorage.js.map +0 -1
  84. package/dist/services/index.js.map +0 -1
  85. package/dist/services/postgresDatabase.js.map +0 -1
  86. package/dist/tables/counter.js.map +0 -1
  87. package/dist/tables/encryptedStorage.js.map +0 -1
  88. package/dist/tables/index.js.map +0 -1
  89. package/dist/types/cli/cleanupExpiredData.d.ts +0 -11
  90. package/dist/types/cli/index.d.ts +0 -2
  91. package/dist/types/cli/runMigration.d.ts +0 -11
  92. package/dist/types/cli/syncIndexes.d.ts +0 -7
  93. package/dist/types/index.d.ts +0 -5
  94. package/dist/types/interfaces/database.d.ts +0 -8
  95. package/dist/types/interfaces/dbConfig.d.ts +0 -33
  96. package/dist/types/interfaces/errors.d.ts +0 -40
  97. package/dist/types/interfaces/index.d.ts +0 -8
  98. package/dist/types/interfaces/metrics.d.ts +0 -20
  99. package/dist/types/interfaces/migrateMongoConfig.d.ts +0 -13
  100. package/dist/types/interfaces/models/counter.d.ts +0 -5
  101. package/dist/types/interfaces/models/encryptedStorage.d.ts +0 -6
  102. package/dist/types/interfaces/models/index.d.ts +0 -2
  103. package/dist/types/interfaces/mongoStatus.d.ts +0 -12
  104. package/dist/types/mongo.d.ts +0 -9
  105. package/dist/types/postgres.d.ts +0 -2
  106. package/dist/types/postgresUtils.d.ts +0 -26
  107. package/dist/types/schemas/counter.d.ts +0 -12
  108. package/dist/types/schemas/encryptedStorage.d.ts +0 -12
  109. package/dist/types/schemas/index.d.ts +0 -3
  110. package/dist/types/schemas/statusHistoryItem.d.ts +0 -3
  111. package/dist/types/services/counter.d.ts +0 -15
  112. package/dist/types/services/database.d.ts +0 -43
  113. package/dist/types/services/encryptedStorage.d.ts +0 -69
  114. package/dist/types/services/index.d.ts +0 -4
  115. package/dist/types/services/postgresDatabase.d.ts +0 -8
  116. package/dist/types/tables/counter.d.ts +0 -94
  117. package/dist/types/tables/encryptedStorage.d.ts +0 -111
  118. 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
- "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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.CleanupExpiredDataCommand = void 0;
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
- "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- const yargs_1 = __importDefault(require("yargs"));
8
- const helpers_1 = require("yargs/helpers");
9
- const diia_logger_1 = __importDefault(require("@diia-inhouse/diia-logger"));
10
- const env_1 = require("@diia-inhouse/env");
11
- const interfaces_1 = require("../interfaces");
12
- const database_1 = require("../services/database");
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
- return new database_1.DatabaseService('mongo', {
18
- [interfaces_1.DbType.Main]: {
19
- database: env_1.EnvService.getVar('MONGO_DATABASE'),
20
- replicaSet: env_1.EnvService.getVar('MONGO_REPLICA_SET'),
21
- user: await envService.getSecret('MONGO_USER', { accessor: 'username', nullable: true }),
22
- password: await envService.getSecret('MONGO_PASSWORD', { accessor: 'password', nullable: true }),
23
- authSource: env_1.EnvService.getVar('MONGO_AUTH_SOURCE', 'string', null),
24
- port: env_1.EnvService.getVar('MONGO_PORT', 'number'),
25
- replicaSetNodes: env_1.EnvService.getVar('MONGO_HOSTS', 'string')
26
- .split(',')
27
- .map((replicaHost) => ({ replicaHost })),
28
- readPreference: env_1.EnvService.getVar('MONGO_READ_PREFERENCE'),
29
- metrics: {
30
- enabled: false,
31
- },
32
- },
33
- }, envService, logger);
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
- await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
37
- .command('sync-indexes', 'Sync indexes for MongoDB models', (args) => args.option('modelsDir', {
38
- type: 'string',
39
- default: 'models',
40
- describe: 'Directory for models',
41
- }), async (argv) => {
42
- const logger = new diia_logger_1.default();
43
- const envService = new env_1.EnvService(logger);
44
- await envService.init();
45
- const command = new syncIndexes_1.SyncIndexesCommand(logger);
46
- try {
47
- const databaseService = await createDatabaseService(envService, logger);
48
- await databaseService.onInit();
49
- await command.run(argv.modelsDir);
50
- await databaseService.onDestroy();
51
- }
52
- finally {
53
- await envService.onDestroy();
54
- }
55
- })
56
- .command('migrate', 'Run MongoDB migration script', (args) => args
57
- .option('path', {
58
- type: 'string',
59
- demandOption: true,
60
- describe: 'Path to migration script',
61
- })
62
- .option('down', {
63
- type: 'boolean',
64
- default: false,
65
- describe: 'Run migration down script',
66
- }), async (argv) => {
67
- const logger = new diia_logger_1.default();
68
- const envService = new env_1.EnvService(logger);
69
- await envService.init();
70
- try {
71
- const databaseService = await createDatabaseService(envService, logger);
72
- await databaseService.onInit();
73
- const db = databaseService.db.main?.connection.db;
74
- const client = databaseService.db.main?.connection.getClient();
75
- if (!db || !client) {
76
- throw new Error('Expected db and client to be defined');
77
- }
78
- const command = new runMigration_1.RunMigrationCommand(logger, db, client);
79
- await command.run(argv.path, argv.down);
80
- await databaseService.onDestroy();
81
- }
82
- finally {
83
- await envService.onDestroy();
84
- }
85
- })
86
- .command('pg-cleanup-expired-data', 'Cleanup expired data for PostgreSQL tables based on expiring timestamp', (args) => args.option('path', {
87
- type: 'string',
88
- default: 'db/schemas',
89
- describe: 'Path to schemas directory',
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
- void main();
105
- //# sourceMappingURL=index.js.map
88
+ main();
89
+ //#endregion
90
+ export {};
@@ -1,106 +1,65 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.RunMigrationCommand = void 0;
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 };