@ciscode/database-kit 1.0.0 → 1.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 (48) hide show
  1. package/CHANGELOG.md +50 -4
  2. package/README.md +487 -148
  3. package/dist/adapters/mongo.adapter.d.ts +53 -3
  4. package/dist/adapters/mongo.adapter.d.ts.map +1 -1
  5. package/dist/adapters/mongo.adapter.js +410 -27
  6. package/dist/adapters/mongo.adapter.js.map +1 -1
  7. package/dist/adapters/postgres.adapter.d.ts +50 -3
  8. package/dist/adapters/postgres.adapter.d.ts.map +1 -1
  9. package/dist/adapters/postgres.adapter.js +439 -45
  10. package/dist/adapters/postgres.adapter.js.map +1 -1
  11. package/dist/config/database.config.d.ts +1 -1
  12. package/dist/config/database.config.d.ts.map +1 -1
  13. package/dist/config/database.config.js +13 -13
  14. package/dist/config/database.config.js.map +1 -1
  15. package/dist/config/database.constants.js +7 -7
  16. package/dist/contracts/database.contracts.d.ts +283 -6
  17. package/dist/contracts/database.contracts.d.ts.map +1 -1
  18. package/dist/contracts/database.contracts.js +6 -1
  19. package/dist/contracts/database.contracts.js.map +1 -1
  20. package/dist/database-kit.module.d.ts +2 -2
  21. package/dist/database-kit.module.d.ts.map +1 -1
  22. package/dist/database-kit.module.js +1 -2
  23. package/dist/database-kit.module.js.map +1 -1
  24. package/dist/filters/database-exception.filter.d.ts +1 -1
  25. package/dist/filters/database-exception.filter.d.ts.map +1 -1
  26. package/dist/filters/database-exception.filter.js +43 -43
  27. package/dist/filters/database-exception.filter.js.map +1 -1
  28. package/dist/index.d.ts +10 -10
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/middleware/database.decorators.d.ts.map +1 -1
  32. package/dist/middleware/database.decorators.js.map +1 -1
  33. package/dist/services/database.service.d.ts +83 -5
  34. package/dist/services/database.service.d.ts.map +1 -1
  35. package/dist/services/database.service.js +136 -16
  36. package/dist/services/database.service.js.map +1 -1
  37. package/dist/services/logger.service.d.ts +1 -1
  38. package/dist/services/logger.service.d.ts.map +1 -1
  39. package/dist/services/logger.service.js +1 -1
  40. package/dist/services/logger.service.js.map +1 -1
  41. package/dist/utils/pagination.utils.d.ts +2 -2
  42. package/dist/utils/pagination.utils.d.ts.map +1 -1
  43. package/dist/utils/pagination.utils.js +9 -6
  44. package/dist/utils/pagination.utils.js.map +1 -1
  45. package/dist/utils/validation.utils.d.ts.map +1 -1
  46. package/dist/utils/validation.utils.js +5 -5
  47. package/dist/utils/validation.utils.js.map +1 -1
  48. package/package.json +28 -8
@@ -1,5 +1,5 @@
1
- import mongoose, { ConnectOptions } from 'mongoose';
2
- import { MongoDatabaseConfig, MongoRepositoryOptions, Repository } from '../contracts/database.contracts';
1
+ import mongoose, { ConnectOptions, ClientSession } from "mongoose";
2
+ import { MongoDatabaseConfig, MongoRepositoryOptions, MongoTransactionContext, Repository, TransactionOptions, TransactionCallback, HealthCheckResult } from "../contracts/database.contracts";
3
3
  /**
4
4
  * MongoDB adapter for DatabaseKit.
5
5
  * Handles MongoDB connection and repository creation via Mongoose.
@@ -32,13 +32,63 @@ export declare class MongoAdapter {
32
32
  * Checks if connected to MongoDB.
33
33
  */
34
34
  isConnected(): boolean;
