@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.
- package/CHANGELOG.md +50 -4
- package/README.md +487 -148
- package/dist/adapters/mongo.adapter.d.ts +53 -3
- package/dist/adapters/mongo.adapter.d.ts.map +1 -1
- package/dist/adapters/mongo.adapter.js +410 -27
- package/dist/adapters/mongo.adapter.js.map +1 -1
- package/dist/adapters/postgres.adapter.d.ts +50 -3
- package/dist/adapters/postgres.adapter.d.ts.map +1 -1
- package/dist/adapters/postgres.adapter.js +439 -45
- package/dist/adapters/postgres.adapter.js.map +1 -1
- package/dist/config/database.config.d.ts +1 -1
- package/dist/config/database.config.d.ts.map +1 -1
- package/dist/config/database.config.js +13 -13
- package/dist/config/database.config.js.map +1 -1
- package/dist/config/database.constants.js +7 -7
- package/dist/contracts/database.contracts.d.ts +283 -6
- package/dist/contracts/database.contracts.d.ts.map +1 -1
- package/dist/contracts/database.contracts.js +6 -1
- package/dist/contracts/database.contracts.js.map +1 -1
- package/dist/database-kit.module.d.ts +2 -2
- package/dist/database-kit.module.d.ts.map +1 -1
- package/dist/database-kit.module.js +1 -2
- package/dist/database-kit.module.js.map +1 -1
- package/dist/filters/database-exception.filter.d.ts +1 -1
- package/dist/filters/database-exception.filter.d.ts.map +1 -1
- package/dist/filters/database-exception.filter.js +43 -43
- package/dist/filters/database-exception.filter.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/database.decorators.d.ts.map +1 -1
- package/dist/middleware/database.decorators.js.map +1 -1
- package/dist/services/database.service.d.ts +83 -5
- package/dist/services/database.service.d.ts.map +1 -1
- package/dist/services/database.service.js +136 -16
- package/dist/services/database.service.js.map +1 -1
- package/dist/services/logger.service.d.ts +1 -1
- package/dist/services/logger.service.d.ts.map +1 -1
- package/dist/services/logger.service.js +1 -1
- package/dist/services/logger.service.js.map +1 -1
- package/dist/utils/pagination.utils.d.ts +2 -2
- package/dist/utils/pagination.utils.d.ts.map +1 -1
- package/dist/utils/pagination.utils.js +9 -6
- package/dist/utils/pagination.utils.js.map +1 -1
- package/dist/utils/validation.utils.d.ts.map +1 -1
- package/dist/utils/validation.utils.js +5 -5
- package/dist/utils/validation.utils.js.map +1 -1
- package/package.json +28 -8
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import mongoose, { ConnectOptions } from
|
|
2
|
-
import { MongoDatabaseConfig, MongoRepositoryOptions, Repository } from
|
|
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":"
|
|
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(
|
|
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(
|
|
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
|
|
49
|
-
|
|
56
|
+
maxPoolSize,
|
|
57
|
+
minPoolSize,
|
|
58
|
+
serverSelectionTimeoutMS,
|
|
59
|
+
socketTimeoutMS,
|
|
60
|
+
maxIdleTimeMS,
|
|
50
61
|
...options,
|
|
51
62
|
});
|
|
52
|
-
mongoose_1.default.connection.on(
|
|
53
|
-
this.logger.log(
|
|
63
|
+
mongoose_1.default.connection.on("connected", () => {
|
|
64
|
+
this.logger.log("Successfully connected to MongoDB");
|
|
54
65
|
});
|
|
55
|
-
mongoose_1.default.connection.on(
|
|
56
|
-
this.logger.error(
|
|
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(
|
|
59
|
-
this.logger.warn(
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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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"}
|