@morojs/moro 1.0.0 → 1.0.2
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/README.md +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +183 -165
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +104 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Database Drizzle ORM Adapter
|
|
2
|
-
import { DatabaseAdapter, DatabaseTransaction } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
interface DrizzleConfig {
|
|
6
6
|
database: any; // Drizzle database instance
|
|
@@ -11,22 +11,22 @@ interface DrizzleConfig {
|
|
|
11
11
|
export class DrizzleAdapter implements DatabaseAdapter {
|
|
12
12
|
private db: any;
|
|
13
13
|
private schema: any;
|
|
14
|
-
private logger = createFrameworkLogger(
|
|
14
|
+
private logger = createFrameworkLogger('Drizzle');
|
|
15
15
|
|
|
16
16
|
constructor(config: DrizzleConfig) {
|
|
17
17
|
try {
|
|
18
18
|
if (!config.database) {
|
|
19
|
-
throw new Error(
|
|
19
|
+
throw new Error('Drizzle database instance is required');
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
this.db = config.database;
|
|
23
23
|
this.schema = config.schema;
|
|
24
24
|
|
|
25
|
-
this.logger.info(
|
|
25
|
+
this.logger.info('Drizzle ORM adapter initialized', 'Drizzle');
|
|
26
26
|
} catch (error) {
|
|
27
|
-
this.logger.error(
|
|
27
|
+
this.logger.error('Drizzle ORM initialization failed', 'Drizzle');
|
|
28
28
|
throw new Error(
|
|
29
|
-
|
|
29
|
+
'Drizzle ORM configuration error. Ensure you have a valid Drizzle database instance.'
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -34,13 +34,13 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
34
34
|
async connect(): Promise<void> {
|
|
35
35
|
// Drizzle doesn't have an explicit connect method
|
|
36
36
|
// Connection is handled by the underlying driver
|
|
37
|
-
this.logger.info(
|
|
37
|
+
this.logger.info('Drizzle ORM adapter ready', 'Connection');
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
async disconnect(): Promise<void> {
|
|
41
41
|
// Drizzle doesn't have an explicit disconnect method
|
|
42
42
|
// This would be handled by the underlying driver
|
|
43
|
-
this.logger.info(
|
|
43
|
+
this.logger.info('Drizzle ORM adapter disconnected', 'Connection');
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
// Raw SQL query support
|
|
@@ -60,7 +60,7 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
60
60
|
return [result];
|
|
61
61
|
}
|
|
62
62
|
} catch (error) {
|
|
63
|
-
this.logger.error(
|
|
63
|
+
this.logger.error('Drizzle query failed', 'Query', {
|
|
64
64
|
sql,
|
|
65
65
|
error: error instanceof Error ? error.message : String(error),
|
|
66
66
|
});
|
|
@@ -78,23 +78,20 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
78
78
|
try {
|
|
79
79
|
if (this.schema && this.schema[table]) {
|
|
80
80
|
// Use schema-based insert
|
|
81
|
-
const result = await this.db
|
|
82
|
-
.insert(this.schema[table])
|
|
83
|
-
.values(data)
|
|
84
|
-
.returning();
|
|
81
|
+
const result = await this.db.insert(this.schema[table]).values(data).returning();
|
|
85
82
|
return result[0] as T;
|
|
86
83
|
} else {
|
|
87
84
|
// Fallback to raw SQL
|
|
88
85
|
const keys = Object.keys(data);
|
|
89
86
|
const values = Object.values(data);
|
|
90
|
-
const placeholders = keys.map((_, i) => `$${i + 1}`).join(
|
|
87
|
+
const placeholders = keys.map((_, i) => `$${i + 1}`).join(', ');
|
|
91
88
|
|
|
92
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
89
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) RETURNING *`;
|
|
93
90
|
const result = await this.query<T>(sql, values);
|
|
94
91
|
return result[0];
|
|
95
92
|
}
|
|
96
93
|
} catch (error) {
|
|
97
|
-
this.logger.error(
|
|
94
|
+
this.logger.error('Drizzle insert failed', 'Insert', {
|
|
98
95
|
table,
|
|
99
96
|
error: error instanceof Error ? error.message : String(error),
|
|
100
97
|
});
|
|
@@ -105,20 +102,19 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
105
102
|
async update<T = any>(
|
|
106
103
|
table: string,
|
|
107
104
|
data: Record<string, any>,
|
|
108
|
-
where: Record<string, any
|
|
105
|
+
where: Record<string, any>
|
|
109
106
|
): Promise<T> {
|
|
110
107
|
try {
|
|
111
108
|
if (this.schema && this.schema[table]) {
|
|
112
109
|
// Use schema-based update
|
|
113
110
|
try {
|
|
114
|
-
const { eq, and } = require(
|
|
111
|
+
const { eq, and } = require('drizzle-orm');
|
|
115
112
|
|
|
116
113
|
// Build where conditions
|
|
117
114
|
const conditions = Object.entries(where).map(([key, value]) =>
|
|
118
|
-
eq(this.schema[table][key], value)
|
|
115
|
+
eq(this.schema[table][key], value)
|
|
119
116
|
);
|
|
120
|
-
const whereClause =
|
|
121
|
-
conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
117
|
+
const whereClause = conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
122
118
|
|
|
123
119
|
const result = await this.db
|
|
124
120
|
.update(this.schema[table])
|
|
@@ -131,10 +127,10 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
131
127
|
// Fallback to raw SQL if drizzle-orm is not available
|
|
132
128
|
const setClause = Object.keys(data)
|
|
133
129
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
134
|
-
.join(
|
|
130
|
+
.join(', ');
|
|
135
131
|
const whereClause = Object.keys(where)
|
|
136
132
|
.map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
|
|
137
|
-
.join(
|
|
133
|
+
.join(' AND ');
|
|
138
134
|
|
|
139
135
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
|
|
140
136
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -145,10 +141,10 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
145
141
|
// Fallback to raw SQL
|
|
146
142
|
const setClause = Object.keys(data)
|
|
147
143
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
148
|
-
.join(
|
|
144
|
+
.join(', ');
|
|
149
145
|
const whereClause = Object.keys(where)
|
|
150
146
|
.map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
|
|
151
|
-
.join(
|
|
147
|
+
.join(' AND ');
|
|
152
148
|
|
|
153
149
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
|
|
154
150
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -156,7 +152,7 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
156
152
|
return result[0];
|
|
157
153
|
}
|
|
158
154
|
} catch (error) {
|
|
159
|
-
this.logger.error(
|
|
155
|
+
this.logger.error('Drizzle update failed', 'Update', {
|
|
160
156
|
table,
|
|
161
157
|
error: error instanceof Error ? error.message : String(error),
|
|
162
158
|
});
|
|
@@ -169,29 +165,23 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
169
165
|
if (this.schema && this.schema[table]) {
|
|
170
166
|
// Use schema-based delete
|
|
171
167
|
try {
|
|
172
|
-
const { eq, and } = require(
|
|
168
|
+
const { eq, and } = require('drizzle-orm');
|
|
173
169
|
|
|
174
170
|
const conditions = Object.entries(where).map(([key, value]) =>
|
|
175
|
-
eq(this.schema[table][key], value)
|
|
171
|
+
eq(this.schema[table][key], value)
|
|
176
172
|
);
|
|
177
|
-
const whereClause =
|
|
178
|
-
conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
173
|
+
const whereClause = conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
179
174
|
|
|
180
|
-
const result = await this.db
|
|
181
|
-
.delete(this.schema[table])
|
|
182
|
-
.where(whereClause);
|
|
175
|
+
const result = await this.db.delete(this.schema[table]).where(whereClause);
|
|
183
176
|
|
|
184
177
|
return (
|
|
185
|
-
(result as any).changes ||
|
|
186
|
-
(result as any).rowCount ||
|
|
187
|
-
(result as any).affectedRows ||
|
|
188
|
-
0
|
|
178
|
+
(result as any).changes || (result as any).rowCount || (result as any).affectedRows || 0
|
|
189
179
|
);
|
|
190
180
|
} catch (importError) {
|
|
191
181
|
// Fallback to raw SQL if drizzle-orm is not available
|
|
192
182
|
const whereClause = Object.keys(where)
|
|
193
183
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
194
|
-
.join(
|
|
184
|
+
.join(' AND ');
|
|
195
185
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
196
186
|
await this.query(sql, Object.values(where));
|
|
197
187
|
return 1; // Can't determine exact count without result metadata
|
|
@@ -200,13 +190,13 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
200
190
|
// Fallback to raw SQL
|
|
201
191
|
const whereClause = Object.keys(where)
|
|
202
192
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
203
|
-
.join(
|
|
193
|
+
.join(' AND ');
|
|
204
194
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
205
195
|
await this.query(sql, Object.values(where));
|
|
206
196
|
return 1; // Can't determine exact count without result metadata
|
|
207
197
|
}
|
|
208
198
|
} catch (error) {
|
|
209
|
-
this.logger.error(
|
|
199
|
+
this.logger.error('Drizzle delete failed', 'Delete', {
|
|
210
200
|
table,
|
|
211
201
|
error: error instanceof Error ? error.message : String(error),
|
|
212
202
|
});
|
|
@@ -214,9 +204,7 @@ export class DrizzleAdapter implements DatabaseAdapter {
|
|
|
214
204
|
}
|
|
215
205
|
}
|
|
216
206
|
|
|
217
|
-
async transaction<T>(
|
|
218
|
-
callback: (tx: DatabaseTransaction) => Promise<T>,
|
|
219
|
-
): Promise<T> {
|
|
207
|
+
async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
|
|
220
208
|
return await this.db.transaction(async (tx: any) => {
|
|
221
209
|
const transaction = new DrizzleTransaction(tx, this.schema, this.logger);
|
|
222
210
|
return await callback(transaction);
|
|
@@ -274,7 +262,7 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
274
262
|
constructor(
|
|
275
263
|
private tx: any,
|
|
276
264
|
private schema: any,
|
|
277
|
-
private logger: any
|
|
265
|
+
private logger: any
|
|
278
266
|
) {}
|
|
279
267
|
|
|
280
268
|
async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
|
|
@@ -291,7 +279,7 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
291
279
|
return [result];
|
|
292
280
|
}
|
|
293
281
|
} catch (error) {
|
|
294
|
-
this.logger.error(
|
|
282
|
+
this.logger.error('Drizzle transaction query failed', 'Query', {
|
|
295
283
|
sql,
|
|
296
284
|
error: error instanceof Error ? error.message : String(error),
|
|
297
285
|
});
|
|
@@ -306,17 +294,14 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
306
294
|
|
|
307
295
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
308
296
|
if (this.schema && this.schema[table]) {
|
|
309
|
-
const result = await this.tx
|
|
310
|
-
.insert(this.schema[table])
|
|
311
|
-
.values(data)
|
|
312
|
-
.returning();
|
|
297
|
+
const result = await this.tx.insert(this.schema[table]).values(data).returning();
|
|
313
298
|
return result[0] as T;
|
|
314
299
|
} else {
|
|
315
300
|
const keys = Object.keys(data);
|
|
316
301
|
const values = Object.values(data);
|
|
317
|
-
const placeholders = keys.map((_, i) => `$${i + 1}`).join(
|
|
302
|
+
const placeholders = keys.map((_, i) => `$${i + 1}`).join(', ');
|
|
318
303
|
|
|
319
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
304
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) RETURNING *`;
|
|
320
305
|
const result = await this.query<T>(sql, values);
|
|
321
306
|
return result[0];
|
|
322
307
|
}
|
|
@@ -325,17 +310,16 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
325
310
|
async update<T = any>(
|
|
326
311
|
table: string,
|
|
327
312
|
data: Record<string, any>,
|
|
328
|
-
where: Record<string, any
|
|
313
|
+
where: Record<string, any>
|
|
329
314
|
): Promise<T> {
|
|
330
315
|
if (this.schema && this.schema[table]) {
|
|
331
316
|
try {
|
|
332
|
-
const { eq, and } = require(
|
|
317
|
+
const { eq, and } = require('drizzle-orm');
|
|
333
318
|
|
|
334
319
|
const conditions = Object.entries(where).map(([key, value]) =>
|
|
335
|
-
eq(this.schema[table][key], value)
|
|
320
|
+
eq(this.schema[table][key], value)
|
|
336
321
|
);
|
|
337
|
-
const whereClause =
|
|
338
|
-
conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
322
|
+
const whereClause = conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
339
323
|
|
|
340
324
|
const result = await this.tx
|
|
341
325
|
.update(this.schema[table])
|
|
@@ -348,10 +332,10 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
348
332
|
// Fallback to raw SQL
|
|
349
333
|
const setClause = Object.keys(data)
|
|
350
334
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
351
|
-
.join(
|
|
335
|
+
.join(', ');
|
|
352
336
|
const whereClause = Object.keys(where)
|
|
353
337
|
.map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
|
|
354
|
-
.join(
|
|
338
|
+
.join(' AND ');
|
|
355
339
|
|
|
356
340
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
|
|
357
341
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -361,10 +345,10 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
361
345
|
} else {
|
|
362
346
|
const setClause = Object.keys(data)
|
|
363
347
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
364
|
-
.join(
|
|
348
|
+
.join(', ');
|
|
365
349
|
const whereClause = Object.keys(where)
|
|
366
350
|
.map((key, i) => `${key} = $${Object.keys(data).length + i + 1}`)
|
|
367
|
-
.join(
|
|
351
|
+
.join(' AND ');
|
|
368
352
|
|
|
369
353
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
|
|
370
354
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -376,29 +360,23 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
376
360
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
377
361
|
if (this.schema && this.schema[table]) {
|
|
378
362
|
try {
|
|
379
|
-
const { eq, and } = require(
|
|
363
|
+
const { eq, and } = require('drizzle-orm');
|
|
380
364
|
|
|
381
365
|
const conditions = Object.entries(where).map(([key, value]) =>
|
|
382
|
-
eq(this.schema[table][key], value)
|
|
366
|
+
eq(this.schema[table][key], value)
|
|
383
367
|
);
|
|
384
|
-
const whereClause =
|
|
385
|
-
conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
368
|
+
const whereClause = conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
386
369
|
|
|
387
|
-
const result = await this.tx
|
|
388
|
-
.delete(this.schema[table])
|
|
389
|
-
.where(whereClause);
|
|
370
|
+
const result = await this.tx.delete(this.schema[table]).where(whereClause);
|
|
390
371
|
|
|
391
372
|
return (
|
|
392
|
-
(result as any).changes ||
|
|
393
|
-
(result as any).rowCount ||
|
|
394
|
-
(result as any).affectedRows ||
|
|
395
|
-
0
|
|
373
|
+
(result as any).changes || (result as any).rowCount || (result as any).affectedRows || 0
|
|
396
374
|
);
|
|
397
375
|
} catch (importError) {
|
|
398
376
|
// Fallback to raw SQL
|
|
399
377
|
const whereClause = Object.keys(where)
|
|
400
378
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
401
|
-
.join(
|
|
379
|
+
.join(' AND ');
|
|
402
380
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
403
381
|
await this.query(sql, Object.values(where));
|
|
404
382
|
return 1; // Can't determine exact count
|
|
@@ -406,7 +384,7 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
406
384
|
} else {
|
|
407
385
|
const whereClause = Object.keys(where)
|
|
408
386
|
.map((key, i) => `${key} = $${i + 1}`)
|
|
409
|
-
.join(
|
|
387
|
+
.join(' AND ');
|
|
410
388
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
411
389
|
await this.query(sql, Object.values(where));
|
|
412
390
|
return 1; // Can't determine exact count
|
|
@@ -420,6 +398,6 @@ class DrizzleTransaction implements DatabaseTransaction {
|
|
|
420
398
|
|
|
421
399
|
async rollback(): Promise<void> {
|
|
422
400
|
// Drizzle transactions will auto-rollback on error
|
|
423
|
-
throw new Error(
|
|
401
|
+
throw new Error('Transaction rollback');
|
|
424
402
|
}
|
|
425
403
|
}
|
|
@@ -1,45 +1,42 @@
|
|
|
1
1
|
// Database Adapters
|
|
2
|
-
export { MySQLAdapter } from
|
|
3
|
-
export { PostgreSQLAdapter } from
|
|
4
|
-
export { SQLiteAdapter } from
|
|
5
|
-
export { MongoDBAdapter } from
|
|
6
|
-
export { RedisAdapter } from
|
|
7
|
-
export { DrizzleAdapter } from
|
|
2
|
+
export { MySQLAdapter } from './mysql';
|
|
3
|
+
export { PostgreSQLAdapter } from './postgresql';
|
|
4
|
+
export { SQLiteAdapter } from './sqlite';
|
|
5
|
+
export { MongoDBAdapter } from './mongodb';
|
|
6
|
+
export { RedisAdapter } from './redis';
|
|
7
|
+
export { DrizzleAdapter } from './drizzle';
|
|
8
8
|
|
|
9
|
-
import { MySQLAdapter } from
|
|
10
|
-
import { PostgreSQLAdapter } from
|
|
11
|
-
import { SQLiteAdapter } from
|
|
12
|
-
import { MongoDBAdapter } from
|
|
13
|
-
import { RedisAdapter } from
|
|
14
|
-
import { DrizzleAdapter } from
|
|
15
|
-
import { DatabaseAdapter } from
|
|
9
|
+
import { MySQLAdapter } from './mysql';
|
|
10
|
+
import { PostgreSQLAdapter } from './postgresql';
|
|
11
|
+
import { SQLiteAdapter } from './sqlite';
|
|
12
|
+
import { MongoDBAdapter } from './mongodb';
|
|
13
|
+
import { RedisAdapter } from './redis';
|
|
14
|
+
import { DrizzleAdapter } from './drizzle';
|
|
15
|
+
import { DatabaseAdapter } from '../../../types/database';
|
|
16
16
|
|
|
17
17
|
// Adapter factory function for auto-loading
|
|
18
|
-
export function createDatabaseAdapter(
|
|
19
|
-
type: string,
|
|
20
|
-
options: any = {},
|
|
21
|
-
): DatabaseAdapter {
|
|
18
|
+
export function createDatabaseAdapter(type: string, options: any = {}): DatabaseAdapter {
|
|
22
19
|
switch (type.toLowerCase()) {
|
|
23
|
-
case
|
|
20
|
+
case 'mysql':
|
|
24
21
|
return new MySQLAdapter(options);
|
|
25
|
-
case
|
|
26
|
-
case
|
|
27
|
-
case
|
|
22
|
+
case 'postgresql':
|
|
23
|
+
case 'postgres':
|
|
24
|
+
case 'pg':
|
|
28
25
|
return new PostgreSQLAdapter(options);
|
|
29
|
-
case
|
|
30
|
-
case
|
|
26
|
+
case 'sqlite':
|
|
27
|
+
case 'sqlite3':
|
|
31
28
|
return new SQLiteAdapter(options);
|
|
32
|
-
case
|
|
33
|
-
case
|
|
29
|
+
case 'mongodb':
|
|
30
|
+
case 'mongo':
|
|
34
31
|
return new MongoDBAdapter(options);
|
|
35
|
-
case
|
|
32
|
+
case 'redis':
|
|
36
33
|
return new RedisAdapter(options);
|
|
37
|
-
case
|
|
38
|
-
case
|
|
34
|
+
case 'drizzle':
|
|
35
|
+
case 'orm':
|
|
39
36
|
return new DrizzleAdapter(options);
|
|
40
37
|
default:
|
|
41
38
|
throw new Error(
|
|
42
|
-
`Unknown database adapter type: ${type}. Available types: mysql, postgresql, sqlite, mongodb, redis, drizzle
|
|
39
|
+
`Unknown database adapter type: ${type}. Available types: mysql, postgresql, sqlite, mongodb, redis, drizzle`
|
|
43
40
|
);
|
|
44
41
|
}
|
|
45
42
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Database MongoDB Adapter
|
|
2
|
-
import { DatabaseAdapter, DatabaseTransaction } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
interface MongoDBConfig {
|
|
6
6
|
url?: string;
|
|
@@ -24,11 +24,11 @@ interface MongoDocument {
|
|
|
24
24
|
export class MongoDBAdapter implements DatabaseAdapter {
|
|
25
25
|
private client: any;
|
|
26
26
|
private db: any;
|
|
27
|
-
private logger = createFrameworkLogger(
|
|
27
|
+
private logger = createFrameworkLogger('MongoDB');
|
|
28
28
|
|
|
29
29
|
constructor(config: MongoDBConfig) {
|
|
30
30
|
try {
|
|
31
|
-
const { MongoClient } = require(
|
|
31
|
+
const { MongoClient } = require('mongodb');
|
|
32
32
|
|
|
33
33
|
const url = config.url || this.buildConnectionString(config);
|
|
34
34
|
|
|
@@ -38,37 +38,32 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
38
38
|
ssl: config.ssl || false,
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
this.db = this.client.db(config.database ||
|
|
41
|
+
this.db = this.client.db(config.database || 'moro_app');
|
|
42
42
|
|
|
43
|
-
this.logger.info(
|
|
43
|
+
this.logger.info('MongoDB adapter initialized', 'MongoDB');
|
|
44
44
|
} catch (error) {
|
|
45
45
|
throw new Error(
|
|
46
|
-
|
|
46
|
+
'mongodb package is required for MongoDB adapter. Install it with: npm install mongodb'
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
private buildConnectionString(config: MongoDBConfig): string {
|
|
52
|
-
const host = config.host ||
|
|
52
|
+
const host = config.host || 'localhost';
|
|
53
53
|
const port = config.port || 27017;
|
|
54
|
-
const auth =
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const authSource = config.authSource
|
|
59
|
-
? `?authSource=${config.authSource}`
|
|
60
|
-
: "";
|
|
61
|
-
|
|
62
|
-
return `mongodb://${auth}${host}:${port}/${config.database || "moro_app"}${authSource}`;
|
|
54
|
+
const auth = config.username && config.password ? `${config.username}:${config.password}@` : '';
|
|
55
|
+
const authSource = config.authSource ? `?authSource=${config.authSource}` : '';
|
|
56
|
+
|
|
57
|
+
return `mongodb://${auth}${host}:${port}/${config.database || 'moro_app'}${authSource}`;
|
|
63
58
|
}
|
|
64
59
|
|
|
65
60
|
async connect(): Promise<void> {
|
|
66
61
|
try {
|
|
67
62
|
await this.client.connect();
|
|
68
|
-
await this.client.db(
|
|
69
|
-
this.logger.info(
|
|
63
|
+
await this.client.db('admin').command({ ping: 1 });
|
|
64
|
+
this.logger.info('MongoDB connection established', 'Connection');
|
|
70
65
|
} catch (error) {
|
|
71
|
-
this.logger.error(
|
|
66
|
+
this.logger.error('MongoDB connection failed', 'Connection', {
|
|
72
67
|
error: error instanceof Error ? error.message : String(error),
|
|
73
68
|
});
|
|
74
69
|
throw error;
|
|
@@ -98,7 +93,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
98
93
|
return await cursor.toArray();
|
|
99
94
|
}
|
|
100
95
|
} catch (error) {
|
|
101
|
-
this.logger.error(
|
|
96
|
+
this.logger.error('MongoDB query failed', 'Query', {
|
|
102
97
|
collection,
|
|
103
98
|
error: error instanceof Error ? error.message : String(error),
|
|
104
99
|
});
|
|
@@ -111,7 +106,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
111
106
|
const coll = this.db.collection(collection);
|
|
112
107
|
return await coll.findOne(query || {});
|
|
113
108
|
} catch (error) {
|
|
114
|
-
this.logger.error(
|
|
109
|
+
this.logger.error('MongoDB queryOne failed', 'Query', {
|
|
115
110
|
collection,
|
|
116
111
|
error: error instanceof Error ? error.message : String(error),
|
|
117
112
|
});
|
|
@@ -119,10 +114,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
119
114
|
}
|
|
120
115
|
}
|
|
121
116
|
|
|
122
|
-
async insert<T = any>(
|
|
123
|
-
collection: string,
|
|
124
|
-
data: Record<string, any>,
|
|
125
|
-
): Promise<T> {
|
|
117
|
+
async insert<T = any>(collection: string, data: Record<string, any>): Promise<T> {
|
|
126
118
|
try {
|
|
127
119
|
const coll = this.db.collection(collection);
|
|
128
120
|
const result = await coll.insertOne(data);
|
|
@@ -130,7 +122,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
130
122
|
// Return the inserted document with _id
|
|
131
123
|
return { ...data, _id: result.insertedId } as T;
|
|
132
124
|
} catch (error) {
|
|
133
|
-
this.logger.error(
|
|
125
|
+
this.logger.error('MongoDB insert failed', 'Insert', {
|
|
134
126
|
collection,
|
|
135
127
|
error: error instanceof Error ? error.message : String(error),
|
|
136
128
|
});
|
|
@@ -141,19 +133,19 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
141
133
|
async update<T = any>(
|
|
142
134
|
collection: string,
|
|
143
135
|
data: Record<string, any>,
|
|
144
|
-
where: Record<string, any
|
|
136
|
+
where: Record<string, any>
|
|
145
137
|
): Promise<T> {
|
|
146
138
|
try {
|
|
147
139
|
const coll = this.db.collection(collection);
|
|
148
140
|
const result = await coll.findOneAndUpdate(
|
|
149
141
|
where,
|
|
150
142
|
{ $set: data },
|
|
151
|
-
{ returnDocument:
|
|
143
|
+
{ returnDocument: 'after' }
|
|
152
144
|
);
|
|
153
145
|
|
|
154
146
|
return result.value as T;
|
|
155
147
|
} catch (error) {
|
|
156
|
-
this.logger.error(
|
|
148
|
+
this.logger.error('MongoDB update failed', 'Update', {
|
|
157
149
|
collection,
|
|
158
150
|
error: error instanceof Error ? error.message : String(error),
|
|
159
151
|
});
|
|
@@ -161,16 +153,13 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
161
153
|
}
|
|
162
154
|
}
|
|
163
155
|
|
|
164
|
-
async delete(
|
|
165
|
-
collection: string,
|
|
166
|
-
where: Record<string, any>,
|
|
167
|
-
): Promise<number> {
|
|
156
|
+
async delete(collection: string, where: Record<string, any>): Promise<number> {
|
|
168
157
|
try {
|
|
169
158
|
const coll = this.db.collection(collection);
|
|
170
159
|
const result = await coll.deleteMany(where);
|
|
171
160
|
return result.deletedCount || 0;
|
|
172
161
|
} catch (error) {
|
|
173
|
-
this.logger.error(
|
|
162
|
+
this.logger.error('MongoDB delete failed', 'Delete', {
|
|
174
163
|
collection,
|
|
175
164
|
error: error instanceof Error ? error.message : String(error),
|
|
176
165
|
});
|
|
@@ -178,9 +167,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
178
167
|
}
|
|
179
168
|
}
|
|
180
169
|
|
|
181
|
-
async transaction<T>(
|
|
182
|
-
callback: (tx: DatabaseTransaction) => Promise<T>,
|
|
183
|
-
): Promise<T> {
|
|
170
|
+
async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
|
|
184
171
|
const session = this.client.startSession();
|
|
185
172
|
|
|
186
173
|
try {
|
|
@@ -200,11 +187,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
200
187
|
return await cursor.toArray();
|
|
201
188
|
}
|
|
202
189
|
|
|
203
|
-
async createIndex(
|
|
204
|
-
collection: string,
|
|
205
|
-
index: any,
|
|
206
|
-
options?: any,
|
|
207
|
-
): Promise<string> {
|
|
190
|
+
async createIndex(collection: string, index: any, options?: any): Promise<string> {
|
|
208
191
|
const coll = this.db.collection(collection);
|
|
209
192
|
return await coll.createIndex(index, options);
|
|
210
193
|
}
|
|
@@ -227,7 +210,7 @@ export class MongoDBAdapter implements DatabaseAdapter {
|
|
|
227
210
|
class MongoDBTransaction implements DatabaseTransaction {
|
|
228
211
|
constructor(
|
|
229
212
|
private db: any,
|
|
230
|
-
private session: any
|
|
213
|
+
private session: any
|
|
231
214
|
) {}
|
|
232
215
|
|
|
233
216
|
async query<T = any>(collection: string, pipeline?: any[]): Promise<T[]> {
|
|
@@ -250,10 +233,7 @@ class MongoDBTransaction implements DatabaseTransaction {
|
|
|
250
233
|
return await coll.findOne(query || {}, { session: this.session });
|
|
251
234
|
}
|
|
252
235
|
|
|
253
|
-
async insert<T = any>(
|
|
254
|
-
collection: string,
|
|
255
|
-
data: Record<string, any>,
|
|
256
|
-
): Promise<T> {
|
|
236
|
+
async insert<T = any>(collection: string, data: Record<string, any>): Promise<T> {
|
|
257
237
|
const coll = this.db.collection(collection);
|
|
258
238
|
const result = await coll.insertOne(data, { session: this.session });
|
|
259
239
|
return { ...data, _id: result.insertedId } as T;
|
|
@@ -262,21 +242,18 @@ class MongoDBTransaction implements DatabaseTransaction {
|
|
|
262
242
|
async update<T = any>(
|
|
263
243
|
collection: string,
|
|
264
244
|
data: Record<string, any>,
|
|
265
|
-
where: Record<string, any
|
|
245
|
+
where: Record<string, any>
|
|
266
246
|
): Promise<T> {
|
|
267
247
|
const coll = this.db.collection(collection);
|
|
268
248
|
const result = await coll.findOneAndUpdate(
|
|
269
249
|
where,
|
|
270
250
|
{ $set: data },
|
|
271
|
-
{ returnDocument:
|
|
251
|
+
{ returnDocument: 'after', session: this.session }
|
|
272
252
|
);
|
|
273
253
|
return result.value as T;
|
|
274
254
|
}
|
|
275
255
|
|
|
276
|
-
async delete(
|
|
277
|
-
collection: string,
|
|
278
|
-
where: Record<string, any>,
|
|
279
|
-
): Promise<number> {
|
|
256
|
+
async delete(collection: string, where: Record<string, any>): Promise<number> {
|
|
280
257
|
const coll = this.db.collection(collection);
|
|
281
258
|
const result = await coll.deleteMany(where, { session: this.session });
|
|
282
259
|
return result.deletedCount || 0;
|