@diia-inhouse/db 4.13.1 → 10.8.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 (84) hide show
  1. package/LICENCE.md +59 -59
  2. package/dist/cli/cleanupExpiredData.js +104 -0
  3. package/dist/cli/cleanupExpiredData.js.map +1 -0
  4. package/dist/cli/index.js +105 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/cli/runMigration.js +73 -0
  7. package/dist/cli/runMigration.js.map +1 -0
  8. package/dist/cli/syncIndexes.js +45 -0
  9. package/dist/cli/syncIndexes.js.map +1 -0
  10. package/dist/index.js +2 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/interfaces/database.js +3 -0
  13. package/dist/interfaces/database.js.map +1 -0
  14. package/dist/interfaces/errors.js +5 -1
  15. package/dist/interfaces/errors.js.map +1 -1
  16. package/dist/interfaces/index.js +3 -0
  17. package/dist/interfaces/index.js.map +1 -1
  18. package/dist/interfaces/metrics.js +20 -0
  19. package/dist/interfaces/metrics.js.map +1 -0
  20. package/dist/interfaces/models/index.js +19 -0
  21. package/dist/interfaces/models/index.js.map +1 -0
  22. package/dist/mongo.js +18 -3
  23. package/dist/mongo.js.map +1 -1
  24. package/dist/postgres.js +19 -0
  25. package/dist/postgres.js.map +1 -0
  26. package/dist/postgresUtils.js +20 -0
  27. package/dist/postgresUtils.js.map +1 -0
  28. package/dist/{models → schemas}/counter.js +2 -1
  29. package/dist/schemas/counter.js.map +1 -0
  30. package/dist/{models → schemas}/encryptedStorage.js +4 -2
  31. package/dist/schemas/encryptedStorage.js.map +1 -0
  32. package/dist/schemas/index.js +20 -0
  33. package/dist/schemas/index.js.map +1 -0
  34. package/dist/schemas/statusHistoryItem.js +12 -0
  35. package/dist/schemas/statusHistoryItem.js.map +1 -0
  36. package/dist/services/counter.js +60 -8
  37. package/dist/services/counter.js.map +1 -1
  38. package/dist/services/database.js +123 -55
  39. package/dist/services/database.js.map +1 -1
  40. package/dist/services/encryptedStorage.js +136 -15
  41. package/dist/services/encryptedStorage.js.map +1 -1
  42. package/dist/services/index.js +1 -0
  43. package/dist/services/index.js.map +1 -1
  44. package/dist/services/postgresDatabase.js +25 -0
  45. package/dist/services/postgresDatabase.js.map +1 -0
  46. package/dist/tables/counter.js +12 -0
  47. package/dist/tables/counter.js.map +1 -0
  48. package/dist/tables/encryptedStorage.js +14 -0
  49. package/dist/tables/encryptedStorage.js.map +1 -0
  50. package/dist/tables/index.js +19 -0
  51. package/dist/tables/index.js.map +1 -0
  52. package/dist/types/cli/cleanupExpiredData.d.ts +11 -0
  53. package/dist/types/cli/index.d.ts +2 -0
  54. package/dist/types/cli/runMigration.d.ts +11 -0
  55. package/dist/types/cli/syncIndexes.d.ts +7 -0
  56. package/dist/types/index.d.ts +2 -0
  57. package/dist/types/interfaces/database.d.ts +8 -0
  58. package/dist/types/interfaces/dbConfig.d.ts +8 -29
  59. package/dist/types/interfaces/errors.d.ts +5 -1
  60. package/dist/types/interfaces/index.d.ts +3 -25
  61. package/dist/types/interfaces/metrics.d.ts +20 -0
  62. package/dist/types/interfaces/migrateMongoConfig.d.ts +0 -24
  63. package/dist/types/interfaces/models/counter.d.ts +0 -27
  64. package/dist/types/interfaces/models/encryptedStorage.d.ts +1 -27
  65. package/dist/types/interfaces/models/index.d.ts +2 -0
  66. package/dist/types/postgres.d.ts +2 -0
  67. package/dist/types/postgresUtils.d.ts +26 -0
  68. package/dist/types/schemas/counter.d.ts +12 -0
  69. package/dist/types/schemas/encryptedStorage.d.ts +12 -0
  70. package/dist/types/schemas/index.d.ts +3 -0
  71. package/dist/types/schemas/statusHistoryItem.d.ts +3 -0
  72. package/dist/types/services/counter.d.ts +11 -0
  73. package/dist/types/services/database.d.ts +33 -33
  74. package/dist/types/services/encryptedStorage.d.ts +60 -34
  75. package/dist/types/services/index.d.ts +1 -0
  76. package/dist/types/services/postgresDatabase.d.ts +8 -0
  77. package/dist/types/tables/counter.d.ts +94 -0
  78. package/dist/types/tables/encryptedStorage.d.ts +111 -0
  79. package/dist/types/tables/index.d.ts +2 -0
  80. package/package.json +62 -61
  81. package/dist/models/counter.js.map +0 -1
  82. package/dist/models/encryptedStorage.js.map +0 -1
  83. package/dist/types/models/counter.d.ts +0 -30
  84. package/dist/types/models/encryptedStorage.d.ts +0 -30