35
+ /**
36
+ * Performs a health check on the MongoDB connection.
37
+ * Sends a ping command to verify the database is responsive.
38
+ *
39
+ * @returns Health check result with status and response time
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * const health = await adapter.healthCheck();
44
+ * if (!health.healthy) {
45
+ * console.error('Database unhealthy:', health.error);
46
+ * }
47
+ * ```
48
+ */
49
+ healthCheck(): Promise<HealthCheckResult>;
35
50
  /**
36
51
  * Creates a repository for a Mongoose model.
37
52
  * The repository provides a standardized CRUD interface.
38
53
  *
39
54
  * @param opts - Options containing the Mongoose model
55
+ * @param session - Optional MongoDB session for transaction support
40
56
  * @returns Repository instance with CRUD methods
41
57
  */
42
- createRepository<T = unknown>(opts: MongoRepositoryOptions): Repository<T>;
58
+ createRepository<T = unknown>(opts: MongoRepositoryOptions, session?: ClientSession): Repository<T>;
59
+ /**
60
+ * Executes a callback within a MongoDB transaction.
61
+ * All database operations within the callback are atomic.
62
+ *
63
+ * **Note:** MongoDB transactions require a replica set.
64
+ * Standalone MongoDB instances do not support transactions.
65
+ *
66
+ * @param callback - Function to execute within the transaction
67
+ * @param options - Transaction options
68
+ * @returns Result of the callback function
69
+ * @throws Error if transaction fails after all retries
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const result = await mongoAdapter.withTransaction(async (ctx) => {
74
+ * const usersRepo = ctx.createRepository<User>({ model: UserModel });
75
+ * const ordersRepo = ctx.createRepository<Order>({ model: OrderModel });
76
+ *
77
+ * const user = await usersRepo.create({ name: 'John' });
78
+ * const order = await ordersRepo.create({ userId: user._id, total: 100 });
79
+ *
80
+ * return { user, order };
81
+ * });
82
+ * ```
83
+ */
84
+ withTransaction<TResult>(callback: TransactionCallback<MongoTransactionContext, TResult>, options?: TransactionOptions): Promise<TResult>;
85
+ /**
86
+ * Checks if an error is transient and can be retried.
87
+ */
88
+ private isTransientError;
89
+ /**
90
+ * Simple sleep utility for retry backoff.
91
+ */
92
+ private sleep;
43
93
  }
44
94
  //# sourceMappingURL=mongo.adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mongo.adapter.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,EAAE,EAAE,cAAc,EAAS,MAAM,UAAU,CAAC;AAE3D,OAAO,EACH,mBAAmB,EACnB,sBAAsB,EACtB,UAAU,EAGb,MAAM,iCAAiC,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,qBACa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,iBAAiB,CAAC,CAA2B;gBAEzC,MAAM,EAAE,mBAAmB;IAKvC;;;;;;OAMG;IACG,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,QAAQ,CAAC;IA0BrE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,sBAAsB,GAAG,UAAU,CAAC,CAAC,CAAC;CAwE7E"}