package/dist/mongo.js CHANGED
@@ -10,8 +10,23 @@ const errors_1 = require("@diia-inhouse/errors");
10
10
  const interfaces_1 = require("./interfaces");
11
11
  exports.MongoHelper = {
12
12
  async getMigrateMongoConfig() {
13
- const envService = new env_1.EnvService(new diia_logger_1.default());
13
+ const logger = new diia_logger_1.default();
14
+ const envService = new env_1.EnvService(logger);
14
15
  await envService.init();
16
+ const originalExit = process.exit;
17
+ process.exit = (code) => {
18
+ logger.info('Destroying the Env service on process exit...', { code });
19
+ return envService
20
+ .onDestroy()
21
+ .then(() => {
22
+ logger.info('Env service destroyed, exiting the process...', { code });
23
+ return originalExit(code);
24
+ })
25
+ .catch((err) => {
26
+ logger.error('Env service destroy error', { err });
27
+ originalExit(code);
28
+ });
29
+ };
15
30
  const user = await envService.getSecret('MONGO_USER', { accessor: 'username', nullable: true });
16
31
  const password = await envService.getSecret('MONGO_PASSWORD', { accessor: 'password', nullable: true });
17
32
  return {
@@ -48,9 +63,9 @@ exports.MongoHelper = {
48
63
  return mongoUrl;
49
64
  },
50
65
  getMongoErrorDupField(msg, fields) {
51
- // eslint-disable-next-line no-restricted-syntax
52
66
  for (const field of fields) {
53
- const fieldRegExp = new RegExp(`${field}_[0-9] dup key`);
67
+ // eslint-disable-next-line security/detect-non-literal-regexp
68
+ const fieldRegExp = new RegExp(`${field}_[0-9] dup key`); // nosemgrep: eslint.detect-non-literal-regexp
54
69
  if (fieldRegExp.test(msg)) {
55
70
  return field;
56
71
  }
package/dist/mongo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../src/mongo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../src/mongo.ts"],"names":[],"mappings":"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"}
@@ -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("./tables"), exports);
18
+ __exportStar(require("./postgresUtils"), exports);
19
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AAExB,kDAA+B"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expiringTimestamp = exports.timestamps = void 0;
4
+ const pg_core_1 = require("drizzle-orm/pg-core");
5
+ exports.timestamps = {
6
+ createdAt: (0, pg_core_1.timestamp)('created_at').defaultNow().notNull(),
7
+ updatedAt: (0, pg_core_1.timestamp)('updated_at')
8
+ .defaultNow()
9
+ .$onUpdate(() => new Date())
10
+ .notNull(),
11
+ };
12
+ exports.expiringTimestamp = (0, pg_core_1.customType)({
13
+ dataType() {
14
+ return `timestamp`;
15
+ },
16
+ fromDriver(value) {
17
+ return new Date(value);
18
+ },
19
+ });
20
+ //# sourceMappingURL=postgresUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresUtils.js","sourceRoot":"","sources":["../src/postgresUtils.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAE9C,QAAA,UAAU,GAAG;IACtB,SAAS,EAAE,IAAA,mBAAS,EAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACzD,SAAS,EAAE,IAAA,mBAAS,EAAC,YAAY,CAAC;SAC7B,UAAU,EAAE;SACZ,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;SAC3B,OAAO,EAAE;CACjB,CAAA;AAEY,QAAA,iBAAiB,GAAG,IAAA,oBAAU,EAKxC;IACC,QAAQ;QACJ,OAAO,WAAW,CAAA;IACtB,CAAC;IACD,UAAU,CAAC,KAAa;QACpB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;CACJ,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.counterSchema = void 0;
3
4
  const mongoose_1 = require("mongoose");
4
5
  const counterSchema = new mongoose_1.Schema({
5
6
  code: { type: String, required: true },
@@ -8,6 +9,6 @@ const counterSchema = new mongoose_1.Schema({
8
9
  }, {
9
10
  timestamps: true,
10
11
  });
12
+ exports.counterSchema = counterSchema;
11
13
  counterSchema.index({ code: 1, date: -1 }, { unique: true });
12
- exports.default = mongoose_1.models.Counter || (0, mongoose_1.model)('Counter', counterSchema);
13
14
  //# sourceMappingURL=counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/schemas/counter.ts"],"names":[],"mappings":";;;AAAA,uCAAiC;AAIjC,MAAM,aAAa,GAAG,IAAI,iBAAM,CAC5B;IACI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;CACvB,EACD;IACI,UAAU,EAAE,IAAI;CACnB,CACJ,CAAA;AAIQ,sCAAa;AAFtB,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encryptedStorageSchema = void 0;
3
4
  const mongoose_1 = require("mongoose");
5
+ const types_1 = require("@diia-inhouse/types");
4
6
  const encryptedStorageSchema = new mongoose_1.Schema({
5
7
  data: { type: String, required: true },
6
8
  expiresAt: { type: Date, required: true },
@@ -8,6 +10,6 @@ const encryptedStorageSchema = new mongoose_1.Schema({
8
10
  }, {
9
11
  timestamps: true,
10
12
  });
11
- encryptedStorageSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 86400 /* DurationS.Day */ });
12
- exports.default = mongoose_1.models.EncryptedStorage || (0, mongoose_1.model)('EncryptedStorage', encryptedStorageSchema);
13
+ exports.encryptedStorageSchema = encryptedStorageSchema;
14
+ encryptedStorageSchema.index({ expiresAt: 1 }, { expireAfterSeconds: types_1.DurationS.Day });
13
15
  //# sourceMappingURL=encryptedStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryptedStorage.js","sourceRoot":"","sources":["../../src/schemas/encryptedStorage.ts"],"names":[],"mappings":";;;AAAA,uCAAiC;AAEjC,+CAA+C;AAI/C,MAAM,sBAAsB,GAAG,IAAI,iBAAM,CACrC;IACI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;CACvB,EACD;IACI,UAAU,EAAE,IAAI;CACnB,CACJ,CAAA;AAIQ,wDAAsB;AAF/B,sBAAsB,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,iBAAS,CAAC,GAAG,EAAE,CAAC,CAAA"}
@@ -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("./counter"), exports);
18
+ __exportStar(require("./encryptedStorage"), exports);
19
+ __exportStar(require("./statusHistoryItem"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AAEzB,qDAAkC;AAElC,sDAAmC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStatusHistoryItemSchema = createStatusHistoryItemSchema;
4
+ const mongoose_1 = require("mongoose");
5
+ function createStatusHistoryItemSchema(statuses) {
6
+ return new mongoose_1.Schema({
7
+ traceId: { type: String },
8
+ date: { type: Date, required: true },
9
+ status: { type: String, enum: statuses, required: true },
10
+ }, { _id: false });
11
+ }
12
+ //# sourceMappingURL=statusHistoryItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusHistoryItem.js","sourceRoot":"","sources":["../../src/schemas/statusHistoryItem.ts"],"names":[],"mappings":";;AAIA,sEASC;AAbD,uCAAiC;AAIjC,SAAgB,6BAA6B,CAAC,QAAkB;IAC5D,OAAO,IAAI,iBAAM,CACb;QACI,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACzB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QACpC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC3D,EACD,EAAE,GAAG,EAAE,KAAK,EAAE,CACjB,CAAA;AACL,CAAC"}
@@ -1,19 +1,71 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.CounterService = void 0;
4
+ const drizzle_orm_1 = require("drizzle-orm");
7
5
  const luxon_1 = require("luxon");
8
- const counter_1 = __importDefault(require("../models/counter"));
6
+ const tables_1 = require("../tables");
9
7
  class CounterService {
8
+ databaseAdapter;
9
+ counterModel;
10
+ postgresDatabase;
11
+ getNextValueStrategy = {
12
+ postgres: async (code) => {
13
+ const result = await this.getPostgresDatabase()
14
+ .insert(tables_1.counter)
15
+ .values({ code, value: 1, date: luxon_1.DateTime.now().startOf('day').toJSDate() })
16
+ .onConflictDoUpdate({
17
+ target: [tables_1.counter.code, tables_1.counter.date],
18
+ set: { value: (0, drizzle_orm_1.sql) `${tables_1.counter.value} + 1` },
19
+ })
20
+ .returning()
21
+ .then((rows) => rows[0]);
22
+ return result.value;
23
+ },
24
+ mongo: async (code) => {
25
+ const result = await this.getModel().findOneAndUpdate({ code }, { $inc: { value: 1 } }, { new: true, upsert: true });
26
+ return result.value;
27
+ },
28
+ };
29
+ getNextDailyValueStrategy = {
30
+ postgres: async (code) => {
31
+ const result = await this.getPostgresDatabase()
32
+ .insert(tables_1.counter)
33
+ .values({ code, value: 1, date: luxon_1.DateTime.now().startOf('day').toJSDate() })
34
+ .onConflictDoUpdate({
35
+ target: [tables_1.counter.code, tables_1.counter.date],
36
+ set: { value: (0, drizzle_orm_1.sql) `${tables_1.counter.value} + 1` },
37
+ })
38
+ .returning()
39
+ .then((rows) => rows[0]);
40
+ return result.value;
41
+ },
42
+ mongo: async (code) => {
43
+ const result = await this.getModel().findOneAndUpdate({ code, date: luxon_1.DateTime.now().startOf('day').toJSDate() }, { $inc: { value: 1 } }, { new: true, upsert: true });
44
+ return result.value;
45
+ },
46
+ };
47
+ constructor(databaseAdapter, counterModel = null, postgresDatabase = null) {
48
+ this.databaseAdapter = databaseAdapter;
49
+ this.counterModel = counterModel;
50
+ this.postgresDatabase = postgresDatabase;
51
+ }
10
52
  async getNextValue(code) {
11
- const { value } = await counter_1.default.findOneAndUpdate({ code }, { $inc: { value: 1 } }, { new: true, upsert: true });
12
- return value;
53
+ return await this.getNextValueStrategy[this.databaseAdapter](code);
13
54
  }
14
55
  async getNextDailyValue(code) {
15
- const { value } = await counter_1.default.findOneAndUpdate({ code, date: luxon_1.DateTime.now().startOf('day').toJSDate() }, { $inc: { value: 1 } }, { new: true, upsert: true });
16
- return value;
56
+ return await this.getNextDailyValueStrategy[this.databaseAdapter](code);
57
+ }
58
+ getModel() {
59
+ if (!this.counterModel) {
60
+ throw new Error('Counter model is not provided');
61
+ }
62
+ return this.counterModel;
63
+ }
64
+ getPostgresDatabase() {
65
+ if (!this.postgresDatabase) {
66
+ throw new Error('Postgres database is not provided');
67
+ }
68
+ return this.postgresDatabase;
17
69
  }
18
70
  }
19
71
  exports.CounterService = CounterService;
@@ -1 +1 @@
1
- {"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/services/counter.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAgC;AAEhC,gEAA4C;AAE5C,MAAa,cAAc;IACvB,KAAK,CAAC,YAAY,CAAC,IAAY;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAY,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QAEpH,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAChC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAY,CAAC,gBAAgB,CACjD,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,EACxD,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EACtB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAC9B,CAAA;QAED,OAAO,KAAK,CAAA;IAChB,CAAC;CACJ;AAhBD,wCAgBC"}
1
+ {"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/services/counter.ts"],"names":[],"mappings":"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"}
@@ -4,32 +4,51 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.DatabaseService = void 0;
7
- const node_fs_1 = __importDefault(require("node:fs"));
8
- const node_path_1 = __importDefault(require("node:path"));
9
7
  const lodash_1 = require("lodash");
10
8
  const mongoose_1 = __importDefault(require("mongoose"));
11
- const recursive_readdir_1 = __importDefault(require("recursive-readdir"));
9
+ const diia_metrics_1 = require("@diia-inhouse/diia-metrics");
12
10
  const errors_1 = require("@diia-inhouse/errors");
13
11
  const types_1 = require("@diia-inhouse/types");
14
12
  const interfaces_1 = require("../interfaces");
15
13
  class DatabaseService {
14
+ databaseAdapter;
16
15
  dbConfigs;
17
16
  envService;
18
17
  logger;
18
+ defaultModelsDir = 'models';
19
+ db = {};
20
+ dbOperationsHistogram;
21
+ dbOplogObserver;
22
+ observerInterval;
23
+ dbOplog = {};
24
+ isMonitoringEnabled = false;
19
25
  dbStateCodeToName = {
20
26
  [mongoose_1.default.ConnectionStates.disconnected]: interfaces_1.DbConnectionStatus.Disconnected,
21
27
  [mongoose_1.default.ConnectionStates.connected]: interfaces_1.DbConnectionStatus.Connected,
22
28
  [mongoose_1.default.ConnectionStates.connecting]: interfaces_1.DbConnectionStatus.Connecting,
23
29
  [mongoose_1.default.ConnectionStates.disconnecting]: interfaces_1.DbConnectionStatus.Disconnecting,
24
30
  };
25
- defaultModelsDir = 'models';
26
- db = {};
27
- constructor(dbConfigs, envService, logger) {
31
+ /**
32
+ * https://www.mongodb.com/docs/manual/core/transactions/#read-concern-write-concern-read-preference
33
+ */
34
+ defaultTransactionOptions = {
35
+ readPreference: 'primary',
36
+ };
37
+ constructor(databaseAdapter, dbConfigs, envService, logger) {
38
+ this.databaseAdapter = databaseAdapter;
28
39
  this.dbConfigs = dbConfigs;
29
40
  this.envService = envService;
30
41
  this.logger = logger;
42
+ this.isMonitoringEnabled = this.dbConfigs.main?.metrics.enabled || false;
43
+ if (this.isMonitoringEnabled) {
44
+ this.dbOperationsHistogram = new diia_metrics_1.Histogram('diia_mongodb_operation_seconds', interfaces_1.mongodbOperationsAllowedFields, 'Mongodb operation duration in seconds', this.dbConfigs.main?.metrics.buckets || interfaces_1.mongodbOperationsDefaultBuckets);
45
+ this.dbOplogObserver = new diia_metrics_1.Observer('diia_mongodb_oplog_cache_size', [], 'Amount of operations stored in in-memory cache for monitoring');
46
+ }
31
47
  }
32
48
  async onInit() {
49
+ if (this.databaseAdapter !== 'mongo') {
50
+ return;
51
+ }
33
52
  const tasks = Object.entries(this.dbConfigs).map(async ([type, config]) => {
34
53
  const dbType = type;
35
54
  const connection = await this.createDbConnection(dbType, config);
@@ -38,9 +57,18 @@ class DatabaseService {
38
57
  }
39
58
  });
40
59
  await Promise.all(tasks);
41
- const mainConfig = this.dbConfigs[interfaces_1.DbType.Main];
42
- if (mainConfig?.indexes?.sync) {
43
- await this.syncIndexes(mainConfig.indexes.exitAfterSync);
60
+ if (this.isMonitoringEnabled) {
61
+ this.observerInterval = setInterval(() => {
62
+ this.oplogObserver();
63
+ }, 5000);
64
+ }
65
+ }
66
+ async onDestroy() {
67
+ if (this.isMonitoringEnabled) {
68
+ clearInterval(this.observerInterval);
69
+ }
70
+ for (const db of Object.values(this.db)) {
71
+ await db.connection.close();
44
72
  }
45
73
  }
46
74
  async onHealthCheck() {
@@ -49,7 +77,7 @@ class DatabaseService {
49
77
  const dbType = type;
50
78
  try {
51
79
  await db.connection.db
52
- .listCollections({}, {
80
+ ?.listCollections({}, {
53
81
  nameOnly: true,
54
82
  authorizedCollections: true,
55
83
  })
@@ -135,12 +163,15 @@ class DatabaseService {
135
163
  }
136
164
  let connection;
137
165
  if (type === interfaces_1.DbType.Main) {
138
- await mongoose_1.default.connect(connectionString, connectionOptions);
166
+ await mongoose_1.default.connect(connectionString, { ...connectionOptions, monitorCommands: this.isMonitoringEnabled });
139
167
  connection = mongoose_1.default.connection;
140
168
  }
141
169
  else {
142
170
  connection = await mongoose_1.default.createConnection(connectionString, connectionOptions).asPromise();
143
171
  }
172
+ if (this.isMonitoringEnabled) {
173
+ this.connectMonitor(connection);
174
+ }
144
175
  connection.on('error', (err) => {
145
176
  this.logger.error('Mongo connection error', { err, type });
146
177
  });
@@ -151,50 +182,30 @@ class DatabaseService {
151
182
  throw new errors_1.DatabaseError('Failed to connect to Database');
152
183
  }
153
184
  }
154
- async syncIndexes(exitAfterSync = false, modelsDir) {
155
- const modelsPath = `./dist/${modelsDir || this.defaultModelsDir}`;
156
- try {
157
- if (!node_fs_1.default.existsSync(modelsPath)) {
158
- this.logger.info('Models dir is absent, indexes sync skipped');
159
- return;
160
- }
161
- const t0 = Date.now();
162
- this.logger.info('Start syncing indexes');
163
- const files = await (0, recursive_readdir_1.default)(modelsPath, ['*.map', 'index.js', 'schemas']);
164
- const tasks = [];
165
- for (const fileName of files) {
166
- // eslint-disable-next-line @typescript-eslint/no-var-requires
167
- const modelModule = require(node_path_1.default.resolve(fileName));
168
- if (modelModule.skipSyncIndexes) {
169
- continue;
170
- }
171
- const task = modelModule.default;
172
- tasks.push(this.syncModel(task));
173
- }
174
- await Promise.all(tasks);
175
- this.logger.info(`Ended syncing indexes in ${Date.now() - t0} ms`);
176
- this.logger.info('Successfully synced indexes');
177
- }
178
- catch (err) {
179
- this.logger.error('Failed to syncing indexes', { err });
180
- throw err;
181
- }
182
- finally {
183
- if (exitAfterSync) {
184
- this.logger.info('Process exit after synced indexes');
185
- // eslint-disable-next-line no-process-exit, unicorn/no-process-exit, n/no-process-exit
186
- process.exit(0);
187
- }
188
- }
189
- }
190
- async beginTransaction(dbType = interfaces_1.DbType.Main) {
191
- const connection = this.db[dbType]?.connection;
185
+ /**
186
+ * Begins a new MongoDB transaction by starting a session and transaction
187
+ *
188
+ * @param options - Optional transaction options to override the default transaction settings
189
+ * @returns A ClientSession with an active transaction
190
+ * @throws {DatabaseError} If the database connection is undefined or transaction fails to start
191
+ *
192
+ * @remarks
193
+ * - Uses the main database connection to start the session
194
+ * - Applies default transaction options (readPreference: primary)
195
+ * - Will abort transaction and end session if any errors occur during setup
196
+ */
197
+ async beginTransaction(options) {
198
+ const connection = this.db[interfaces_1.DbType.Main]?.connection;
192
199
  if (!connection) {
193
200
  throw new errors_1.DatabaseError('Connection is undefined');
194
201
  }
195
202
  const session = await connection.startSession();
196
203
  try {
197
- session.startTransaction();
204
+ const transactionOptions = {
205
+ ...this.defaultTransactionOptions,
206
+ ...options,
207
+ };
208
+ session.startTransaction(transactionOptions);
198
209
  return session;
199
210
  }
200
211
  catch (err) {
@@ -203,11 +214,68 @@ class DatabaseService {
203
214
  throw new errors_1.DatabaseError('Unable to begin transaction', { err });
204
215
  }
205
216
  }
206
- async syncModel(model) {
207
- const t0 = Date.now();
208
- this.logger.info(`Start syncing indexes for the ${model.modelName} collection`);
209
- await model.syncIndexes();
210
- this.logger.info(`Ended syncing indexes for the ${model.modelName} collection in ${Date.now() - t0} ms`);
217
+ connectMonitor(connection) {
218
+ try {
219
+ const client = connection.getClient();
220
+ client.on('commandStarted', (event) => {
221
+ const db = event.databaseName;
222
+ const opType = event.commandName;
223
+ const key = `${event.requestId}${event.connectionId}`;
224
+ const parsedCollection = Number.parseInt(event.command[opType] || '', 10);
225
+ const collection = Number.isNaN(parsedCollection) ? event.command[opType] : undefined;
226
+ this.dbOplog[key] = {
227
+ database: db,
228
+ collection,
229
+ opType,
230
+ };
231
+ this.logger.debug('Mongodb commandStarted operation', {
232
+ database: db,
233
+ collection,
234
+ operation: opType,
235
+ command: event.command,
236
+ });
237
+ });
238
+ client.on('commandSucceeded', (event) => {
239
+ const key = `${event.requestId}${event.connectionId}`;
240
+ const oplogEntry = this.dbOplog[key];
241
+ const durationMs = event.duration;
242
+ delete this.dbOplog[key];
243
+ this.logger.debug('Mongodb commandSucceeded operation', {
244
+ database: oplogEntry.database,
245
+ operation: oplogEntry.opType,
246
+ collection: oplogEntry.collection,
247
+ });
248
+ this.dbOperationsHistogram?.observe({
249
+ operation: oplogEntry.opType,
250
+ status: interfaces_1.MongodbOperationResult.Successful,
251
+ database: oplogEntry.database,
252
+ ...(oplogEntry.collection && { collection: oplogEntry.collection }),
253
+ }, durationMs / 1000);
254
+ });
255
+ client.on('commandFailed', (event) => {
256
+ const key = `${event.requestId}${event.connectionId}`;
257
+ const oplogEntry = this.dbOplog[key];
258
+ const durationMs = event.duration;
259
+ delete this.dbOplog[key];
260
+ this.logger.debug('Mongodb commandFailed operation', {
261
+ database: oplogEntry.database,
262
+ operation: oplogEntry.opType,
263
+ collection: oplogEntry.collection,
264
+ });
265
+ this.dbOperationsHistogram?.observe({
266
+ operation: oplogEntry.opType,
267
+ status: interfaces_1.MongodbOperationResult.Failed,
268
+ database: oplogEntry.database,
269
+ ...(oplogEntry.collection && { collection: oplogEntry.collection }),
270
+ }, durationMs / 1000);
271
+ });
272
+ }
273
+ catch (err) {
274
+ this.logger.error("Couldn't attach commands monitor", { err });
275
+ }
276
+ }
277
+ oplogObserver() {
278
+ this.dbOplogObserver?.observe({}, Object.keys(this.dbOplog).length);
211
279
  }
212
280
  }
213
281
  exports.DatabaseService = DatabaseService;
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"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"}