1
+ {"version":3,"file":"mongo.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mongo.adapter.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,EAAE,EAAE,cAAc,EAAS,aAAa,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,EAGV,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,iCAAiC,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,qBACa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,iBAAiB,CAAC,CAA2B;gBAEzC,MAAM,EAAE,mBAAmB;IAKvC;;;;;;OAMG;IACG,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,QAAQ,CAAC;IAsCrE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;;;;;;;;;OAaG;IACG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IA+C/C;;;;;;;OAOG;IACH,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAC1B,IAAI,EAAE,sBAAsB,EAC5B,OAAO,CAAC,EAAE,aAAa,GACtB,UAAU,CAAC,CAAC,CAAC;IAkWhB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,eAAe,CAAC,OAAO,EAC3B,QAAQ,EAAE,mBAAmB,CAAC,uBAAuB,EAAE,OAAO,CAAC,EAC/D,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC;IAyDnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- // src/adapters/mongo.adapter.ts
3
2
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
4
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -15,8 +14,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15
14
  var MongoAdapter_1;
16
15
  Object.defineProperty(exports, "__esModule", { value: true });
17
16
  exports.MongoAdapter = void 0;
18
- const mongoose_1 = __importDefault(require("mongoose"));
19
17
  const common_1 = require("@nestjs/common");
18
+ const mongoose_1 = __importDefault(require("mongoose"));
19
+ const database_contracts_1 = require("../contracts/database.contracts");
20
20
  /**
21
21
  * MongoDB adapter for DatabaseKit.
22
22
  * Handles MongoDB connection and repository creation via Mongoose.
@@ -32,7 +32,7 @@ let MongoAdapter = MongoAdapter_1 = class MongoAdapter {
32
32
  constructor(config) {
33
33
  this.logger = new common_1.Logger(MongoAdapter_1.name);
34
34
  this.config = config;
35
- mongoose_1.default.set('strictQuery', false);
35
+ mongoose_1.default.set("strictQuery", false);
36
36
  }
37
37
  /**
38
38
  * Establishes connection to MongoDB.
@@ -42,21 +42,32 @@ let MongoAdapter = MongoAdapter_1 = class MongoAdapter {
42
42
  * @returns Promise resolving to mongoose instance
43
43
  */
44
44
  async connect(options = {}) {
45
+ var _a, _b, _c, _d, _e;
45
46
  if (!this.connectionPromise) {
46
- this.logger.log('Connecting to MongoDB...');
47
+ this.logger.log("Connecting to MongoDB...");
48
+ // Apply pool configuration from config
49
+ const poolConfig = this.config.pool || {};
50
+ const maxPoolSize = (_a = poolConfig.max) !== null && _a !== void 0 ? _a : 10;
51
+ const minPoolSize = (_b = poolConfig.min) !== null && _b !== void 0 ? _b : 5;
52
+ const serverSelectionTimeoutMS = (_c = this.config.serverSelectionTimeoutMS) !== null && _c !== void 0 ? _c : 5000;
53
+ const socketTimeoutMS = (_d = this.config.socketTimeoutMS) !== null && _d !== void 0 ? _d : 45000;
54
+ const maxIdleTimeMS = (_e = poolConfig.idleTimeoutMs) !== null && _e !== void 0 ? _e : 30000;
47
55
  this.connectionPromise = mongoose_1.default.connect(this.config.connectionString, {
48
- maxPoolSize: 10,
49
- serverSelectionTimeoutMS: 5000,
56
+ maxPoolSize,
57
+ minPoolSize,
58
+ serverSelectionTimeoutMS,
59
+ socketTimeoutMS,
60
+ maxIdleTimeMS,
50
61
  ...options,
51
62
  });
52
- mongoose_1.default.connection.on('connected', () => {
53
- this.logger.log('Successfully connected to MongoDB');
63
+ mongoose_1.default.connection.on("connected", () => {
64
+ this.logger.log("Successfully connected to MongoDB");
54
65
  });
55
- mongoose_1.default.connection.on('error', (err) => {
56
- this.logger.error('MongoDB connection error', (err === null || err === void 0 ? void 0 : err.message) || err);
66
+ mongoose_1.default.connection.on("error", (err) => {
67
+ this.logger.error("MongoDB connection error", (err === null || err === void 0 ? void 0 : err.message) || err);
57
68
  });
58
- mongoose_1.default.connection.on('disconnected', () => {
59
- this.logger.warn('MongoDB disconnected');
69
+ mongoose_1.default.connection.on("disconnected", () => {
70
+ this.logger.warn("MongoDB disconnected");
60
71
  });
61
72
  }
62
73
  return this.connectionPromise;
@@ -67,7 +78,7 @@ let MongoAdapter = MongoAdapter_1 = class MongoAdapter {
67
78
  async disconnect() {
68
79
  await mongoose_1.default.disconnect();
69
80
  this.connectionPromise = undefined;
70
- this.logger.log('Disconnected from MongoDB');
81
+ this.logger.log("Disconnected from MongoDB");
71
82
  }
72
83
  /**
73
84
  * Checks if connected to MongoDB.
@@ -75,16 +86,98 @@ let MongoAdapter = MongoAdapter_1 = class MongoAdapter {
75
86
  isConnected() {
76
87
  return mongoose_1.default.connection.readyState === 1;
77
88
  }
89
+ /**
90
+ * Performs a health check on the MongoDB connection.
91
+ * Sends a ping command to verify the database is responsive.
92
+ *
93
+ * @returns Health check result with status and response time
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const health = await adapter.healthCheck();
98
+ * if (!health.healthy) {
99
+ * console.error('Database unhealthy:', health.error);
100
+ * }
101
+ * ```
102
+ */
103
+ async healthCheck() {
104
+ var _a;
105
+ const startTime = Date.now();
106
+ try {
107
+ if (!this.isConnected()) {
108
+ return {
109
+ healthy: false,
110
+ responseTimeMs: Date.now() - startTime,
111
+ type: "mongo",
112
+ error: "Not connected to MongoDB",
113
+ };
114
+ }
115
+ // Send ping command to verify connection
116
+ const admin = (_a = mongoose_1.default.connection.db) === null || _a === void 0 ? void 0 : _a.admin();
117
+ const pingResult = await (admin === null || admin === void 0 ? void 0 : admin.ping());
118
+ if (!(pingResult === null || pingResult === void 0 ? void 0 : pingResult.ok)) {
119
+ return {
120
+ healthy: false,
121
+ responseTimeMs: Date.now() - startTime,
122
+ type: "mongo",
123
+ error: "Ping command failed",
124
+ };
125
+ }
126
+ // Get server info for details
127
+ const serverInfo = await (admin === null || admin === void 0 ? void 0 : admin.serverInfo());
128
+ return {
129
+ healthy: true,
130
+ responseTimeMs: Date.now() - startTime,
131
+ type: "mongo",
132
+ details: {
133
+ version: serverInfo === null || serverInfo === void 0 ? void 0 : serverInfo.version,
134
+ },
135
+ };
136
+ }
137
+ catch (error) {
138
+ return {
139
+ healthy: false,
140
+ responseTimeMs: Date.now() - startTime,
141
+ type: "mongo",
142
+ error: error instanceof Error ? error.message : "Unknown error",
143
+ };
144
+ }
145
+ }
78
146
  /**
79
147
  * Creates a repository for a Mongoose model.
80
148
  * The repository provides a standardized CRUD interface.
81
149
  *
82
150
  * @param opts - Options containing the Mongoose model
151
+ * @param session - Optional MongoDB session for transaction support
83
152
  * @returns Repository instance with CRUD methods
84
153
  */
85
- createRepository(opts) {
86
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
+ createRepository(opts, session) {
155
+ var _a, _b, _c, _d, _e;
87
156
  const model = opts.model;
157
+ const softDeleteEnabled = (_a = opts.softDelete) !== null && _a !== void 0 ? _a : false;
158
+ const softDeleteField = (_b = opts.softDeleteField) !== null && _b !== void 0 ? _b : "deletedAt";
159
+ // Timestamp configuration
160
+ const timestampsEnabled = (_c = opts.timestamps) !== null && _c !== void 0 ? _c : false;
161
+ const createdAtField = (_d = opts.createdAtField) !== null && _d !== void 0 ? _d : "createdAt";
162
+ const updatedAtField = (_e = opts.updatedAtField) !== null && _e !== void 0 ? _e : "updatedAt";
163
+ // Base filter to exclude soft-deleted records
164
+ const notDeletedFilter = softDeleteEnabled
165
+ ? { [softDeleteField]: { $eq: null } }
166
+ : {};
167
+ // Helper to add createdAt timestamp
168
+ const addCreatedAt = (data) => {
169
+ if (timestampsEnabled) {
170
+ return { ...data, [createdAtField]: new Date() };
171
+ }
172
+ return data;
173
+ };
174
+ // Helper to add updatedAt timestamp
175
+ const addUpdatedAt = (data) => {
176
+ if (timestampsEnabled) {
177
+ return { ...data, [updatedAtField]: new Date() };
178
+ }
179
+ return data;
180
+ };
88
181
  const shapePage = (data, page, limit, total) => {
89
182
  const pages = Math.max(1, Math.ceil((total || 0) / (limit || 1)));
90
183
  return { data, page, limit, total, pages };
@@ -92,51 +185,341 @@ let MongoAdapter = MongoAdapter_1 = class MongoAdapter {
92
185
  const repo = {
93
186
  async create(data) {
94
187
  var _a, _b, _c;
95
- const doc = await model.create(data);
188
+ const timestampedData = addCreatedAt(data);
189
+ const doc = session
190
+ ? (await model.create([timestampedData], { session }))[0]
191
+ : await model.create(timestampedData);
96
192
  return (_c = (_b = (_a = doc).toObject) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : doc;
97
193
  },
98
194
  async findById(id) {
99
- const doc = await model.findById(id).lean().exec();
195
+ const mergedFilter = { _id: id, ...notDeletedFilter };
196
+ let query = model.findOne(mergedFilter);
197
+ if (session)
198
+ query = query.session(session);
199
+ const doc = await query.lean().exec();
100
200
  return doc;
101
201
  },
102
202
  async findAll(filter = {}) {
103
- const docs = await model.find(filter).lean().exec();
203
+ const mergedFilter = { ...filter, ...notDeletedFilter };
204
+ let query = model.find(mergedFilter);
205
+ if (session)
206
+ query = query.session(session);
207
+ const docs = await query.lean().exec();
104
208
  return docs;
105
209
  },
210
+ async findOne(filter) {
211
+ const mergedFilter = { ...filter, ...notDeletedFilter };
212
+ let query = model.findOne(mergedFilter);
213
+ if (session)
214
+ query = query.session(session);
215
+ const doc = await query.lean().exec();
216
+ return doc;
217
+ },
106
218
  async findPage(options = {}) {
107
219
  const { filter = {}, page = 1, limit = 10, sort } = options;
220
+ const mergedFilter = { ...filter, ...notDeletedFilter };
108
221
  const skip = Math.max(0, (page - 1) * limit);
109
- let query = model.find(filter).skip(skip).limit(limit);
222
+ let query = model.find(mergedFilter).skip(skip).limit(limit);
110
223
  if (sort) {
111
224
  query = query.sort(sort);
112
225
  }
226
+ if (session)
227
+ query = query.session(session);
113
228
  const [data, total] = await Promise.all([
114
229
  query.lean().exec(),
115
- model.countDocuments(filter).exec(),
230
+ session
231
+ ? model.countDocuments(mergedFilter).session(session).exec()
232
+ : model.countDocuments(mergedFilter).exec(),
116
233
  ]);
117
234
  return shapePage(data, page, limit, total);
118
235
  },
119
236
  async updateById(id, update) {
120
- const doc = await model
121
- .findByIdAndUpdate(id, update, { new: true })
122
- .lean()
123
- .exec();
237
+ const mergedFilter = { _id: id, ...notDeletedFilter };
238
+ const timestampedUpdate = addUpdatedAt(update);
239
+ let query = model.findOneAndUpdate(mergedFilter, timestampedUpdate, {
240
+ new: true,
241
+ });
242
+ if (session)
243
+ query = query.session(session);
244
+ const doc = await query.lean().exec();
124
245
  return doc;
125
246
  },
126
247
  async deleteById(id) {
127
- const res = await model.findByIdAndDelete(id).lean().exec();
248
+ // If soft delete is enabled, use softDelete instead
249
+ if (softDeleteEnabled) {
250
+ const mergedFilter = { _id: id, ...notDeletedFilter };
251
+ const options = session ? { session } : {};
252
+ const result = await model
253
+ .updateOne(mergedFilter, { [softDeleteField]: new Date() }, options)
254
+ .exec();
255
+ return result.modifiedCount > 0;
256
+ }
257
+ let query = model.findByIdAndDelete(id);
258
+ if (session)
259
+ query = query.session(session);
260
+ const res = await query.lean().exec();
128
261
  return !!res;
129
262
  },
130
263
  async count(filter = {}) {
131
- return model.countDocuments(filter).exec();
264
+ const mergedFilter = { ...filter, ...notDeletedFilter };
265
+ let query = model.countDocuments(mergedFilter);
266
+ if (session)
267
+ query = query.session(session);
268
+ return query.exec();
132
269
  },
133
270
  async exists(filter = {}) {
134
- const res = await model.exists(filter);
271
+ const mergedFilter = { ...filter, ...notDeletedFilter };
272
+ // exists() doesn't support session directly, use findOne
273
+ if (session) {
274
+ const doc = await model
275
+ .findOne(mergedFilter)
276
+ .session(session)
277
+ .select("_id")
278
+ .lean()
279
+ .exec();
280
+ return !!doc;
281
+ }
282
+ const res = await model.exists(mergedFilter);
135
283
  return !!res;
136
284
  },
285
+ // -----------------------------
286
+ // Bulk Operations
287
+ // -----------------------------
288
+ async insertMany(data) {
289
+ if (data.length === 0)
290
+ return [];
291
+ // Add createdAt timestamp to each record
292
+ const timestampedData = data.map((item) => addCreatedAt(item));
293
+ const docs = session
294
+ ? await model.insertMany(timestampedData, { session })
295
+ : await model.insertMany(timestampedData);
296
+ return docs.map((doc) => { var _a, _b, _c; return (_c = (_b = (_a = doc).toObject) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : doc; });
297
+ },
298
+ async updateMany(filter, update) {
299
+ const mergedFilter = { ...filter, ...notDeletedFilter };
300
+ const timestampedUpdate = addUpdatedAt(update);
301
+ const options = session ? { session } : {};
302
+ const result = await model
303
+ .updateMany(mergedFilter, timestampedUpdate, options)
304
+ .exec();
305
+ return result.modifiedCount;
306
+ },
307
+ async deleteMany(filter) {
308
+ const mergedFilter = { ...filter, ...notDeletedFilter };
309
+ const options = session ? { session } : {};
310
+ // If soft delete is enabled, update instead of delete
311
+ if (softDeleteEnabled) {
312
+ const result = await model
313
+ .updateMany(mergedFilter, { [softDeleteField]: new Date() }, options)
314
+ .exec();
315
+ return result.modifiedCount;
316
+ }
317
+ const result = await model.deleteMany(mergedFilter, options).exec();
318
+ return result.deletedCount;
319
+ },
320
+ // -----------------------------
321
+ // Advanced Query Operations
322
+ // -----------------------------
323
+ async upsert(filter, data) {
324
+ const mergedFilter = { ...filter, ...notDeletedFilter };
325
+ const timestampedData = timestampsEnabled
326
+ ? { ...data, [updatedAtField]: new Date() }
327
+ : data;
328
+ let query = model.findOneAndUpdate(mergedFilter, {
329
+ $set: timestampedData,
330
+ ...(timestampsEnabled
331
+ ? { $setOnInsert: { [createdAtField]: new Date() } }
332
+ : {}),
333
+ }, { upsert: true, new: true });
334
+ if (session)
335
+ query = query.session(session);
336
+ const doc = await query.lean().exec();
337
+ return doc;
338
+ },
339
+ async distinct(field, filter = {}) {
340
+ const mergedFilter = { ...filter, ...notDeletedFilter };
341
+ let query = model.distinct(String(field), mergedFilter);
342
+ if (session)
343
+ query = query.session(session);
344
+ const values = await query.exec();
345
+ return values;
346
+ },
347
+ async select(filter, fields) {
348
+ const mergedFilter = { ...filter, ...notDeletedFilter };
349
+ const projection = fields.reduce((acc, field) => ({ ...acc, [field]: 1 }), {});
350
+ let query = model.find(mergedFilter).select(projection);
351
+ if (session)
352
+ query = query.session(session);
353
+ const docs = await query.lean().exec();
354
+ return docs;
355
+ },
356
+ // -----------------------------
357
+ // Soft Delete Operations
358
+ // -----------------------------
359
+ softDelete: softDeleteEnabled
360
+ ? async (id) => {
361
+ const mergedFilter = { _id: id, ...notDeletedFilter };
362
+ const options = session ? { session } : {};
363
+ const result = await model
364
+ .updateOne(mergedFilter, { [softDeleteField]: new Date() }, options)
365
+ .exec();
366
+ return result.modifiedCount > 0;
367
+ }
368
+ : undefined,
369
+ softDeleteMany: softDeleteEnabled
370
+ ? async (filter) => {
371
+ const mergedFilter = { ...filter, ...notDeletedFilter };
372
+ const options = session ? { session } : {};
373
+ const result = await model
374
+ .updateMany(mergedFilter, { [softDeleteField]: new Date() }, options)
375
+ .exec();
376
+ return result.modifiedCount;
377
+ }
378
+ : undefined,
379
+ restore: softDeleteEnabled
380
+ ? async (id) => {
381
+ const deletedFilter = { _id: id, [softDeleteField]: { $ne: null } };
382
+ let query = model.findOneAndUpdate(deletedFilter, { $unset: { [softDeleteField]: 1 } }, { new: true });
383
+ if (session)
384
+ query = query.session(session);
385
+ const doc = await query.lean().exec();
386
+ return doc;
387
+ }
388
+ : undefined,
389
+ restoreMany: softDeleteEnabled
390
+ ? async (filter) => {
391
+ const deletedFilter = {
392
+ ...filter,
393
+ [softDeleteField]: { $ne: null },
394
+ };
395
+ const options = session ? { session } : {};
396
+ const result = await model
397
+ .updateMany(deletedFilter, { $unset: { [softDeleteField]: 1 } }, options)
398
+ .exec();
399
+ return result.modifiedCount;
400
+ }
401
+ : undefined,
402
+ findAllWithDeleted: softDeleteEnabled
403
+ ? async (filter = {}) => {
404
+ let query = model.find(filter);
405
+ if (session)
406
+ query = query.session(session);
407
+ const docs = await query.lean().exec();
408
+ return docs;
409
+ }
410
+ : undefined,
411
+ findDeleted: softDeleteEnabled
412
+ ? async (filter = {}) => {
413
+ const deletedFilter = {
414
+ ...filter,
415
+ [softDeleteField]: { $ne: null },
416
+ };
417
+ let query = model.find(deletedFilter);
418
+ if (session)
419
+ query = query.session(session);
420
+ const docs = await query.lean().exec();
421
+ return docs;
422
+ }
423
+ : undefined,
137
424
  };
138
425
  return repo;
139
426
  }
427
+ /**
428
+ * Executes a callback within a MongoDB transaction.
429
+ * All database operations within the callback are atomic.
430
+ *
431
+ * **Note:** MongoDB transactions require a replica set.
432
+ * Standalone MongoDB instances do not support transactions.
433
+ *
434
+ * @param callback - Function to execute within the transaction
435
+ * @param options - Transaction options
436
+ * @returns Result of the callback function
437
+ * @throws Error if transaction fails after all retries
438
+ *
439
+ * @example
440
+ * ```typescript
441
+ * const result = await mongoAdapter.withTransaction(async (ctx) => {
442
+ * const usersRepo = ctx.createRepository<User>({ model: UserModel });
443
+ * const ordersRepo = ctx.createRepository<Order>({ model: OrderModel });
444
+ *
445
+ * const user = await usersRepo.create({ name: 'John' });
446
+ * const order = await ordersRepo.create({ userId: user._id, total: 100 });
447
+ *
448
+ * return { user, order };
449
+ * });
450
+ * ```
451
+ */
452
+ async withTransaction(callback, options = {}) {
453
+ const { retries = 0, timeout = database_contracts_1.DATABASE_KIT_CONSTANTS.DEFAULT_TRANSACTION_TIMEOUT, } = options;
454
+ await this.connect();
455
+ let lastError;
456
+ for (let attempt = 0; attempt <= retries; attempt++) {
457
+ const session = await mongoose_1.default.startSession();
458
+ try {
459
+ session.startTransaction({
460
+ maxCommitTimeMS: timeout,
461
+ });
462
+ const context = {
463
+ transaction: session,
464
+ createRepository: (opts) => this.createRepository(opts, session),
465
+ };
466
+ const result = await callback(context);
467
+ await session.commitTransaction();
468
+ this.logger.debug(`Transaction committed successfully (attempt ${attempt + 1})`);
469
+ return result;
470
+ }
471
+ catch (error) {
472
+ await session.abortTransaction();
473
+ lastError = error;
474
+ this.logger.warn(`Transaction failed (attempt ${attempt + 1}/${retries + 1}): ${lastError.message}`);
475
+ // Check if error is transient and retryable
476
+ const isTransient = this.isTransientError(error);
477
+ if (!isTransient || attempt >= retries) {
478
+ throw lastError;
479
+ }
480
+ // Exponential backoff before retry
481
+ const backoffMs = Math.min(100 * Math.pow(2, attempt), 3000);
482
+ await this.sleep(backoffMs);
483
+ }
484
+ finally {
485
+ await session.endSession();
486
+ }
487
+ }
488
+ throw lastError || new Error("Transaction failed");
489
+ }
490
+ /**
491
+ * Checks if an error is transient and can be retried.
492
+ */
493
+ isTransientError(error) {
494
+ var _a;
495
+ if (error && typeof error === "object") {
496
+ const mongoError = error;
497
+ // MongoDB transient transaction errors
498
+ if ((_a = mongoError.hasErrorLabel) === null || _a === void 0 ? void 0 : _a.call(mongoError, "TransientTransactionError")) {
499
+ return true;
500
+ }
501
+ // Common retryable error codes
502
+ const retryableCodes = [
503
+ 11600, // InterruptedAtShutdown
504
+ 11602, // InterruptedDueToReplStateChange
505
+ 10107, // NotWritablePrimary
506
+ 13435, // NotPrimaryNoSecondaryOk
507
+ 13436, // NotPrimaryOrSecondary
508
+ 189, // PrimarySteppedDown
509
+ 91, // ShutdownInProgress
510
+ ];
511
+ if (mongoError.code && retryableCodes.includes(mongoError.code)) {
512
+ return true;
513
+ }
514
+ }
515
+ return false;
516
+ }
517
+ /**
518
+ * Simple sleep utility for retry backoff.
519
+ */
520
+ sleep(ms) {
521
+ return new Promise((resolve) => setTimeout(resolve, ms));
522
+ }
140
523
  };
141
524
  exports.MongoAdapter = MongoAdapter;
142
525
  exports.MongoAdapter = MongoAdapter = MongoAdapter_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.adapter.js","sourceRoot":"","sources":["../../src/adapters/mongo.adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mongo.adapter.js","sourceRoot":"","sources":["../../src/adapters/mongo.adapter.ts"],"names":[],"mappings":"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"}